Создание новой номенклатуры в справочнике

1. user1671936 1 10.12.21 15:19 Сейчас в теме
Доброго времени суток. Подскажите, пожалуйста, как можно ускорить процесс создания новой номенклатуры?

Для Сч = 0 По ТабЗнч.Количество() Цикл
		
		Если Сч > ТабЗнч.Количество() Тогда
			
			Прервать;
			
		КонецЕсли;
		
		ПолученныйКод = СтрЗаменить(ТабЗнч[Сч].Колонка1, Символы.НПП, "");
		Символ = НРег(Сред(ПолученныйКод, 2, 1));
		Если Найти("абвгдеёжзийклмнопрстуфхцчшщъыьэюя", Символ)
			Или Не ЗначениеЗаполнено(Сокрлп(ТабЗнч[Сч].Колонка2)) Тогда
			
			Продолжить;
			
		Иначе
			
			НаименованиеНом = СокрЛП(ТабЗнч[Сч].Колонка2);
			ЕдИзм = СокрЛП(ТабЗнч[Сч].Колонка4);
			ПолноеНаименование = СокрЛП(ТабЗнч[Сч].Колонка3)+ " " + НаименованиеНом;
			
			Номенклатура = Справочники.Номенклатура.НайтиПоКоду(ПолученныйКод);
			
			Если Номенклатура.Пустая() Тогда
				
				НоваяНоменклатура = Справочники.Номенклатура.СоздатьЭлемент();
				НоваяНоменклатура.ЕдиницаИзмерения = Справочники.УпаковкиЕдиницыИзмерения.НайтиПоНаименованию(ЕдИзм);
				НоваяНоменклатура.Код = ПолученныйКод;
				НоваяНоменклатура.ВидНоменклатуры = Справочники.ВидыНоменклатуры.НайтиПоНаименованию("Товар");
				НоваяНоменклатура.Наименование = НаименованиеНом;
				НоваяНоменклатура.НаименованиеПолное = ПолноеНаименование;
				НоваяНоменклатура.Записать();
				
			КонецЕсли;	
			
		КонецЕсли;
		
	КонецЦикла;
Показать
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. nomad_irk 76 10.12.21 15:46 Сейчас в теме
(1)максимум что вы можете сделать в данном случае - вынести:
ВидНоменклатурыТовар = Справочники.ВидыНоменклатуры.НайтиПоНаименованию("Товар");

за пределы цикла и при создании номенклатуры делать:
НоваяНоменклатура.ВидНоменклатуры = ВидНоменклатурыТовар
3. spacecraft 10.12.21 16:05 Сейчас в теме
(1) на вскидку.
Пройти в цикле свою ТЗ и сформировать наименование в дополнительную колонку.
Скопировать ТЗ с только этой колонкой и свернуть.
Создать запрос и передать полученную ТЗ в запрос.
В запросе соединить эту ТЗ со справочником номенклатуры по наименованию. И выбрать только с отсутствующей номенклатурой (is null).
Уже по полученному результату создавать новую номенклатуру в транзакции (если количество создаваемых элементов много, то партиями транзакций).
4. nomad_irk 76 10.12.21 16:12 Сейчас в теме
(3)Глядя на вот это:

Для Сч = 0 По ТабЗнч.Количество() Цикл
        
        Если Сч > ТабЗнч.Количество() Тогда
            
            Прервать;
            
        КонецЕсли;

+ остальное - боюсь, скилла не хватит :)
5. spacecraft 10.12.21 16:14 Сейчас в теме
(4) ну, я ответил на конкретный вопрос: "как можно ускорить процесс создания новой номенклатуры?"
В любом случае нужно хотя бы попытаться сделать нормально. Можно и спросить, то что не получается. Но именно что не получается, а не сделайте...
:)
6. nomad_irk 76 10.12.21 16:20 Сейчас в теме
(5)опять же, если вот прям дословно, то процесс создания номенклатуры уже не ускоришь, можно ускорить процесс сбора данных/создания условий для создания номенклатуры :)
8. user1671936 1 10.12.21 16:32 Сейчас в теме
(5)
(6) Спасибо! Данные собираются за секунды, а вот создание номенклатуры....
11. Sashares 35 10.12.21 16:35 Сейчас в теме
(1) Сделайте замер производительности, отсортируйте по времени, сделайте скрин и покажите его.
Т.к. чтобы оптимизировать, надо знать на что тратится время.
17. spacecraft 10.12.21 16:54 Сейчас в теме
(6)
опять же, если вот прям дословно, то процесс создания номенклатуры уже не ускоришь

Как раз запись в общей транзакции это и есть ускорение создания.
7. user1671936 1 10.12.21 16:31 Сейчас в теме
(4) это кусок из цикла, где к счетчику прибавляется 1, так как нужно получать строки через одну, количество строк в тз 7500 , соответственно, когда будет 7501 то выдаст ошибку "индекс за пределами массива" =)
9. Sashares 35 10.12.21 16:34 Сейчас в теме
(7)Как оно у вас в цикле окажется 7501, если максимальное значение 7500?
12. user1671936 1 10.12.21 16:36 Сейчас в теме
(9) согласен, не так выразился. Поправил в (10)
10. user1671936 1 10.12.21 16:35 Сейчас в теме
(4) хотя, не так выразился, счетчик не может быть больше чем ТабЗнч.Количество(), но в любом случае, без этой проверки у меня цикл прерывается ошибкой, что индекс за пределами массива.
13. Sashares 35 10.12.21 16:36 Сейчас в теме
(10)Потому что надо По ТабЗнч.Количество() - 1
т.к. счетчик это индекс строки.
14. user1671936 1 10.12.21 16:43 Сейчас в теме
15. dmbarchenkov 10.12.21 16:49 Сейчас в теме
(14) чтобы не заморачиваться с индексами и прочим, проще писать так:
Для каждого СтрТЗ Из ТабЗнч Цикл
        
        ПолученныйКод = СтрЗаменить(СтрТЗ.Колонка1, Символы.НПП, "");
        .........        

КонецЦикла;
16. user1671936 1 10.12.21 16:52 Сейчас в теме
Оставьте свое сообщение

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