Посоветуйте обработку для тонкого клиента (УФ), которая позволит перепровести 4000 документов с открытием формы и вызовом метода Записать() (у формы) на клиенте. Франч подбросил "свинью", реализовав логику ПередЗаписью() в форме на стороне клиента, теперь ни одна групповая обработка документов не помогает.
---
навскидку, считаем что коллекция объектов уже заполнена

```1c
    &НаКлиенте
    Процедура Команда1(Команда)

    // ТаблицаОбъектов - таблица значений
    // Ссылка = ДокументСсылка
    // ОписаниеОбъекта - строка

    ПараметрыЗаписи = Новый Структура("РежимЗаписи, РежимПроведения",
    РежимЗаписиДокумента.Проведение,
    РежимПроведенияДокумента.Неоперативный);
    ПараметырФормы = Новый Структура("Ключ");

    Для Каждого ОписаниеОбъекта Из ТаблицаОбъектов Цикл

    ПараметырФормы.Ключ = ОписаниеОбъекта.Ссылка;
    Ф = ОткрытьФорму("Документ." + ОписаниеОбъекта.ТипДокумента + ".ФормаОбъекта", ПараметырФормы);
    Ф.Записать(ПараметрыЗаписи);
    Ф.Закрыть();

    КонецЦикла;
```
---
Не проще логику перетащить в модуль объекта?
---
На работе и так завал. Перетаскивать логику с клиента на сервер, а потом еще и ловить косяки связанные с тем, что какие-то элементы формы не обновились после записи документа из формы это дополнительный возможный головняк.
---
навскидку, считаем что коллекция объектов уже заполнена

```1c
    &НаКлиенте
    Процедура Команда1(Команда)

    // ТаблицаОбъектов - таблица значений
    // Ссылка = ДокументСсылка
    // ОписаниеОбъекта - строка

    ПараметрыЗаписи = Новый Структура("РежимЗаписи, РежимПроведения",
    РежимЗаписиДокумента.Проведение,
    РежимПроведенияДокумента.Неоперативный);
    ПараметырФормы = Новый Структура("Ключ");

    Для Каждого ОписаниеОбъекта Из ТаблицаОбъектов Цикл

    ПараметырФормы.Ключ = ОписаниеОбъекта.Ссылка;
    Ф = ОткрытьФорму("Документ." + ОписаниеОбъекта.ТипДокумента + ".ФормаОбъекта", ПараметырФормы);
    Ф.Записать(ПараметрыЗаписи);
    Ф.Закрыть();

    КонецЦикла;
```
---
В общем я так и предполагал сделать. С некоторыми доработками получилось такое:

```1c
    &НаКлиенте
    Процедура Команда1(Команда)

    ТаблицаОбъектов = ПолучитьОбъектыДляОбработки();

    ПараметрыЗаписи = Новый Структура("РежимЗаписи, РежимПроведения",
    РежимЗаписиДокумента.Проведение,
    РежимПроведенияДокумента.Неоперативный);
    ПараметырФормы = Новый Структура("Ключ");

    Ошибки = Неопределено;

    Для Каждого ОписаниеОбъекта Из ТаблицаОбъектов Цикл

    Попытка

    // На случай если что-то пошло не так. В фоновое задание вынести невозможно, так как идет работа с формами.
    ОбработкаПрерыванияПользователя();
    ПараметырФормы.Ключ = ОписаниеОбъекта.Ссылка;
    Ф = ОткрытьФорму(ОписаниеОбъекта.ТипДокумента + ".ФормаОбъекта", ПараметырФормы);

    ИзменитьОбъект(Ф, ОписаниеОбъекта);

    Успех = Ф.Записать(ПараметрыЗаписи);

    // Если при проверке заполнения выявлены ошибки, то исключения не будет. Как-то зафиксировать что именно
    // не нравится программе не представляется возможным. Тут можно просто собирать неудачные объекты в массив
    // и записывать в конце обработки в журнал их список
    Если Не Успех Тогда

    // Подавляем вопрос пользователю о необходимости сохранить сделанные изменения в форме
    Ф.Модифицированность = Ложь;

    КонецЕсли;

    Если Ф.Открыта() Тогда

    Ф.Закрыть();

    КонецЕсли;

    // На случай непредвиденных ошибок, чтобы не прерывать процесс если ставим "на ночь"
    Исключение

    ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
    ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстОшибки, ОписаниеОбъекта.Ссылка);
    ЗаписатьОшибку(ТекстОшибки, ОписаниеОбъекта.Ссылка);

    Если Ф.Открыта() Тогда

    // Подавляем вопрос пользователю о необходимости сохранить сделанные изменения в форме
    Ф.Модифицированность = Ложь;
    Ф.Закрыть();

    КонецЕсли;

    КонецПопытки;

    КонецЦикла;

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

    &НаКлиенте
    Процедура ИзменитьОбъект(Ф, ОписаниеОбъекта)

    ОбъектФормы = Ф.Объект;

    ОбъектФормы.Реквизит3 = Истина;
    ОбъектФормы.Реквизит4 = ОписаниеОбъекта.Реквизит2;
    Ф.Модифицированность = Истина;

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

    &НаСервереБезКонтекста
    Функция ПолучитьОбъектыДляОбработки()

    ТЗ = ПолучитьДанные();

    МассивОбъектов = ОбщегоНазначения.ТаблицаЗначенийВМассив(ТЗ);

    Для Каждого ОбъектОбработки Из МассивОбъектов Цикл

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

    КонецЦикла;

    Возврат МассивОбъектов;

    КонецФункции

    &НаСервереБезКонтекста
    Функция ПолучитьДанные()

    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    | Т.Ссылка,
    | Т.Реквизит2
    |ИЗ
    | Документ.МойДокумент КАК Т
    |ГДЕ
    | Т.Проведен
    | И Т.Реквизит1 = ДАТАВРЕМЯ(1,1,1)";

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

    КонецФункции

    &НаСервереБезКонтекста
    Процедура ЗаписатьОшибку(ТекстОшибки, Ссылка)

    ЗаписьЖурналаРегистрации("Обработка.ПерепроведениеСОткрытиемФормы", УровеньЖурналаРегистрации.Ошибка, Ссылка.Метаданные, Ссылка, ТекстОшибки);

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