Как ускорить запись в регистр сведений

1. 1c_uZer 09.03.21 14:43 Сейчас в теме
Здравствуйте. такой вопрос. подскажите кто знает. суть такая. у меня есть конфигурация для ТСД. с помощью web-сервиса цепляюсь к базе ERP и должен получить остатки номенклатуры в разрезе серий. то есть я обратился к базе ERP и быстро получил остатки в разрезе серий (примерно за одну секунду). Проблема следующая, эти остатки я должен записать в регистр сведений на терминале. и всё вроде хорошо, но у меня 1800 строк в таблице значений. в перспективе будет больше. и запись в регистр сведений у меня происходит 53 секунды. подскажите как ускорить этот момент? есть ли варианты для ускорения записи в регистр сведений? РС непериодический и Независимый. В цикле так же проверяю характеристики, серии, склад и номенклатуру. если они у меня имеются в ТСД аналогично ERP то берём уже созданный элемент, если нет создаём новый.

НаборЗаписей = РегистрыСведений.Остатки.СоздатьНаборЗаписей();
	
	Замер = ТекущаяДата();
	
	Для каждого СтрВн Из Таблица Цикл //в таблице 1800 строк
						
		Номенклатура = ПолучитьНоменклатуру(СтрВн.Номенклатура, СтрВн.НоменклатураНаименование, СтрВн.НоменклатураАртикул, СтрВн.ВидНоменклатурыНаименование).Ссылка; //Здесь проверяю наличие номенклатуры. если она уже создана в базе для ТСД, то подбираем её из справочника, если нет то создаём.
		
		СкладЗаказа = ПолучаемСклад(СтрВн.Склад, СтрВн.СкладНаименование).Ссылка;
		
		НоваяЗапись = НаборЗаписей.Добавить();
				                    
		Если СтрВн.Серия <> Справочники.СерииНоменклатуры.ПустаяСсылка() И СтрВн.Серия <> NULL И СтрВн.ВидНоменклатурыНаименование <> "Тара" Тогда
			
			Серия = ПолучитьСерию(СтрВн.Серия, СтрВн.СерияНаименование,Номенклатура).Ссылка;
			
			НоваяЗапись.Серия = Серия;
			
		КонецЕсли;
		
		Если СтрВн.ВидНоменклатурыНаименование = "Тара"  Тогда
			
			НоваяЗапись.Серия = СтрВн.СерияНаименование;
			
		КонецЕсли;
				
		Если СтрВн.Характеристика <> Справочники.ХарактеристикиНоменклатуры.ПустаяСсылка() И СтрВн.Характеристика <> NULL Тогда
			
			Характеристика = ПолучитьХарактеристику(СтрВн.Характеристика, СтрВн.ХарактеристикаНаименование, Номенклатура).Ссылка;
			
			НоваяЗапись.Характеристика = Характеристика;
			
		КонецЕсли;
		
		НоваяЗапись.Номенклатура = Номенклатура;
		
		НоваяЗапись.Склад = СкладЗаказа;
		
		НоваяЗапись.Остаток = СтрВн.ВНаличииОстаток;
					
	КонецЦикла;
	
	НаборЗаписей.Записать()
Показать
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. comptr 35 09.03.21 14:55 Сейчас в теме
Зачем делать функцию ПолучитьНоменклатуру и потом ещё от её результата обращаться через точку к Ссылке?
Обращение через точку приводит к чтению всего объекта из базы.
Нужно сделать так, чтобы функции Получить_ЧтоНибудь возвращали сразу ссылку на ЧтоНибудь.
3. 1c_uZer 09.03.21 14:56 Сейчас в теме
(2)
приводит к чтению всего объекта из базы.
Нужно сделать так, чтобы функции Получить_ЧтоНибудь возвращали сразу ссылку

да. искал варианты просто. сейчас так и сделаю. спасибо.
4. Степной 27 09.03.21 15:00 Сейчас в теме
(1) Желательно отказаться от функций "Получить...". Вместо этого получить данные из базы приемника и сравнить с данными из базы-источника 1 раз в 1-м запросе.
5. 1c_uZer 09.03.21 15:12 Сейчас в теме
(4) не совсем понял 1 раз в 1-м запросе. вот ход этой мысли можете уточнить?)
6. glek 120 09.03.21 15:14 Сейчас в теме
Кроме того, коллега, проверка в цикле (запрос в цикле) есть не сильно гуд. Попробуйте получить всё сразу одним запросом. И потом уже скопом записать.
7. 1c_uZer 09.03.21 15:17 Сейчас в теме
(6) запрос да) у меня не совсем запрос)

Функция ПолучитьНоменклатуру(Номенклатура, Наименование, Артикул, ВидНоменклатуры)
	
	ОбъектНеНайден = СтрНайти(Строка(Номенклатура), "<Объект не найден>");
		Если ОбъектНеНайден = 0 Тогда
			ОбъектНеНайден = СтрНайти(Строка(Номенклатура), "<Ob ject not found>");		
		КонецЕсли;
		
		//Сообщить(Строка(СтрВн.Номенклатура));
		Если  ОбъектНеНайден > 0  Тогда 
			ДанныеОбъект = Справочники.Номенклатура.СоздатьЭлемент();
			ДанныеОбъект.УстановитьСсылкуНового(Номенклатура.Ссылка);
			ДанныеОбъект.НаименованиеПолное = Наименование;
			ДанныеОбъект.Наименование = Наименование;
			ДанныеОбъект.Артикул = Артикул;
			ДанныеОбъект.ВидНоменклатуры = ВидНоменклатуры;
			ДанныеОбъект.Записать();
			Возврат ДанныеОбъект.Ссылка; 
		Иначе
			ДанныеОбъект = Номенклатура.Ссылка.ПолучитьОбъект();
			ДанныеОбъект.НаименованиеПолное = Наименование;
			ДанныеОбъект.Наименование = Наименование;
			ДанныеОбъект.Артикул = Артикул;
			ДанныеОбъект.ВидНоменклатуры = ВидНоменклатуры;
			ДанныеОбъект.Записать();
			Возврат ДанныеОбъект.Ссылка;
		КонецЕсли;
	
	КонецФункции
Показать


Вот такая функция получает номенклатуру ну и склад и характеристики всё по аналогии)
8. glek 120 09.03.21 15:20 Сейчас в теме
(7) А Таблица у вас откуда берется?
11. 1c_uZer 09.03.21 15:24 Сейчас в теме
(8) ОтветСервераВыб = Соединение.GetProducts(ДатаЗаказа, НомерЗаказа);
Таблица = Десериализовать(ОтветСервераВыб.Получить());

вот. выполняется процедура GetProducts в ERP. в ней мы и получаем остатки. и они попадают в таблицу.
9. Степной 27 09.03.21 15:21 Сейчас в теме
(5) Создать запрос, в который передать таблицу с данными для поиска во временную таблицу. Далее в этом же запросе в других пакетах получать данные из базы (номенклатура, характеристика и т.д.) по 1-ой таблице. Если не нашли, то в цикле по выборке создаем.
12. 1c_uZer 09.03.21 15:24 Сейчас в теме
(9)
Создать запрос, в который передать таблицу с данными


Понял. Спасибо большое. Попробую.
10. glek 120 09.03.21 15:22 Сейчас в теме
И еще. Если у вас всегда тянется из ЕРП, то зачем вы создаете сущности в ТСД? Намного быстрее и проще было бы получить из ЕРП УИД, наименование и оперировать ими, нежели каждый раз проверять наличие и создавать элементы справочника
13. 1c_uZer 09.03.21 15:28 Сейчас в теме
(10) то есть вообще не создавать элементы справочников? отталкиваться чисто уидами?
14. glek 120 09.03.21 16:13 Сейчас в теме
15. 1c_uZer 09.03.21 16:15 Сейчас в теме
(14) буду пробовать. спасибо.
16. gzharkoj 520 09.03.21 16:16 Сейчас в теме
Проблем у вас не в регистре сведений. Вам бы поставить замер производительности, там и увидите слабые места. Это либо запросы в цикле, либо в генерации новых объектов.
Fox-trot; Sashares; +2 Ответить
17. ImHunter 327 11.03.21 09:42 Сейчас в теме
(1) Как-то меня сомневают участки кода вида ПолучаемСклад(СтрВн.Склад, СтрВн.СкладНаименование).Ссылка - зачем лишнее разыменование в виде ").Ссылка"? Там и так, наверное, ссылка приходит из ПолучитьСклад(...).
18. 1c_uZer 11.03.21 11:26 Сейчас в теме
(17) там объект) ну этот момент я уже переделал)
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот