:: Вопросы по 1С
Скорость загрузки данных в 1С
ry
Автор

Сообщений: 2115
Дата регистрации: 24.09.2007
Навыки работы с 1С отсутствуют напрочь, но иногда деваться некуда, и требуется сделать что-то своими руками. Попробовал самостоятельно набросать обработку, которая загружает из двух фокспрошных dbf данные о нормах расхода материалов в справочники. В 1С есть заполненный справочник изделий с уникальным полем "Код", заполненный справочник основных материалов с полем для связи "КодСвязи" и пустой справочник норм расхода, подчиненный справочнику "Изделия". Таблицы для загрузки почти все время открыты в другой программе, поэтому решил не использовать объект xbase. За сутки ковыряния мануала и интернета наваял следующий код:

Часть текста скрыта
Процедура Загрузить()
СпрНорм = СоздатьОбъект("Справочник.НормыРасходов");
СпрМат = СоздатьОбъект("Справочник.ОсновныеМатериалы");
СпрИзд = СоздатьОбъект("Справочник.Изделия");
ADO = CreateObject("ADODB.Connection");
Base= CreateObject("ADODB.Recordset");
// СтрокаПодключения="Driver={Microsoft dBASE Driver (*.dbf)};DriverID=277;DBQ="+СокрЛП(ПутьКБазе)+";Exclusive=No;DELETED=YES;BACKGROUNDFETCH=NO;";
// СтрокаПодключения="Driver={Microsoft Visual FoxPro Driver};SourceType=DBF;SourceDB="+СокрЛП(ПутьКБазе)+";Exclusive=No;DELETED=YES;BACKGROUNDFETCH=NO;";
СтрокаПодключения="Provider=vfpoledb;Data Source="+СокрЛП(ПутьКБазе)+";";
ADO.ConnectionString=СтрокаПодключения;
Сообщить(ADO.ConnectionString);
ADO.Open();
Base.Open("SELECT CODE, MAT_ID, STR(NORMA,12,5) AS NORMA FROM "+СокрЛП(ПутьКБазе)+"GOOD.DBF, "+СокрЛП(ПутьКБазе)+"NORMA.DBF WHERE NORMA.GOOD_ID=GOOD.GOOD_ID AND CODE<>"""" ORDER BY CODE;",ADO);
Пока Base.EOF()=0 Цикл
// Сообщить(Base.Fields("code").Value);
Если СпрИзд.НайтиПоКоду(Base.Fields("code").Value) = 1 Тогда
// Сообщить("Обработка изделия: "+СпрИзд.Код+"_"+СпрИзд.Наименование);
СпрНорм.ИспользоватьВладельца(СпрИзд.ТекущийЭлемент());
СпрНорм.ПорядокКодов();
СпрНорм.ВыбратьЭлементы(1);
ЕстьНорма=0;
Пока СпрНорм.ПолучитьЭлемент()=1 Цикл
Если (СпрНорм.ВидЭлемента=1) Тогда
Если СпрМат.НайтиПоРеквизиту("КодСвязи",Base.Fields("mat_id").Value,0)=1 Тогда
Если СпрМат.ТекущийЭлемент()=СпрНорм.Элемент Тогда
// Сообщить("Нормы на материал "+СпрМат.Наименование+" уже есть, обновляем.");
ЕстьНорма=1;
СпрНорм.Норма.Установить(Дата(Год,Месяц,1),Число(Base.Fields("norma").Value));
СпрНорм.Записать();
Прервать; //нашли основной материал в нормах, выйти из цикла
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЦикла;
Если ЕстьНорма=0 Тогда
// Сообщить("Нормы на материал "+СпрМат.Наименование+" отсутствуют, добавляем.");
Если СпрМат.НайтиПоРеквизиту("КодСвязи",Base.Fields("mat_id").Value,0) = 1 Тогда
СпрНорм.ИспользоватьВладельца(СпрИзд.ТекущийЭлемент());
СпрНорм.Новый();
СпрНорм.ВидЭлемента=1;
НазначитьВид(СпрНорм.Элемент, "ОсновныеМатериалы");
СпрНорм.Элемент=СпрМат.ТекущийЭлемент();
СпрНорм.Записать();
СпрНорм.Норма.Установить(Дата(Год,Месяц,1),Число(Base.Fields("norma").Value));
СпрНорм.Наименование="ОсновнойМатериал, " + СпрНорм.Элемент;
СпрНорм.Записать();
КонецЕсли;
КонецЕсли;
КонецЕсли; //изделие
Base.MoveNext();
КонецЦикла;
Base.Close();
ADO.Close();
Сообщить("Загрузка норм завершена");
КонецПроцедуры


Загрузка осуществляется, но ужасно медленно: примерно 500000 записей загружаются больше трех часов (до минут не замерял). А загружать надо 1-2 раза в месяц. Можно ли как-то ускорить процесс, пошаманив над кодом? Понимаю, что код страшный, поэтому можно смело пинать ногами в нужном направлении. 1С 7.7 без SQL-сервера, загрузка ведется из-под терминала, таблицы лежат локально на сервере.
Ratings: 0 negative/0 positive
Re: Скорость загрузки данных в 1С
ry
Автор

Сообщений: 2115
Дата регистрации: 24.09.2007
Оказывается, в 1С 7.7 без SQL чуть ли не единственным способом значительного ускорения записи данных в справочники является обработка большого количества записей в пределах одной транзакции. Цитата с одного форума:
Цитата:
ускорение записи при использовании транзакций - это баг 7.7, ставший фичей
Подобрав опытным путем количество записей в одной транзакции, получил ускорение работы до 18 минут вместо примерно 4 часов (это при том, что добавил еще цикл поиска и обнуления удаленных из источника загрузки норм).
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 2 (Гостей: 2)

© 2000-2024 Fox Club 
Яндекс.Метрика