У меня есть задание, создать печатную форму по образцу сделанном до меня, но в этом образце идет запрос в цикле при заполнении колонки штрихкодов номенклатуры в табличной части, сам не особо опытен, поэтому придумал сделать только так, номенклатуру тч закинуть в массив, массив передать через параметры в запрос, и потом результат запроса обойти, может есть решения получше, поэтому пишу сюда

```1c
    ВыборкаТабличнойЧасти = СсылкаНаОбъект.Товары;
    Для каждого СтрокаТабличнойЧасти Из ВыборкаТабличнойЧасти Цикл

    СтруктураСтроки = дкПолучитьПредставлениеДанныхТоварнойСтроки(СтрокаТабличнойЧасти,Права);
    ОбластьСтрока.Параметры.Заполнить(СтруктураСтроки);
    ОбластьСтрока.Параметры.ДатаПоставки = СтрокаТабличнойЧасти.ДатаПоставки;
    ОбластьСтрока.Параметры.Коэффициент = СтрокаТабличнойЧасти.Коэффициент;
    Запрос = Новый Запрос;

    Запрос.Текст =
    "ВЫБРАТЬ
    | ШтрихКоды.ШтрихКод
    |ИЗ
    | РегистрСведений.ШтрихКоды КАК ШтрихКоды
    |ГДЕ
    | ШтрихКоды.Запрет <> &Запрет
    | И ШтрихКоды.Объект.Ссылка = &ТоварДок";

    Запрос.УстановитьПараметр("Запрет", Истина);
    Запрос.УстановитьПараметр("ТоварДок", СтрокаТабличнойЧасти.Номенклатура);
    РезультатЗапроса = Запрос.Выполнить();
    ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();

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

    Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
    ОбластьСтрока.Параметры.Штрихкод = ВыборкаДетальныеЗаписи.Штрихкод + ", " + ОбластьСтрока.Параметры.Штрихкод;
    КонецЦикла;

    мсвДопОбластиПодвала = Неопределено;
    Если ВыборкаТабличнойЧасти.Индекс(СтрокаТабличнойЧасти) = ВыборкаТабличнойЧасти.Количество()-1 Тогда
    мсвДопОбластиПодвала = Новый Массив;
    мсвДопОбластиПодвала.Добавить(ОбластьПодвал);
    КонецЕсли;

    НомерСтраницы = дкВывестиГоризонтальнуюОбласть(ТабДокумент, ОбластьСтрока, ОбластьШапкаТаблицы, ,
    НомерСтраницы, , Права, мсвДопОбластиПодвала);
    Если НомерСтраницы <> НомерСтраницыПред Тогда
    НомерСтраницыПред = НомерСтраницы;
    КонецЕсли;
    КонецЦикла;
```
---
```1c
    Запрос = Новый Запрос;

    Запрос.Текст =
    "ВЫБРАТЬ
    | Товары.Номенклтура КАК Номенклатура,
    | ШтрихКоды.ШтрихКод
    |ИЗ
    | РегистрСведений.ШтрихКоды КАК ШтрихКоды
    | внутреннее соединение Документ.МойДокумент.Товары КАК Товары
    |ПО
    | ШтрихКоды.Объект = Товары.Номенклатура и Товары.Ссылка = &СсылкаНаДокумент
    |ГДЕ
    | НЕ ШтрихКоды.Запрет";

    Запрос.УстановитьПараметр("СсылкаНаДокумент", СсылкаНаОбъект);

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

А Далее свой цикл, но нужные данные уже искать по таблице через .НайтиСтроки.
---
По моему нужно еще сгруппировать по Номенклатуре и Штрихкодам. Автору же нужно собрать в строку все штрихкоды по каждой позиции номенклатуры.

```1c
    Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ
    | ПриходТМЗТовары.Номенклатура КАК Номенклатура,
    | Штрихкоды.ШтрихКод КАК ШтрихКод
    |ИЗ
    | Документ.ПриходТМЗ.Товары КАК ПриходТМЗТовары
    | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.Штрихкоды КАК Штрихкоды
    | ПО ПриходТМЗТовары.Номенклатура = Штрихкоды.Объект
    |ГДЕ
    | ПриходТМЗТовары.Ссылка = &ПриходТМЗ
    | И НЕ Штрихкоды.Запрет
    |
    |СГРУППИРОВАТЬ ПО
    | ПриходТМЗТовары.Номенклатура,
    | Штрихкоды.ШтрихКод";

    Запрос.УстановитьПараметр("ПриходТМЗ", Ссылка);

    ВыборкаНоменклатура = Запрос.Выполнить().Выбрать(,"Номенклатура");
    Пока ВыборкаНоменклатура.Следующий() Цикл

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

    ВыборкаШтрихКоды = ВыборкаНоменклатура.Выбрать(,"ШтрихКод");
    Пока ВыборкаШтрихКоды.Следующий() Цикл

    ОбластьСтрока.Параметры.Штрихкод = ВыборкаДетальныеЗаписи.Штрихкод + ", " + ОбластьСтрока.Параметры.Штрихкод;

    КонецЦикла;
    КонецЦикла;
```
---
```1c
    Запрос = Новый Запрос;

    Запрос.Текст =
    "ВЫБРАТЬ
    | Товары.Номенклтура КАК Номенклатура,
    | ШтрихКоды.ШтрихКод
    |ИЗ
    | РегистрСведений.ШтрихКоды КАК ШтрихКоды
    | внутреннее соединение Документ.МойДокумент.Товары КАК Товары
    |ПО
    | ШтрихКоды.Объект = Товары.Номенклатура и Товары.Ссылка = &СсылкаНаДокумент
    |ГДЕ
    | НЕ ШтрихКоды.Запрет";

    Запрос.УстановитьПараметр("СсылкаНаДокумент", СсылкаНаОбъект);

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

А Далее свой цикл, но нужные данные уже искать по таблице через .НайтиСтроки.
---
В принципе все правильно, запрос один на весь массив, затем его обработка в цикле.
Но мне кажется, что для печатных форм это не очень критично. Если конечно вы не выводите на печать документы с табличными частями по нескольким тысячам позиций.
---
ддокумент формируется с минуту, если там чуть больше 15-20 позиций, поэтому хотел ускорить
---
Риали?
20 позиций около минуты?
Конечно запрос в цикле - это преступление, но не до такой же степени.. Хотя много еще от чего зависит.
Кстати вы в сам запрос передаете параметр "Запрет" типа булево, его можно писать прямо в запросе
"...И ШтрихКоды.Запрет" ну или с отрицанием "...И НЕ ШтрихКоды.Запрет".
Можете отписаться, насколько увеличилась производительность после изменения алгоритма?
Спасибо!
---
Если доделаю, отпишусь
---
Точный замен не делал, но могу сказать что печатная форма документа 50 строк с при формировании с запросом в цикле формируется около 4х минут, а после переделки и без запроса в цикле менее 10 сек
---
По моему нужно еще сгруппировать по Номенклатуре и Штрихкодам. Автору же нужно собрать в строку все штрихкоды по каждой позиции номенклатуры.

```1c
    Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ
    | ПриходТМЗТовары.Номенклатура КАК Номенклатура,
    | Штрихкоды.ШтрихКод КАК ШтрихКод
    |ИЗ
    | Документ.ПриходТМЗ.Товары КАК ПриходТМЗТовары
    | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.Штрихкоды КАК Штрихкоды
    | ПО ПриходТМЗТовары.Номенклатура = Штрихкоды.Объект
    |ГДЕ
    | ПриходТМЗТовары.Ссылка = &ПриходТМЗ
    | И НЕ Штрихкоды.Запрет
    |
    |СГРУППИРОВАТЬ ПО
    | ПриходТМЗТовары.Номенклатура,
    | Штрихкоды.ШтрихКод";

    Запрос.УстановитьПараметр("ПриходТМЗ", Ссылка);

    ВыборкаНоменклатура = Запрос.Выполнить().Выбрать(,"Номенклатура");
    Пока ВыборкаНоменклатура.Следующий() Цикл

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

    ВыборкаШтрихКоды = ВыборкаНоменклатура.Выбрать(,"ШтрихКод");
    Пока ВыборкаШтрихКоды.Следующий() Цикл

    ОбластьСтрока.Параметры.Штрихкод = ВыборкаДетальныеЗаписи.Штрихкод + ", " + ОбластьСтрока.Параметры.Штрихкод;

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

    // здесь заполняем параметры макета по строке товаров

    ВыборкаШК = ВыборкаХарактеристика.Выбрать();
    Пока ВыборкаШК.Следующий() Цикл

    // Здесь собираем ШК хоть в строчку, хоть во что

    КонецЦИкла;

    // Выводим строку.

    КонецЦикла;
    КонецЦикла;
```

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