Как участок кода с запросом в цикле изменить на нормальный?

1. I_train 26.09.21 10:01 Сейчас в теме
У меня есть задание, создать печатную форму по образцу сделанном до меня, но в этом образце идет запрос в цикле при заполнении колонки штрихкодов номенклатуры в табличной части, сам не особо опытен, поэтому придумал сделать только так, номенклатуру тч закинуть в массив, массив передать через параметры в запрос, и потом результат запроса обойти, может есть решения получше, поэтому пишу сюда

ВыборкаТабличнойЧасти = СсылкаНаОбъект.Товары;
	Для каждого СтрокаТабличнойЧасти Из ВыборкаТабличнойЧасти Цикл
		
		СтруктураСтроки = дкПолучитьПредставлениеДанныхТоварнойСтроки(СтрокаТабличнойЧасти,Права);
		ОбластьСтрока.Параметры.Заполнить(СтруктураСтроки);
        ОбластьСтрока.Параметры.ДатаПоставки = СтрокаТабличнойЧасти.ДатаПоставки;
		ОбластьСтрока.Параметры.Коэффициент = СтрокаТабличнойЧасти.Коэффициент;
		Запрос = Новый Запрос;
		
		Запрос.Текст = 
		"ВЫБРАТЬ
		|	ШтрихКоды.ШтрихКод
		|ИЗ
		|	РегистрСведений.ШтрихКоды КАК ШтрихКоды
		|ГДЕ
		|	ШтрихКоды.Запрет <> &Запрет
		|	И ШтрихКоды.Объект.Ссылка = &ТоварДок";
	
		
		Запрос.УстановитьПараметр("Запрет", Истина);		
		Запрос.УстановитьПараметр("ТоварДок", СтрокаТабличнойЧасти.Номенклатура);	
		РезультатЗапроса = Запрос.Выполнить();	
		ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
	 
	 ОбластьСтрока.Параметры.Штрихкод = "";
	 
	 Пока ВыборкаДетальныеЗаписи.Следующий() Цикл	 
		 ОбластьСтрока.Параметры.Штрихкод = ВыборкаДетальныеЗаписи.Штрихкод + ", " + ОбластьСтрока.Параметры.Штрихкод; 	 
	 КонецЦикла;
		
		мсвДопОбластиПодвала = Неопределено;
		Если ВыборкаТабличнойЧасти.Индекс(СтрокаТабличнойЧасти) = ВыборкаТабличнойЧасти.Количество()-1 Тогда
			мсвДопОбластиПодвала = Новый Массив;			
			мсвДопОбластиПодвала.Добавить(ОбластьПодвал);
		КонецЕсли;
		
		НомерСтраницы = дкВывестиГоризонтальнуюОбласть(ТабДокумент, ОбластьСтрока, ОбластьШапкаТаблицы, ,
				НомерСтраницы, , Права, мсвДопОбластиПодвала);
		Если НомерСтраницы <> НомерСтраницыПред Тогда			
			НомерСтраницыПред = НомерСтраницы;
		КонецЕсли;		
	КонецЦикла;
Показать
Найденные решения
2. dehro 5 26.09.21 10:20 Сейчас в теме
  Запрос = Новый Запрос;
        
        Запрос.Текст = 
        "ВЫБРАТЬ 
        |   Товары.Номенклтура КАК Номенклатура,
        |    ШтрихКоды.ШтрихКод
        |ИЗ
        |    РегистрСведений.ШтрихКоды КАК ШтрихКоды 
        |    внутреннее соединение Документ.МойДокумент.Товары КАК Товары 
        |ПО 
        |   ШтрихКоды.Объект = Товары.Номенклатура и Товары.Ссылка = &СсылкаНаДокумент
        |ГДЕ
        |    НЕ ШтрихКоды.Запрет";
    
        
        Запрос.УстановитьПараметр("СсылкаНаДокумент", СсылкаНаОбъект);

        ТаблицаЗнач = Запрос.Выполнить().Выгрузить();
Показать


А Далее свой цикл, но нужные данные уже искать по таблице через .НайтиСтроки.
Dem0; I_train; +2 Ответить
6. provadyuga 99 26.09.21 12:32 Сейчас в теме
(2) По моему нужно еще сгруппировать по Номенклатуре и Штрихкодам. Автору же нужно собрать в строку все штрихкоды по каждой позиции номенклатуры.
Запрос = Новый Запрос;
	Запрос.Текст = "ВЫБРАТЬ
	               |	ПриходТМЗТовары.Номенклатура КАК Номенклатура,
	               |	Штрихкоды.ШтрихКод КАК ШтрихКод
	               |ИЗ
	               |	Документ.ПриходТМЗ.Товары КАК ПриходТМЗТовары
	               |		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.Штрихкоды КАК Штрихкоды
	               |		ПО ПриходТМЗТовары.Номенклатура = Штрихкоды.Объект
	               |ГДЕ
	               |	ПриходТМЗТовары.Ссылка = &ПриходТМЗ
	               |	И НЕ Штрихкоды.Запрет
	               |
	               |СГРУППИРОВАТЬ ПО
	               |	ПриходТМЗТовары.Номенклатура,
	               |	Штрихкоды.ШтрихКод";
	
	Запрос.УстановитьПараметр("ПриходТМЗ", Ссылка);
	
	ВыборкаНоменклатура = Запрос.Выполнить().Выбрать(,"Номенклатура");
	Пока ВыборкаНоменклатура.Следующий() Цикл

                ОбластьСтрока.Параметры.Штрихкод = "";

		ВыборкаШтрихКоды = ВыборкаНоменклатура.Выбрать(,"ШтрихКод");
		Пока ВыборкаШтрихКоды.Следующий() Цикл
			
			ОбластьСтрока.Параметры.Штрихкод = ВыборкаДетальныеЗаписи.Штрихкод + ", " + ОбластьСтрока.Параметры.Штрихкод;
			
		КонецЦикла;	
	КонецЦикла;	
Показать
dehro; I_train; +2 Ответить
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. dehro 5 26.09.21 10:20 Сейчас в теме
  Запрос = Новый Запрос;
        
        Запрос.Текст = 
        "ВЫБРАТЬ 
        |   Товары.Номенклтура КАК Номенклатура,
        |    ШтрихКоды.ШтрихКод
        |ИЗ
        |    РегистрСведений.ШтрихКоды КАК ШтрихКоды 
        |    внутреннее соединение Документ.МойДокумент.Товары КАК Товары 
        |ПО 
        |   ШтрихКоды.Объект = Товары.Номенклатура и Товары.Ссылка = &СсылкаНаДокумент
        |ГДЕ
        |    НЕ ШтрихКоды.Запрет";
    
        
        Запрос.УстановитьПараметр("СсылкаНаДокумент", СсылкаНаОбъект);

        ТаблицаЗнач = Запрос.Выполнить().Выгрузить();
Показать


А Далее свой цикл, но нужные данные уже искать по таблице через .НайтиСтроки.
Dem0; I_train; +2 Ответить
3. Dem0 26.09.21 11:50 Сейчас в теме
В принципе все правильно, запрос один на весь массив, затем его обработка в цикле.
Но мне кажется, что для печатных форм это не очень критично. Если конечно вы не выводите на печать документы с табличными частями по нескольким тысячам позиций.
4. I_train 26.09.21 12:08 Сейчас в теме
(3) ддокумент формируется с минуту, если там чуть больше 15-20 позиций, поэтому хотел ускорить
5. Dem0 26.09.21 12:16 Сейчас в теме
Риали?
20 позиций около минуты?
Конечно запрос в цикле - это преступление, но не до такой же степени.. Хотя много еще от чего зависит.
Кстати вы в сам запрос передаете параметр "Запрет" типа булево, его можно писать прямо в запросе
"...И ШтрихКоды.Запрет" ну или с отрицанием "...И НЕ ШтрихКоды.Запрет".
Можете отписаться, насколько увеличилась производительность после изменения алгоритма?
Спасибо!
G_112708749323588293243; muskul; dehro; I_train; +4 Ответить
8. I_train 26.09.21 13:29 Сейчас в теме
(5)Если доделаю, отпишусь
9. I_train 27.09.21 09:38 Сейчас в теме
(5) Точный замен не делал, но могу сказать что печатная форма документа 50 строк с при формировании с запросом в цикле формируется около 4х минут, а после переделки и без запроса в цикле менее 10 сек
G_112708749323588293243; Dem0; +2 Ответить
6. provadyuga 99 26.09.21 12:32 Сейчас в теме
(2) По моему нужно еще сгруппировать по Номенклатуре и Штрихкодам. Автору же нужно собрать в строку все штрихкоды по каждой позиции номенклатуры.
Запрос = Новый Запрос;
	Запрос.Текст = "ВЫБРАТЬ
	               |	ПриходТМЗТовары.Номенклатура КАК Номенклатура,
	               |	Штрихкоды.ШтрихКод КАК ШтрихКод
	               |ИЗ
	               |	Документ.ПриходТМЗ.Товары КАК ПриходТМЗТовары
	               |		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.Штрихкоды КАК Штрихкоды
	               |		ПО ПриходТМЗТовары.Номенклатура = Штрихкоды.Объект
	               |ГДЕ
	               |	ПриходТМЗТовары.Ссылка = &ПриходТМЗ
	               |	И НЕ Штрихкоды.Запрет
	               |
	               |СГРУППИРОВАТЬ ПО
	               |	ПриходТМЗТовары.Номенклатура,
	               |	Штрихкоды.ШтрихКод";
	
	Запрос.УстановитьПараметр("ПриходТМЗ", Ссылка);
	
	ВыборкаНоменклатура = Запрос.Выполнить().Выбрать(,"Номенклатура");
	Пока ВыборкаНоменклатура.Следующий() Цикл

                ОбластьСтрока.Параметры.Штрихкод = "";

		ВыборкаШтрихКоды = ВыборкаНоменклатура.Выбрать(,"ШтрихКод");
		Пока ВыборкаШтрихКоды.Следующий() Цикл
			
			ОбластьСтрока.Параметры.Штрихкод = ВыборкаДетальныеЗаписи.Штрихкод + ", " + ОбластьСтрока.Параметры.Штрихкод;
			
		КонецЦикла;	
	КонецЦикла;	
Показать
dehro; I_train; +2 Ответить
7. I_train 26.09.21 13:12 Сейчас в теме
(6) Да, именно так, у одной номенклатуры может иметься не сколько штрихкодов ,нужно их вывести, но они будут выводится в разных строка, поэтому думал как вывести штрихкоды одной номенклатуры в одной ячейке, у них в регистре штрихкодов главный из штрихкодов отмечается галочкой, думал только его выводить, но потом подумал, что вдруг у какой то номенклатуры будет не отмечен главный штрихкод и она просто не напечатается
10. gybson 27.09.21 20:44 Сейчас в теме
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("Ссылка", СсылкаНаОбъект);
Запрос.Текст =
"ВЫБРАТЬ
|	РеализацияТоваровУслугТовары.Номенклатура КАК Номенклатура,
|	РеализацияТоваровУслугТовары.Характеристика КАК Характеристика,
|	РеализацияТоваровУслугТовары.КоличествоУпаковок КАК КоличествоУпаковок,
|	РеализацияТоваровУслугТовары.Сумма КАК Сумма,
|	ЕСТЬNULL(ШтрихкодыНоменклатуры.Штрихкод, "") КАК ШтрихКод
|ИЗ
|	Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
|		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ШтрихкодыНоменклатуры КАК ШтрихкодыНоменклатуры
|		ПО РеализацияТоваровУслугТовары.Номенклатура = ШтрихкодыНоменклатуры.Номенклатура
|			И РеализацияТоваровУслугТовары.Характеристика = ШтрихкодыНоменклатуры.Характеристика
|			И РеализацияТоваровУслугТовары.Упаковка = ШтрихкодыНоменклатуры.Упаковка
|ГДЕ
|	РеализацияТоваровУслугТовары.Ссылка = &Ссылка
|ИТОГИ
|	МАКСИМУМ(КоличествоУпаковок),
|	МАКСИМУМ(Сумма)
|ПО
|	Номенклатура,
|	Характеристика";
ВыборкаНоменклатура = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
Пока ВыборкаНоменклатура.Следующий() Цикл
	ВыборкаХарактеристика = ВыборкаНоменклатура.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
	Пока ВыборкаХарактеристика.Следующий() Цикл
		
		// здесь заполняем параметры макета по строке товаров
		
	    ВыборкаШК = ВыборкаХарактеристика.Выбрать();
		Пока ВыборкаШК.Следующий() Цикл
			
			// Здесь собираем ШК хоть в строчку, хоть во что
			
		КонецЦИкла;
		
		// Выводим строку.
		
	КонецЦикла;
КонецЦикла;
    
Показать


Примерно так лучше сделать. А если использовать еще и общие итоги, то сразу получим сумму документа.
Оставьте свое сообщение

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