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