Всем привет! Друзья, заранее прошу не ругать за наглость. Прошу помощи, подскажите, как можно оптимизировать эту процедуру.

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

    Для Каждого Стр из Документ.Товары цикл
    ТекДень = Документ.НачНедели;
    ОбщееКоличество = 0;
    ОбшаяСумма = 0;
    сч = 0;
    //Стр.Цена = УзнатьЦенуНоменклатуры(стр.Номенклатура);

    Пока сч<=7 цикл
    сч = сч+1;

    Запрос.УстановитьПараметр("ДатаНач", НачалоДня(ТекДень));
    Запрос.УстановитьПараметр("ДатаКон", КонецДня(ТекДень));
    Запрос.УстановитьПараметр("Номенклатура",Стр.Номенклатура);
    Выборка = Запрос.Выполнить().Выбрать();
    Выборка.Следующий();
    Если сч = 1 тогда
    Стр.ДеньНедели1 = Выборка.Количество;
    Стр.ЦенаДень1 = Выборка.сумма;
    ОбщееКоличество = ОбщееКоличество+?(ЗначениеЗаполнено(Выборка.Количество),Выборка.Количество,0);
    ОбшаяСумма = ОбшаяСумма+ ?(ЗначениеЗаполнено(Выборка.сумма),Выборка.сумма,0);
    ИначеЕсли сч = 2 тогда
    Стр.ДеньНедели2 = Выборка.Количество;
    Стр.ЦенаДень2 = Выборка.сумма;
    ОбщееКоличество =ОбщееКоличество+?(ЗначениеЗаполнено(Выборка.Количество),Выборка.Количество,0);;
    ОбшаяСумма = ОбшаяСумма+ ?(ЗначениеЗаполнено(Выборка.сумма),Выборка.сумма,0);

    ИначеЕсли сч = 3 тогда
    Стр.ДеньНедели3 = Выборка.Количество;
    Стр.ЦенаДень3 = Выборка.сумма;
    ОбщееКоличество =ОбщееКоличество+?(ЗначениеЗаполнено(Выборка.Количество),Выборка.Количество,0);;
    ОбшаяСумма = ОбшаяСумма+ ?(ЗначениеЗаполнено(Выборка.сумма),Выборка.сумма,0);

    ИначеЕсли сч = 4 тогда
    Стр.ДеньНедели4 = Выборка.Количество;
    Стр.ЦенаДень4 = Выборка.сумма;
    ОбщееКоличество =ОбщееКоличество+?(ЗначениеЗаполнено(Выборка.Количество),Выборка.Количество,0);;
    ОбшаяСумма = ОбшаяСумма+ ?(ЗначениеЗаполнено(Выборка.сумма),Выборка.сумма,0);

    ИначеЕсли сч = 5 тогда
    Стр.ДеньНедели5 = Выборка.Количество;
    Стр.ЦенаДень5 = Выборка.сумма;
    ОбщееКоличество =ОбщееКоличество+?(ЗначениеЗаполнено(Выборка.Количество),Выборка.Количество,0);;
    ОбшаяСумма = ОбшаяСумма+ ?(ЗначениеЗаполнено(Выборка.сумма),Выборка.сумма,0);

    ИначеЕсли сч = 6 тогда
    Стр.ДеньНедели6 = Выборка.Количество;
    Стр.ЦенаДень6 = Выборка.сумма;
    ОбщееКоличество =ОбщееКоличество+?(ЗначениеЗаполнено(Выборка.Количество),Выборка.Количество,0);;
    ОбшаяСумма = ОбшаяСумма+ ?(ЗначениеЗаполнено(Выборка.сумма),Выборка.сумма,0);

    ИначеЕсли сч = 7 тогда
    Стр.ДеньНедели7 = Выборка.Количество;
    Стр.ЦенаДень7 = Выборка.сумма;
    ОбщееКоличество =ОбщееКоличество+?(ЗначениеЗаполнено(Выборка.Количество),Выборка.Количество,0);;
    ОбшаяСумма = ОбшаяСумма+ ?(ЗначениеЗаполнено(Выборка.сумма),Выборка.сумма,0);
    Если не ОбшаяСумма =0 И не ОбщееКоличество = 0 Тогда
    Стр.СредняяЦена = ОбшаяСумма/ОбщееКоличество;
    КонецЕсли;
    Стр.ОстатокПоСистеме = стр.Отправлено - ОбщееКоличество;
    Стр.Продано = ОбщееКоличество;
    КонецЕсли;
    ТекДень = ТекДень+86400;
    КонецЦикла;

    КонецЦикла;
    Документ.Товары.Сортировать("Номенклатура");
    //Документ.Записать();
    КонецПроцедуры
```

Код заполняет табличную часть документа. Не смог ничего лучшего придумать... Этот, прости Господи, код слишком долго отрабатывает. Если не сложно, дайте пару советов. Спасибо!
---
Ну как-то так:

```1c
    Процедура Заполнить(Документ)
    //МассивНоменклатуры = Товары.ВыгрузитьКолонку("Номенклатура");
    //сч = 0;
    //ТекДень = НачНедели;
    //ОбщееКоличество = 0;
    //ОбшаяСумма = 0;
    Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ
    | ПродажиОбороты.Номенклатура,
    | ПродажиОбороты.КоличествоОборот КАК Количество,
    | ПродажиОбороты.СтоимостьОборот КАК Сумма,
    | ПродажиОбороты.Период
    |ИЗ
    | РегистрНакопления.Продажи.Обороты(
    | &ДатаНач,
    | &ДатаКон,
    | День,
    | Номенклатура В (&МассивНоменклатуры)
    | И Подразделение = &Подразделение) КАК ПродажиОбороты";
    Запрос.УстановитьПараметр("Подразделение",Документ.Подразделение);
    Запрос.УстановитьПараметр("ДатаНач", НачалоДня(Документ.НачНедели));
    Запрос.УстановитьПараметр("ДатаКон", КонецДня(НачалоДня(Документ.НачНедели) + 6 * 86400));
    Запрос.УстановитьПараметр("МассивНоменклатуры", Документ.Товары.ВыгрузитьКолонку("Номенклатура"));

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

    Отбор = Новый Структура("Номенклатура, Период");

    Для Каждого Стр из Документ.Товары цикл
    ТекДень = НачалоДня(Документ.НачНедели);
    ОбщееКоличество = 0;
    ОбшаяСумма = 0;
    сч = 0;
    //Стр.Цена = УзнатьЦенуНоменклатуры(стр.Номенклатура);

    Пока сч<=7 цикл
    сч = сч+1;

    Отбор.Номенклатура = Стр.Номенклатура;
    Отбор.Период = ТекДень;

    СтрокиТЗ = ТЗ.НайтиСтроки(Отбор);
    Если СтрокиТЗ.Количество() Тогда
    Выборка = СтрокиТЗ[0]; //В теории больше 1 строки быть не может
    Иначе //Обороты по номенклатуре за этот день не найдены
    ТекДень = ТекДень+86400;

    //Костыль, лень было обрабатывать ситуацию, когда в последний день не было оборотов
    //но надо выполнить код
    Если сч = 7 тогда
    Если не ОбшаяСумма =0 И не ОбщееКоличество = 0 Тогда
    Стр.СредняяЦена = ОбшаяСумма/ОбщееКоличество;
    КонецЕсли;
    Стр.ОстатокПоСистеме = стр.Отправлено - ОбщееКоличество;
    Стр.Продано = ОбщееКоличество;
    КонецЕсли;

    Продолжить;
    КонецЕсли;

    Если сч = 1 тогда
    Стр.ДеньНедели1 = Выборка.Количество;
    Стр.ЦенаДень1 = Выборка.сумма;
    ОбщееКоличество = ОбщееКоличество+?(ЗначениеЗаполнено(Выборка.Количество),Выборка.Количество,0);
    ОбшаяСумма = ОбшаяСумма+ ?(ЗначениеЗаполнено(Выборка.сумма),Выборка.сумма,0);
    ИначеЕсли сч = 2 тогда
    Стр.ДеньНедели2 = Выборка.Количество;
    Стр.ЦенаДень2 = Выборка.сумма;
    ОбщееКоличество =ОбщееКоличество+?(ЗначениеЗаполнено(Выборка.Количество),Выборка.Количество,0);;
    ОбшаяСумма = ОбшаяСумма+ ?(ЗначениеЗаполнено(Выборка.сумма),Выборка.сумма,0);

    ИначеЕсли сч = 3 тогда
    Стр.ДеньНедели3 = Выборка.Количество;
    Стр.ЦенаДень3 = Выборка.сумма;
    ОбщееКоличество =ОбщееКоличество+?(ЗначениеЗаполнено(Выборка.Количество),Выборка.Количество,0);;
    ОбшаяСумма = ОбшаяСумма+ ?(ЗначениеЗаполнено(Выборка.сумма),Выборка.сумма,0);

    ИначеЕсли сч = 4 тогда
    Стр.ДеньНедели4 = Выборка.Количество;
    Стр.ЦенаДень4 = Выборка.сумма;
    ОбщееКоличество =ОбщееКоличество+?(ЗначениеЗаполнено(Выборка.Количество),Выборка.Количество,0);;
    ОбшаяСумма = ОбшаяСумма+ ?(ЗначениеЗаполнено(Выборка.сумма),Выборка.сумма,0);

    ИначеЕсли сч = 5 тогда
    Стр.ДеньНедели5 = Выборка.Количество;
    Стр.ЦенаДень5 = Выборка.сумма;
    ОбщееКоличество =ОбщееКоличество+?(ЗначениеЗаполнено(Выборка.Количество),Выборка.Количество,0);;
    ОбшаяСумма = ОбшаяСумма+ ?(ЗначениеЗаполнено(Выборка.сумма),Выборка.сумма,0);

    ИначеЕсли сч = 6 тогда
    Стр.ДеньНедели6 = Выборка.Количество;
    Стр.ЦенаДень6 = Выборка.сумма;
    ОбщееКоличество =ОбщееКоличество+?(ЗначениеЗаполнено(Выборка.Количество),Выборка.Количество,0);;
    ОбшаяСумма = ОбшаяСумма+ ?(ЗначениеЗаполнено(Выборка.сумма),Выборка.сумма,0);

    ИначеЕсли сч = 7 тогда
    Стр.ДеньНедели7 = Выборка.Количество;
    Стр.ЦенаДень7 = Выборка.сумма;
    ОбщееКоличество =ОбщееКоличество+?(ЗначениеЗаполнено(Выборка.Количество),Выборка.Количество,0);;
    ОбшаяСумма = ОбшаяСумма+ ?(ЗначениеЗаполнено(Выборка.сумма),Выборка.сумма,0);
    Если не ОбшаяСумма =0 И не ОбщееКоличество = 0 Тогда
    Стр.СредняяЦена = ОбшаяСумма/ОбщееКоличество;
    КонецЕсли;
    Стр.ОстатокПоСистеме = стр.Отправлено - ОбщееКоличество;
    Стр.Продано = ОбщееКоличество;
    КонецЕсли;
    ТекДень = ТекДень+86400;
    КонецЦикла;

    КонецЦикла;
    Документ.Товары.Сортировать("Номенклатура");
    //Документ.Записать();
    КонецПроцедуры
```

Прям все переписывать не стал, можно было и итоги в запрос добавить, и убрать проверку ЗначениеЗаполнено(оно там не надо), и использовать выборку вместо таблицызначений (1С рекомендует именно так), но должно работать быстрее
---
Долго потому что запрос в цикле, вынести его из цикла
Первым циклом собрать параметры для выполнения запроса, потом выполнить запрос, и уже вторым циклом заполнять ТЧ, беря данные из выборки
---
может такой запрос подойдет?

```1c
    ВЫБРАТЬ
    ПродажиОбороты.Период КАК Период,
    ПродажиОбороты.Номенклатура КАК Номенклатура,
    СУММА(ПродажиОбороты.КоличествоОборот) КАК Количество,
    СУММА(ПродажиОбороты.СтоимостьОборот) КАК Сумма
    ИЗ
    РегистрНакопления.Продажи.Обороты(&НачДата, &КонДата, День, Номенклатура В (&СписокНоменклатуры)) КАК ПродажиОбороты

    СГРУППИРОВАТЬ ПО
    ПродажиОбороты.Период,
    ПродажиОбороты.Номенклатура
    ИТОГИ
    СУММА(Количество),
    СУММА(Сумма)
    ПО
    ОБЩИЕ,
    Номенклатура
```
---
Ну как-то так:

```1c
    Процедура Заполнить(Документ)
    //МассивНоменклатуры = Товары.ВыгрузитьКолонку("Номенклатура");
    //сч = 0;
    //ТекДень = НачНедели;
    //ОбщееКоличество = 0;
    //ОбшаяСумма = 0;
    Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ
    | ПродажиОбороты.Номенклатура,
    | ПродажиОбороты.КоличествоОборот КАК Количество,
    | ПродажиОбороты.СтоимостьОборот КАК Сумма,
    | ПродажиОбороты.Период
    |ИЗ
    | РегистрНакопления.Продажи.Обороты(
    | &ДатаНач,
    | &ДатаКон,
    | День,
    | Номенклатура В (&МассивНоменклатуры)
    | И Подразделение = &Подразделение) КАК ПродажиОбороты";
    Запрос.УстановитьПараметр("Подразделение",Документ.Подразделение);
    Запрос.УстановитьПараметр("ДатаНач", НачалоДня(Документ.НачНедели));
    Запрос.УстановитьПараметр("ДатаКон", КонецДня(НачалоДня(Документ.НачНедели) + 6 * 86400));
    Запрос.УстановитьПараметр("МассивНоменклатуры", Документ.Товары.ВыгрузитьКолонку("Номенклатура"));

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

    Отбор = Новый Структура("Номенклатура, Период");

    Для Каждого Стр из Документ.Товары цикл
    ТекДень = НачалоДня(Документ.НачНедели);
    ОбщееКоличество = 0;
    ОбшаяСумма = 0;
    сч = 0;
    //Стр.Цена = УзнатьЦенуНоменклатуры(стр.Номенклатура);

    Пока сч<=7 цикл
    сч = сч+1;

    Отбор.Номенклатура = Стр.Номенклатура;
    Отбор.Период = ТекДень;

    СтрокиТЗ = ТЗ.НайтиСтроки(Отбор);
    Если СтрокиТЗ.Количество() Тогда
    Выборка = СтрокиТЗ[0]; //В теории больше 1 строки быть не может
    Иначе //Обороты по номенклатуре за этот день не найдены
    ТекДень = ТекДень+86400;

    //Костыль, лень было обрабатывать ситуацию, когда в последний день не было оборотов
    //но надо выполнить код
    Если сч = 7 тогда
    Если не ОбшаяСумма =0 И не ОбщееКоличество = 0 Тогда
    Стр.СредняяЦена = ОбшаяСумма/ОбщееКоличество;
    КонецЕсли;
    Стр.ОстатокПоСистеме = стр.Отправлено - ОбщееКоличество;
    Стр.Продано = ОбщееКоличество;
    КонецЕсли;

    Продолжить;
    КонецЕсли;

    Если сч = 1 тогда
    Стр.ДеньНедели1 = Выборка.Количество;
    Стр.ЦенаДень1 = Выборка.сумма;
    ОбщееКоличество = ОбщееКоличество+?(ЗначениеЗаполнено(Выборка.Количество),Выборка.Количество,0);
    ОбшаяСумма = ОбшаяСумма+ ?(ЗначениеЗаполнено(Выборка.сумма),Выборка.сумма,0);
    ИначеЕсли сч = 2 тогда
    Стр.ДеньНедели2 = Выборка.Количество;
    Стр.ЦенаДень2 = Выборка.сумма;
    ОбщееКоличество =ОбщееКоличество+?(ЗначениеЗаполнено(Выборка.Количество),Выборка.Количество,0);;
    ОбшаяСумма = ОбшаяСумма+ ?(ЗначениеЗаполнено(Выборка.сумма),Выборка.сумма,0);

    ИначеЕсли сч = 3 тогда
    Стр.ДеньНедели3 = Выборка.Количество;
    Стр.ЦенаДень3 = Выборка.сумма;
    ОбщееКоличество =ОбщееКоличество+?(ЗначениеЗаполнено(Выборка.Количество),Выборка.Количество,0);;
    ОбшаяСумма = ОбшаяСумма+ ?(ЗначениеЗаполнено(Выборка.сумма),Выборка.сумма,0);

    ИначеЕсли сч = 4 тогда
    Стр.ДеньНедели4 = Выборка.Количество;
    Стр.ЦенаДень4 = Выборка.сумма;
    ОбщееКоличество =ОбщееКоличество+?(ЗначениеЗаполнено(Выборка.Количество),Выборка.Количество,0);;
    ОбшаяСумма = ОбшаяСумма+ ?(ЗначениеЗаполнено(Выборка.сумма),Выборка.сумма,0);

    ИначеЕсли сч = 5 тогда
    Стр.ДеньНедели5 = Выборка.Количество;
    Стр.ЦенаДень5 = Выборка.сумма;
    ОбщееКоличество =ОбщееКоличество+?(ЗначениеЗаполнено(Выборка.Количество),Выборка.Количество,0);;
    ОбшаяСумма = ОбшаяСумма+ ?(ЗначениеЗаполнено(Выборка.сумма),Выборка.сумма,0);

    ИначеЕсли сч = 6 тогда
    Стр.ДеньНедели6 = Выборка.Количество;
    Стр.ЦенаДень6 = Выборка.сумма;
    ОбщееКоличество =ОбщееКоличество+?(ЗначениеЗаполнено(Выборка.Количество),Выборка.Количество,0);;
    ОбшаяСумма = ОбшаяСумма+ ?(ЗначениеЗаполнено(Выборка.сумма),Выборка.сумма,0);

    ИначеЕсли сч = 7 тогда
    Стр.ДеньНедели7 = Выборка.Количество;
    Стр.ЦенаДень7 = Выборка.сумма;
    ОбщееКоличество =ОбщееКоличество+?(ЗначениеЗаполнено(Выборка.Количество),Выборка.Количество,0);;
    ОбшаяСумма = ОбшаяСумма+ ?(ЗначениеЗаполнено(Выборка.сумма),Выборка.сумма,0);
    Если не ОбшаяСумма =0 И не ОбщееКоличество = 0 Тогда
    Стр.СредняяЦена = ОбшаяСумма/ОбщееКоличество;
    КонецЕсли;
    Стр.ОстатокПоСистеме = стр.Отправлено - ОбщееКоличество;
    Стр.Продано = ОбщееКоличество;
    КонецЕсли;
    ТекДень = ТекДень+86400;
    КонецЦикла;

    КонецЦикла;
    Документ.Товары.Сортировать("Номенклатура");
    //Документ.Записать();
    КонецПроцедуры
```

Прям все переписывать не стал, можно было и итоги в запрос добавить, и убрать проверку ЗначениеЗаполнено(оно там не надо), и использовать выборку вместо таблицызначений (1С рекомендует именно так), но должно работать быстрее
---
у тебя цикл в цикле из-за этого огромная проблема в производительности.
Как минимум тебе нужно убрать цикл с 7 днями.
Для этого тебе нужно написать 7 запросов и объединить их конструкцией объединить все.
Если туго с запросами иди учи курсы по запросам 5 часов на ютубе бесплатно автор кузнецов.

Как минумум в 7 раз быстрее будет работать!

А если убрать цикл с перебором номенклатуры так и вообще в ннадцать раз быстрее станет! И чем больше строк номенклатуры тем быстрее будет.

Плюс ко всему все что можно вычислить без цикла нужно выносить из него.

Но главная проблема не цикл в цикле, а выполнение запроса = количество строк таблицы * 7.
Так что на сколько ты хочешь оптимизировать решай сам, но самое простое убрать эти 7 циклов!
---
Согласен. Но как же мне вынести запрос из цикла, если параметры каждый раз меняются?
Для наглядности, прикладываю скрин табличной части
---
как же мне вынести запрос из цикла, если параметры каждый раз меняются? По номенклатуре: сначала заполнить из ТЧ документа массив нужных значений номенклатуры и в запросе сделать выборку по вхождению в этот массив: https://forum.infostart.ru/forum9/topic87718/

По датам: сделать запрос с начала по конец недели с детализацией по дням и в цикле выбирать как раз дневные итоги: https://forum.infostart.ru/forum9/topic51621/

Готовый код не напишу - семерочник аз есмь. :)

Но даже в 7.7 такое возможно - нужную номенклатуру в список значений, запрос с детализацией по дням и выбирать периоды.
---
Все вычисления нужно сделать запросом. он сложный. но всё это надо написать одним запросом. Параметров в этом запросе быть вообще не должно. а вот обработка уже в цикле.

написать могу но не за 10 стартмани и нужен СФ (если надо пиши в личку).

здесь просто нужно соблюдать стандарты разработки 1С и уметь пользоваться конструктором запросов.
---
За запрос в цикле надо отрывать руки.

//Костыль, лень было обрабатывать ситуацию, когда в последний день не было оборотов
 //но надо выполнить код

Что можно посоветовать человеку который из-за лени делает костыли? А код это жесть извращение. Решать задачу надо как-то так.

Вот код к решению задачи 1.1 из сборника на специалиста.

```1c
    Процедура ОбработкаПроведения(Отказ, Режим)

    // Чтение метода списания себестоимости
    МетодСписания = РегистрыСведений.УчетнаяПолитика.ПолучитьПоследнее(Дата).МетодСписания;

    Если МетодСписания.Пустая() Тогда
    Сообщение = Новый СообщениеПользователю;
    Сообщение.Текст = "Учетная политика не определена!";
    Сообщение.Сообщить();

    Отказ = Истина;
    Возврат;
    КонецЕсли;

    СортировкаПартий = ?(МетодСписания = Перечисления.УчетнаяПолитика.ФИФО, ", " УБЫВ");

    Движения.Продажи.Записывать = Истина;
    Движения.ОстаткиНоменклатуры.Записывать = Истина;

    // Удаление предыдущих движений документа
    Движения.ОстаткиНоменклатуры.Записать();

    // Блокировка данных
    Блокировка = Новый БлокировкаДанных;
    ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.ОстаткиНоменклатуры");
    ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
    ЭлементБлокировки.ИсточникДанных = СписокНоменклатуры;
    ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Номенклатура", "Номенклатура");

    Блокировка.Заблокировать();

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

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

    Результат = Запрос.Выполнить();
    ВыборкаНоменклатура = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);

    Пока ВыборкаНоменклатура.Следующий() Цикл

    // Контроль остатков
    Если (НЕ ВыборкаНоменклатура.Услуга)
    И (ВыборкаНоменклатура.Количество > ВыборкаНоменклатура.КоличествоОстаток) Тогда

    Сообщение = Новый СообщениеПользователю;
    Сообщение.Текст = "Не хватает "+ (ВыборкаНоменклатура.Количество-ВыборкаНоменклатура.КоличествоОстаток) +
    " позиций номенклатуры " + ВыборкаНоменклатура.Номенклатура + ".";
    Сообщение.Сообщить();

    Отказ = Истина;
    КонецЕсли;

    Если Отказ Тогда
    Продолжить;
    КонецЕсли;

    // Создание движений
    ТекСебестоимость = 0;

    Если не ВыборкаНоменклатура.Услуга Тогда

    ОсталосьСписать = ВыборкаНоменклатура.Количество;
    ВыборкаДетальныеЗаписи = ВыборкаНоменклатура.Выбрать();

    Пока (ОсталосьСписать > 0) И ВыборкаДетальныеЗаписи.Следующий() Цикл
    Списываем = Мин(ОсталосьСписать, ВыборкаДетальныеЗаписи.КоличествоОстаток);

    // регистр ОстаткиНоменклатуры Расход
    Движение = Движения.ОстаткиНоменклатуры.Добавить();
    Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
    Движение.Период = Дата;
    Движение.Номенклатура = ВыборкаДетальныеЗаписи.Номенклатура;
    Движение.Партия = ВыборкаДетальныеЗаписи.Партия;
    Движение.Количество = Списываем;
    Движение.Стоимость = (Списываем * ВыборкаДетальныеЗаписи.СтоимостьОстаток) /
    ВыборкаДетальныеЗаписи.КоличествоОстаток;

    ТекСебестоимость = ТекСебестоимость + Движение.Стоимость;
    ОсталосьСписать = ОсталосьСписать - Списываем;
    КонецЦикла;
    КонецЕсли;

    // регистр Продажи
    Движение = Движения.Продажи.Добавить();
    Движение.Период = Дата;
    Движение.Номенклатура = ВыборкаНоменклатура.Номенклатура;
    Движение.Количество = ВыборкаНоменклатура.Количество;
    Движение.Себестоимость = ТекСебестоимость;
    Движение.Выручка = ВыборкаНоменклатура.Сумма;
    КонецЦикла;

    КонецПроцедуры
```

Думаю его легко можно переписать под ваши нужды. Сама идея как берется список номенклатуры и как производится контроль остатков думаю понятен.
---
Что можно посоветовать человеку который из-за лени делает костыли? А код это жесть извращение. Решать задачу надо как-то так.
Лень было мне, потому что код чужой, поэтому просто скопировал кусок кода и все, оптимизировал самое важное, остались красивости, которые не сильно влияют на производительность

(8) Вот код к решению задачи 1.1 из сборника на специалиста.
Зачем прикладывать левый кусок кода, который тут ни к селу, ни к огороду? ТС не очень умеет писать, поэтому и просит помочь за $m

(8) Сообщение.Текст = "Не хватает "+ (ВыборкаНоменклатура.Количество-ВыборкаНоменклатура.КоличествоОстаток) +
                              " позиций номенклатуры " + ВыборкаНоменклатура.Номенклатура + ".";
А вот тут тоже запрос в цикле, сами догадаетесь почему?
---
<<<Сообщение.Текст = "Не хватает "+ (ВыборкаНоменклатура.Количество-ВыборкаНоменклатура.КоличествоОстаток) +
" позиций номенклатуры " + ВыборкаНоменклатура.Номенклатура + "."; >>>
А вот тут тоже запрос в цикле, сами догадаетесь почему?
вот мне бы хотелось это узнать?
---
Идите проспитесь мусье. Тут все в тему. Пусть учится.

```1c
    Лень было мне, потому что код чужой, поэтому просто скопировал кусок кода и все, оптимизировал самое важное, остались красивости, которые не сильно влияют на производительность
```

Оптимизировал самое важное - ну да молодец. оптимизация заведомо не корректного подхода. Автоваз готов. Так все в этой стране. Вместо того чтобы все сразу делать правильно - мы клепаем автовазы.
---
Идите проспитесь мусье. Тут все в тему. Пусть учится.
Списание по партиям и заполнение продаж за неделю, очень все в тему.

(12) оптимизация заведомо не корректного подхода.
Разница в производительности будет несущественна, работать будет и так. Надо понимать, когда оптимизация даст ощутимое ускорение, а когда не очень. На частичный рефакторинг ушло 10 минут, чтобы переписать все заново, ушло бы времени больше, а толку все равно было бы мало

(11) вот мне бы хотелось это узнать?
Преобразование Ссылки в строку(понятную для пользователя, вида "Жвачка Мятная") строит неявный запрос к БД, чтобы получить представление ссылки
---
Преобразование Ссылки в строку(понятную для пользователя, вида "Жвачка Мятная") строит неявный запрос к БД, чтобы получить представление ссылки
ах об этом. ясно. спасибо.
---
Друзья, огромное спасибо всем, кто откликнулся! Арман, ты дал готовое решение, пусть и с "костылями", их я поправлю.
Да, запросы я не умею писать. Xer shi, твой совет не оставлю без внимания. Иван, видимо я слишком туп, чтоб понять твои комментарии. Но это не камень в твой огород, это моя проблема) Спасибо и тебе!