Ускорение загрузки большой таблицы в 1С

Гружу большую CSV-таблицу в 1С. Но происходит это медленно. К тому же через удаленное приложение и иногда оно завершается по тайм-ауту. Приходится стартовать заново.

Сделал небольшое усовершенствование — перед записью считываю менеджер регистра, если данные не поменялись, то запись не записываю повторно. Ну и добавил режим транзакции, в нем 1С записывает данные быстрее.

Записываю пакетами, чтобы не накапливать в памяти большие пакеты.


&НаСервере
Процедура ЗаписатьРегистрСведений(ИмяТаблицы, Т) Экспорт
	
	НачатьТранзакцию();
	МенеджерРегистра = РегистрыСведений[ИмяТаблицы];
	ПоляРегистра = ПолучитьПоляРегистраСведений(ИмяТаблицы);
	
	Для Каждого Структура ИЗ Т Цикл
		МЗ = МенеджерРегистра.СоздатьМенеджерЗаписи();       
		ЗаполнитьЗначенияСвойств(МЗ, Структура);
		МЗ2 = МенеджерРегистра.СоздатьМенеджерЗаписи();       
		ЗаполнитьЗначенияСвойств(МЗ2, Структура);
		МЗ2.Прочитать();
		Если МЗ2.Выбран() Тогда                                 
			Разница = ложь;
			Для Каждого ПолеРегистра ИЗ ПоляРегистра Цикл
				Если МЗ[ПолеРегистра] <> МЗ2[ПолеРегистра] Тогда
					Разница = истина;
					Прервать;
				КонецЕсли;
			КонецЦикла;
			Если НЕ Разница Тогда
				Продолжить;
			КонецЕсли;
		КонецЕсли;
		МЗ.Записать();
	КонецЦикла;   
	
	ЗафиксироватьТранзакцию();

КонецПроцедуры

Функция ПолучитьПоляРегистраСведений(ИмяРегистра)

	Поля = Новый Массив();
	
	МДР = Метаданные.РегистрыСведений[ИмяРегистра]; 
	Для Каждого МД ИЗ МДР.Измерения Цикл
		Поля.Добавить(МД.Имя);
	КонецЦикла;
	Для Каждого МД ИЗ МДР.Ресурсы Цикл
		Поля.Добавить(МД.Имя);
	КонецЦикла;
	
	Возврат Поля;
	
КонецФункции

Протокол когда данные пропускались из-за наличия:

И протокол, когда записи записывались:

fixin

Программирую на 1С с 1999 года. В 1С просто Гений. В 2020 году ушел из офиса на вольные хлеба фриланса. Принимаю заказы.

Читайте также:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *