Здравствуйте, подскажите пожалуйста как можно ускорить выполнение этой процедуры?
Как понимаю что-то нужно сделать с помощью "ИТОГИ ПО" в запросе.

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

    ДатаЗначение = ТекущаяДата() + 60 * 60 * 24 * 3;

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

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

    Для Каждого Значение Из Результат Цикл

    Документ = Значение.Ссылка.ПолучитьОбъект();

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

    Для Каждого Товар Из НС Цикл

    Товар.ВариантОбеспечения = Перечисления.ВариантыОбеспечения.НеТребуется;

    КонецЦикла;

    Попытка
    Документ.Записать(РежимЗаписиДокумента.Проведение);
    Исключение
    ОбщегоНазначенияКлиентСервер.СообщитьПользователю("+Документ.Ссылка+": "+ОписаниеОшибки());
    КонецПопытки;

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

    ДатаЗначение = ТекущаяДата() + 60 * 60 * 24 * 3;

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

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

    Пока Результат .Следующий() Цикл

    Документ = Результат.Ссылка.ПолучитьОбъект();

    Значение= Результат .Выбрать();
    Пока Значение.Следующий() Цикл

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

    Для Каждого Товар Из НС Цикл

    Товар.ВариантОбеспечения = Перечисления.ВариантыОбеспечения.НеТребуется;

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

    Попытка
    Документ.Записать(РежимЗаписиДокумента.Проведение);
    Исключение
    ОбщегоНазначенияКлиентСервер.СообщитьПользователю("+Документ.Ссылка+": "+ОписаниеОшибки());
    КонецПопытки;

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

чтото вроде такого ускорит
---
не проще ли для таких целей использовать типовую обработку "Групповое изменение реквизитов"?
В отборе установите необходимые условия и потом для ТЧ Товары установите новое значение для реквизита Вариант обеспечения
---
НС = Документ.Товары.НайтиСтроки(Новый Структура("Номенклатура,Вариант",Значение.Номенклатура, Перечисления.ВариантыОбеспечения.Отгрузить));

        Для Каждого Товар Из НС Цикл

            Товар.ВариантОбеспечения = Перечисления.ВариантыОбеспечения.НеТребуется;

        КонецЦикла;

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

    ДатаЗначение = ТекущаяДата() + 60 * 60 * 24 * 3;

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

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

    Пока Результат .Следующий() Цикл

    Документ = Результат.Ссылка.ПолучитьОбъект();

    Значение= Результат .Выбрать();
    Пока Значение.Следующий() Цикл

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

    Для Каждого Товар Из НС Цикл

    Товар.ВариантОбеспечения = Перечисления.ВариантыОбеспечения.НеТребуется;

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

    Попытка
    Документ.Записать(РежимЗаписиДокумента.Проведение);
    Исключение
    ОбщегоНазначенияКлиентСервер.СообщитьПользователю("+Документ.Ссылка+": "+ОписаниеОшибки());
    КонецПопытки;

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

чтото вроде такого ускорит
---
спасибо вам большое
---
Добавьте проверку, что документ модифицирован, чтобы зря не записывать, если ничего не менялось.

```1c
    Если Документ.Модифицированность() Тогда
    Попытка
    Документ.Записать(РежимЗаписиДокумента.Проведение);
    Исключение
    ОбщегоНазначенияКлиентСервер.СообщитьПользователю("+Документ.Ссылка+": "+ОписаниеОшибки());
    КонецПопытки;
    КонецЕсли;
```
---
замер производительности делали? Он покажет какие операции долго выполняются.

В запросе в строке
зачем проверять документы на ПРОВЕДЕННОСТЬ, вы же данные получаете из регистра.
Зачем на пустую дату проверять.?
---
тут скорее всего основное время это запись документов... а где замер производительности, я что-то не заметил?
По-моему тут логичнее в выборке оставить только уникальные документы, а так, как сейчас написано, можно один и тот же документ много раз записывать, непонятно зачем.
---
Запись документов как я понимаю можно как-то ускорить с помощью итогов в запросе и еще чего-то, нигде не могу найти темы про это(
---
нет, нельзя
---
Можно попробовать в транзакцию обернуть запись документов, например по 20 шт. в одной транзакции записывать. Но это такое себе при некоторых сценариях использования.
---
А еще можно в запросе отсечь документы с нужным вариантом обеспечения чтоб не менять на то же самое и перепроводить.