УТ 10.3. Кусок кода из обработки проведения в документе. Есть запрос в цикле. Необходимо переделать.
У меня есть идеи: либо сделать в запросе вместо «Номенклатура = &Номенклатура» выражение «Номенклатура В (&МассивНоменклатуры)» и установить параметр запроса как СписокРаспределения.ВыгрузитьКолонку("Номенклатура").
Либо сделать пакетный запрос. Но до конца не соображу, как это сделать.

СписокРаспределения - это табличная часть документа (документ новый, не типовой).

```1c
    // Движения по регистру ПартииТоваровНаСкладах

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

    Запрос.УстановитьПараметр("ДатаАктуальности", Дата);

    Для Каждого стр Из СписокРаспределения Цикл

    Если стр.СуммаРаспределения = 0 Тогда
    Продолжить;
    КонецЕсли;

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

    // Заполняем добавляемую стоимость
    СтоимостьПартий = Запрос.Выполнить().Выгрузить();
    ИтоговаяСтоимостьПартий = СтоимостьПартий.Итог("Стоимость");
    Если СтоимостьПартий.Количество() > 0 Тогда

    РаспределеннаяСебестоимость = 0;
    Для н = 0 По СтоимостьПартий.Количество() - 2 Цикл
    ДоляОтОбщейСебестоимости = СтоимостьПартий[н].Стоимость / ИтоговаяСтоимостьПартий;
    СтоимостьПартий[н].ДобавяемаяСтоимость = ДоляОтОбщейСебестоимости * стр.СуммаРаспределения;
    РаспределеннаяСебестоимость = РаспределеннаяСебестоимость + СтоимостьПартий[н].ДобавяемаяСтоимость;
    КонецЦикла;

    СтоимостьПартий[СтоимостьПартий.Количество() - 1].ДобавяемаяСтоимость = стр.СуммаРаспределения - РаспределеннаяСебестоимость;

    Для каждого Партия Из СтоимостьПартий Цикл
    Движение = Движения.ПартииТоваровНаСкладах.ДобавитьРасход();
    Движение.Период = Дата;
    Движение.Регистратор = Ссылка;
    Движение.Номенклатура = стр.Номенклатура;
    Движение.Склад = Партия.Склад;
    Движение.ДокументОприходования = Партия.ДокументОприходования;
    Если СнижатьУвеличиватьСебестоимость = 0 Тогда
    Движение.Стоимость = Партия.ДобавяемаяСтоимость;
    Иначе
    Движение.Стоимость = - Партия.ДобавяемаяСтоимость;
    КонецЕсли;

    КонецЦикла;

    КонецЕсли;

    КонецЦикла;
```
---
В итоге сделал так:

```1c
    // Движения по регистру ПартииТоваровНаСкладах

    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    | СписокРаспределения.Номенклатура,
    | СписокРаспределения.СуммаРаспределения
    |ПОМЕСТИТЬ ВТСписокРаспределения
    |ИЗ
    | &СписокРаспределения КАК СписокРаспределения
    |;
    |
    |////////////////////////////////////////////////////////////­////////////////////
    |ВЫБРАТЬ
    | ВТСписокРаспределения.Номенклатура КАК Номенклатура,
    | ПартииТоваровНаСкладахОстатки.ДокументОприходования,
    | ПартииТоваровНаСкладахОстатки.Склад,
    | 0 КАК ДобавяемаяСтоимость,
    | ЕСТЬNULL(ПартииТоваровНаСкладахОстатки.СтоимостьОстаток, 0) КАК Стоимость,
    | ВТСписокРаспределения.СуммаРаспределения КАК СуммаРаспределения
    |ИЗ
    | ВТСписокРаспределения КАК ВТСписокРаспределения
    | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ПартииТоваровНаСкладах.Остатки(
    | &ДатаАктуальности,
    | Номенклатура В
    | (ВЫБРАТЬ
    | ВТСписокРаспределения.Номенклатура
    | ИЗ
    | ВТСписокРаспределения КАК ВТСписокРаспределения)) КАК ПартииТоваровНаСкладахОстатки
    | ПО ВТСписокРаспределения.Номенклатура = ПартииТоваровНаСкладахОстатки.Номенклатура
    |ИТОГИ
    | СУММА(Стоимость),
    | МАКСИМУМ(СуммаРаспределения)
    |ПО
    | Номенклатура";

    Запрос.УстановитьПараметр("СписокРаспределения", СписокРаспределения.Выгрузить());
    Запрос.УстановитьПараметр("ДатаАктуальности", Дата);

    ВыборкаПоНоменклатуре = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам, "Номенклатура");
    Пока ВыборкаПоНоменклатуре.Следующий() Цикл
    Если ВыборкаПоНоменклатуре.СуммаРаспределения = 0 Тогда
    Продолжить;
    КонецЕсли;

    ИтоговаяСтоимостьПартий = ВыборкаПоНоменклатуре.Стоимость;
    ВыборкаДетали = ВыборкаПоНоменклатуре.Выбрать();

    РаспределеннаяСебестоимость = 0;
    Для Индекс = 1 По ВыборкаДетали.Количество() - 1 Цикл
    ВыборкаДетали.Следующий();

    ДоляОтОбщейСебестоимости = ВыборкаДетали.Стоимость / ИтоговаяСтоимостьПартий;
    ДобавяемаяСтоимость = ДоляОтОбщейСебестоимости * ВыборкаПоНоменклатуре.СуммаРаспределения;
    РаспределеннаяСебестоимость = РаспределеннаяСебестоимость + Окр(ДобавяемаяСтоимость, 2);

    Движение = Движения.ПартииТоваровНаСкладах.ДобавитьРасход();
    Движение.Период = Дата;
    Движение.Регистратор = Ссылка;
    Движение.Номенклатура = ВыборкаДетали.Номенклатура;
    Движение.Склад = ВыборкаДетали.Склад;
    Движение.ДокументОприходования = ВыборкаДетали.ДокументОприходования;
    Если СнижатьУвеличиватьСебестоимость = 0 Тогда
    Движение.Стоимость = ДобавяемаяСтоимость;
    Иначе
    Движение.Стоимость = - ДобавяемаяСтоимость;
    КонецЕсли;
    КонецЦикла;

    ВыборкаДетали.Следующий();

    ДобавяемаяСтоимость = ВыборкаПоНоменклатуре.СуммаРаспределения - РаспределеннаяСебестоимость;

    Движение = Движения.ПартииТоваровНаСкладах.ДобавитьРасход();
    Движение.Период = Дата;
    Движение.Регистратор = Ссылка;
    Движение.Номенклатура = ВыборкаДетали.Номенклатура;
    Движение.Склад = ВыборкаДетали.Склад;
    Движение.ДокументОприходования = ВыборкаДетали.ДокументОприходования;
    Если СнижатьУвеличиватьСебестоимость = 0 Тогда
    Движение.Стоимость = ДобавяемаяСтоимость;
    Иначе
    Движение.Стоимость = - ДобавяемаяСтоимость;
    КонецЕсли;

    КонецЦикла;
```
---
сделать в запросе вместо «Номенклатура = &Номенклатура» выражение «Номенклатура В (&МассивНоменклатуры)» и установить параметр запроса как СписокРаспределения.ВыгрузитьКолонку("Номенклатура")
Ну так и делайте.
Выгружаете колонку Номенклатура из ТЧ, пихаете ее в запрос. Открываете цикл по выборке запроса и все дела.
---
У меня есть идеи: либо сделать в запросе вместо «Номенклатура = &Номенклатура» выражение «Номенклатура В (&МассивНоменклатуры)» и установить параметр запроса как СписокРаспределения.ВыгрузитьКолонку("Номенклатура")
Так и делайте. Добавляете в запросе Итоги Себестоимость по Номенклатура.
Делаете выборку по группировкам.
---
Не понял с итогами. Как мне быть со строкой, которая сейчас есть «ИтоговаяСтоимостьПартий = СтоимостьПартий.Итог("Стоимость");»?
---
вот как для этого и нужно использовать Итоги в запросе:

```1c
    Итоги Сумма(Стоимость)
    ПО Номенклатура
```

И при обходе выборки по группировке, в поле группировки для Себестоимость будет сумма для конкретной номенклатуры.
---
выгружаете номенклатуру в Массив и используете его
тогда так
    РегистрНакопления.ПартииТоваровНаСкладах.Остатки(&ДатаАктуальности, Номенклатура в ( &МассивНом) ) КАК ПартииТоваровНаСкладахОстатки";
---
Автор такие статьи пишет про личностный рост (https://infostart.ru/1c/articles/1285339/) а по факту за столько лет не может простейшую операцию закодить.
Дабы тема не была спамом

```1c
    Запрос.Текст =
    "ВЫБРАТЬ
    | ПартииТоваровНаСкладахОстатки.Номенклатура,
    | ПартииТоваровНаСкладахОстатки.ДокументОприходования,
    | ПартииТоваровНаСкладахОстатки.Склад,
    | 0 КАК ДобавяемаяСтоимость,
    | ПартииТоваровНаСкладахОстатки.СтоимостьОстаток КАК Стоимость
    |ИЗ
    | РегистрНакопления.ПартииТоваровНаСкладах.Остатки(&ДатаАктуальности, Номенклатура В (&Номенклатура)) КАК ПартииТоваровНаСкладахОстатки";

    Запрос.УстановитьПараметр("ДатаАктуальности", Дата);
    Запрос.УстановитьПараметр("Номенклатура", СписокРаспределения .Выгрузить("Номенклатура"));

    мСтоимостьПартий = Запрос.Выполнить().Выгрузить();

    Для Каждого стр Из СписокРаспределения Цикл

    Если стр.СуммаРаспределения = 0 Тогда
    Продолжить;
    КонецЕсли;

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

    СтоимостьПартий = мСтоимостьПартий .НайтиСтроки(Отбор);

    мИтоговаяСтоимостьПартий = мСтоимостьПартий .Скопировать(СтоимостьПартий );
    ИтоговаяСтоимостьПартий = мИтоговаяСтоимостьПартий .Итог("Стоимость");
```
---
Я думаю, запрос в цикле неслучайно. Каждый цикл уменьшает сумму остаток в регистре ПартииТоваровНаСкладах.
---
В каждой итерации просто добавляется запись в набор, но не в регистр.
---
Если это полная картина кода, то да.
---
В итоге сделал так:

```1c
    // Движения по регистру ПартииТоваровНаСкладах

    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    | СписокРаспределения.Номенклатура,
    | СписокРаспределения.СуммаРаспределения
    |ПОМЕСТИТЬ ВТСписокРаспределения
    |ИЗ
    | &СписокРаспределения КАК СписокРаспределения
    |;
    |
    |////////////////////////////////////////////////////////////­////////////////////
    |ВЫБРАТЬ
    | ВТСписокРаспределения.Номенклатура КАК Номенклатура,
    | ПартииТоваровНаСкладахОстатки.ДокументОприходования,
    | ПартииТоваровНаСкладахОстатки.Склад,
    | 0 КАК ДобавяемаяСтоимость,
    | ЕСТЬNULL(ПартииТоваровНаСкладахОстатки.СтоимостьОстаток, 0) КАК Стоимость,
    | ВТСписокРаспределения.СуммаРаспределения КАК СуммаРаспределения
    |ИЗ
    | ВТСписокРаспределения КАК ВТСписокРаспределения
    | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ПартииТоваровНаСкладах.Остатки(
    | &ДатаАктуальности,
    | Номенклатура В
    | (ВЫБРАТЬ
    | ВТСписокРаспределения.Номенклатура
    | ИЗ
    | ВТСписокРаспределения КАК ВТСписокРаспределения)) КАК ПартииТоваровНаСкладахОстатки
    | ПО ВТСписокРаспределения.Номенклатура = ПартииТоваровНаСкладахОстатки.Номенклатура
    |ИТОГИ
    | СУММА(Стоимость),
    | МАКСИМУМ(СуммаРаспределения)
    |ПО
    | Номенклатура";

    Запрос.УстановитьПараметр("СписокРаспределения", СписокРаспределения.Выгрузить());
    Запрос.УстановитьПараметр("ДатаАктуальности", Дата);

    ВыборкаПоНоменклатуре = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам, "Номенклатура");
    Пока ВыборкаПоНоменклатуре.Следующий() Цикл
    Если ВыборкаПоНоменклатуре.СуммаРаспределения = 0 Тогда
    Продолжить;
    КонецЕсли;

    ИтоговаяСтоимостьПартий = ВыборкаПоНоменклатуре.Стоимость;
    ВыборкаДетали = ВыборкаПоНоменклатуре.Выбрать();

    РаспределеннаяСебестоимость = 0;
    Для Индекс = 1 По ВыборкаДетали.Количество() - 1 Цикл
    ВыборкаДетали.Следующий();

    ДоляОтОбщейСебестоимости = ВыборкаДетали.Стоимость / ИтоговаяСтоимостьПартий;
    ДобавяемаяСтоимость = ДоляОтОбщейСебестоимости * ВыборкаПоНоменклатуре.СуммаРаспределения;
    РаспределеннаяСебестоимость = РаспределеннаяСебестоимость + Окр(ДобавяемаяСтоимость, 2);

    Движение = Движения.ПартииТоваровНаСкладах.ДобавитьРасход();
    Движение.Период = Дата;
    Движение.Регистратор = Ссылка;
    Движение.Номенклатура = ВыборкаДетали.Номенклатура;
    Движение.Склад = ВыборкаДетали.Склад;
    Движение.ДокументОприходования = ВыборкаДетали.ДокументОприходования;
    Если СнижатьУвеличиватьСебестоимость = 0 Тогда
    Движение.Стоимость = ДобавяемаяСтоимость;
    Иначе
    Движение.Стоимость = - ДобавяемаяСтоимость;
    КонецЕсли;
    КонецЦикла;

    ВыборкаДетали.Следующий();

    ДобавяемаяСтоимость = ВыборкаПоНоменклатуре.СуммаРаспределения - РаспределеннаяСебестоимость;

    Движение = Движения.ПартииТоваровНаСкладах.ДобавитьРасход();
    Движение.Период = Дата;
    Движение.Регистратор = Ссылка;
    Движение.Номенклатура = ВыборкаДетали.Номенклатура;
    Движение.Склад = ВыборкаДетали.Склад;
    Движение.ДокументОприходования = ВыборкаДетали.ДокументОприходования;
    Если СнижатьУвеличиватьСебестоимость = 0 Тогда
    Движение.Стоимость = ДобавяемаяСтоимость;
    Иначе
    Движение.Стоимость = - ДобавяемаяСтоимость;
    КонецЕсли;

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