8.х ОБМЕН Изменение в скорости записи справочника при загрузке из текстового файла

Тема в разделе "Обмен данными в "1С:Предприятие 8"", создана пользователем Dikiy, 14 июл 2010.

  1. TopicStarter Overlay
    Dikiy
    Offline

    Dikiy

    Регистрация:
    14 июл 2010
    Сообщения:
    2
    Симпатии:
    0
    Баллы:
    1
    Может кто ставкивался, загружаю два справочника: Контрагенты и ДоговорыКонтрагентов из двух текстовых файла. Прохожу по строкам в файле и записываю эл-ты справочника. в Контрагенты записываю Код,Наименование,ИНН,ПолнНаименование, а в Договоры - Код,НАименование, Владелец, Валюта.
    Проблема в том что когда записываю договоры (их около 30тыс) время записи увеличивается в прогрессии, вначале за 3сек записывается 120 эл-ов, а под конец за 10сек запис. 1 эл-т
    При записи Контрагентов такой ситуации не возникает (их около 17 тыс), запись элементов стабильна высока как в начале, так и в конце.
    Самое интересное что 96% времени занимает метод СпрНовЭл.Записать();
  2. Andy13
    Offline

    Andy13 Опытный в 1С

    Регистрация:
    1 мар 2010
    Сообщения:
    244
    Симпатии:
    2
    Баллы:
    29
    Старая песня, связанная с освобождением памяти. СпрНовЭл - насколько я понимаю, создается как объект каждый раз. Попробуй использовать однажды созданный объект многократно. Перепозиционируй. В 7.7 помнится такая мера помогла кардинально. В 8-ке не знаю, т.к. уже на автомате это всё повторяю, не с чем сравнивать.
  3. TopicStarter Overlay
    Dikiy
    Offline

    Dikiy

    Регистрация:
    14 июл 2010
    Сообщения:
    2
    Симпатии:
    0
    Баллы:
    1
    вот код

    Код:
    Процедура РегламентноеОбновлениеСправочников(Имя, СтруктураРеквизитов) Экспорт
    
    ИмяФайла = "OUT\"+Имя+"PaymentApp.txt";
    Путь = ПолучитьКаталогОбмена() + ИмяФайла;
    
    ТХТФайл = НайтиФайлы(Путь);
    Если ТХТФайл.Количество() = 0 Тогда
    Возврат;
    КонецЕсли;
    ТХТФайл = "";
    
    ТХТ = Новый ТекстовыйДокумент;
    ТХТ.Прочитать(Путь, КодировкаТекста.Системная);
    
    Попытка
    Спр = Справочники[Имя];
    Исключение
    ЗаписатьОшибкуВЖурналРегистрации(ОписаниеОшибки());
    Возврат;
    КонецПопытки;
    
    СтруктураЗаписи = Новый Структура;
    ЕстьГруппы = СтруктураРеквизитов.Свойство("ЭтоГруппа");
    ЕстьВладелец = СтруктураРеквизитов.Свойство("Владелец");
    
    НачатьТранзакцию();
    
    сч = 0; Запись = Ложь;
    ДЛя НомСтр = 1 По ТХТ.КоличествоСтрок() Цикл
    Стр = ТХТ.ПолучитьСтроку(Номстр);
    Если НомСтр % 200 = 0 и Запись Тогда
    ЗафиксироватьТранзакцию();
    
    НачатьТранзакцию();
    Запись = Ложь;
    КонецЕсли;
    ОбработкаПрерыванияПользователя();
    
    Стр = СтрЗаменить(Стр, """,""", """№!?""");
    ЗначенияСтроки = ИзСтрокиСРазделителями(Стр, "№!?");
    Если ЗначенияСтроки = Неопределено Тогда
    ЗаписатьОшибкуВЖурналРегистрации("Ошибка. Зацикливание строки. Неверный формат Файла "+Имя+" стр:"+НомСтр);
    Возврат;
    КонецЕсли;
    Если ЗначенияСтроки.Количество() < СтруктураРеквизитов.Количество() Тогда
    ЗаписатьОшибкуВЖурналРегистрации("Ошибка. Неверная структура колонок файла "+Имя+" стр:"+НомСтр);
    Возврат;
    КонецЕсли;
    
    Индекс = 0;
    Для Каждого Реквизит Из СтруктураРеквизитов Цикл
    Значение = ПреобразованиеТипов(ЗначенияСтроки[Индекс], Реквизит.Значение);
    Если Значение = Неопределено Тогда
    ЗаписатьОшибкуВЖурналРегистрации("Нет соответствия Типов в "+Имя+" стр:"+НомСтр);
    Возврат;
    КонецЕсли;
    СтруктураЗаписи.Вставить(Реквизит.Ключ, Значение);
    Индекс = Индекс + 1;
    КонецЦикла;
    
    Если ЕстьВладелец Тогда
    Если ЗначениеЗаполнено(СтруктураЗаписи.Владелец) Тогда
    ЭлНайден = Спр.НайтиПоКоду(СтруктураЗаписи.Код, , , СтруктураЗаписи.Владелец);
    Иначе
    ЭлНайден = Неопределено;
    КонецЕсли;
    Иначе
    Если ЕстьГруппы Тогда
    ЭлНайден = Спр.НайтиПоКоду(СтруктураЗаписи.Код, , СтруктураЗаписи.Родитель);
    Иначе
    ЭлНайден = Спр.НайтиПоКоду(СтруктураЗаписи.Код);
    КонецЕсли;
    КонецЕсли;
    Если (ЭлНайден = Неопределено)или(не ЭлНайден.Пустая()) Тогда
    Сообщить("найден "+НомСтр+" "+Имя);
    Иначе
    Если ЕстьГруппы и СтруктураЗаписи.ЭтоГруппа Тогда
    НовЭлСпр = Спр.СоздатьГруппу();
    ЗаполнитьЗначенияСвойств(НовЭлСпр, СтруктураЗаписи, "Код, Наименование, Родитель");
    Иначе
    НовЭлСпр = Спр.СоздатьЭлемент();
    ЗаполнитьЗначенияСвойств(НовЭлСпр, СтруктураЗаписи);
    КонецЕсли;
    НовЭлСпр.Записать(); Запись = истина;
    Сообщить(""+НомСтр+" "+имя);
    КонецЕсли;
    
    КонецЦикла;
    
    //Сообщить(Имя+"/"+НомСтр);
    ЗафиксироватьТранзакцию();
    
    КонецПроцедуры
    
    Процедура ЗагрузкаСправочниковИзФинСистемы() Экспорт
    
    
    СтруктураРеквизитов = Новый Структура;
    СтруктураРеквизитов.Вставить("ЭтоГруппа",		"Булево");
    СтруктураРеквизитов.Вставить("Код", 			"Строка");
    СтруктураРеквизитов.Вставить("Наименование",	"Строка");
    СтруктураРеквизитов.Вставить("Родитель", 		"Справочник.Контрагенты");
    СтруктураРеквизитов.Вставить("ИНН", 			"Строка");
    СтруктураРеквизитов.Вставить("ПолнНаименование","Строка");
    РегламентноеОбновлениеСправочников("Контрагенты", СтруктураРеквизитов);
    
    СтруктураРеквизитов = Новый Структура;
    СтруктураРеквизитов.Вставить("Код", 			"Строка");
    СтруктураРеквизитов.Вставить("Наименование",	"Строка");
    СтруктураРеквизитов.Вставить("ВалютаВзаиморасчетов","Справочник.Валюты");
    СтруктураРеквизитов.Вставить("Владелец", 		"Справочник.Контрагенты");
    РегламентноеОбновлениеСправочников("ДоговорыКонтрагентов", СтруктураРеквизитов);
    конецпроцедуры
    [code\]

Поделиться этой страницей