Перестала работать обработка ЗТЧ для Бухгалтерии 3.0 (8.3.7). Мне кажется платформа обновилась и что-то пошло не так...

Обработка заполняет остатками ТМЦ табличную часть документа ТребованиеНакладная.

Как известно, ЗТЧ можно сделать двумя способами - через ОткрытиеФормы или ВызовКлиентскогоМетода.
Мне нужно сделать через ОткрытиеФормы, так как я должен предоставить юзеру возможность на форме задать счета, по которым надо получить остатки.

Только не срабатывает процедура заполнения.
Хотя запрос на получение остатков корректен, проверял в консоли.

Помогите, пожалуйста. Что я сделал не так?

модуль обработки
Код:

```1c
    Функция СведенияОВнешнейОбработке() Экспорт

    МассивНазначений = Новый Массив;
    МассивНазначений.Добавить("Документ.ТребованиеНакладная");

    ПараметрыРегистрации = Новый Структура;

    ПараметрыРегистрации.Вставить("Вид", "ЗаполнениеОбъекта");
    //ПараметрыРегистрации.Вставить("Назначение", ПолучитьНазначениеОбработки());
    ПараметрыРегистрации.Вставить("Назначение", МассивНазначений);

    ПараметрыРегистрации.Вставить("Наименование", НСтр("ru = 'Заполнить документ ТребованиеНакладная'"));
    ПараметрыРегистрации.Вставить("Версия", "1.0");
    ПараметрыРегистрации.Вставить("БезопасныйРежим", Истина);
    ПараметрыРегистрации.Вставить("Информация", НСтр("ru = 'Обработка заполнения документа ТребованиеНакладная'"));

    ТаблицаКоманд = ПолучитьТаблицуКоманд();

    ДобавитьКоманду(ТаблицаКоманд,
    "Заполнить табличную часть документа ТребованиеНакладная",
    "ЗаполнитьТЧТребованиеНакладная",
    "ОткрытиеФормы",
    Истина
    );

    ПараметрыРегистрации.Вставить("Команды", ТаблицаКоманд);

    Возврат ПараметрыРегистрации;

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

а вот фрагменты кода модуля формы
Код:

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

    ОбъектыНазначенияМассив = Параметры.ОбъектыНазначения;

    Для каждого ЭлементОбъектовНазначения из ОбъектыНазначенияМассив Цикл

    КлючПоиска = Новый Структура("Ключ", ЭлементОбъектовНазначения);

    Окна = ПолучитьОкна();

    Для каждого Окно из Окна Цикл
    Если НЕ Окно.Основное
    И Найти(Окно.Заголовок, ЭлементОбъектовНазначения) Тогда
    Форма = ОткрытьФорму("Документ.ТребованиеНакладная.Форма.ФормаДокумента",КлючПоиска,,,Окно);
    НовыйОбъект = Форма.Объект;
    ЗаполнитьДокументНаСервере(НовыйОбъект);
    КопироватьДанныеФормы(НовыйОбъект, Форма.Объект);
    КонецЕсли;
    КонецЦикла;

    ЭтаФорма.Закрыть();
    КонецЦикла;

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

```1c
    &НаСервере
    Процедура ЗаполнитьДокументНаСервере(НовыйОбъект) Экспорт

    Если НЕ ЗначениеЗаполнено(НовыйОбъект.Склад) Тогда
    ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Укажите склад!");
    Возврат;
    КонецЕсли;

    МассивСчетов = ПолучитьФильтрСчетов();

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

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

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

    Выборка = РезультатЗапроса.Выбрать();
    НовыйОбъект.Материалы.Очистить();
    Пока Выборка.Следующий() Цикл

    СтрокаТабличнойЧасти = НовыйОбъект.Материалы.Добавить();

    СтрокаТабличнойЧасти.Номенклатура = Выборка.Номенклатура;
    СтрокаТабличнойЧасти.Количество = Выборка.Количество;
    СтрокаТабличнойЧасти.Счет = Выборка.Счет;

    КонецЦикла;
    иначе
    ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Запрос остатков вернул пустой результат!");
    КонецЕсли;

    КонецПроцедуры
```
---
El_Loco, Насколько я понимаю, основное и активное окно это разные вещи.
Я использую другой синтаксис. Работает вполне корректно.
Смысл в том, что активное окно находим как форму объекта, ссылку которого нам передали.

```1c
    &НаКлиенте
    Процедура ВыполнитьКоманду(ИдентификаторКоманды, ОбъектыНазначения) Экспорт
    Для каждого ОбъектНазначение из ОбъектыНазначения Цикл
    ПараметрыФормы = Новый Структура("Ключ", ОбъектНазначение); //это передали в форму заполнения
    Форма = ПолучитьФорму("Документ.ПриходныйОрдерНаТовары.ФормаОбъекта",ПараметрыФормы); //окна не ищем, переполучаем уже открытое

    КопироватьДанныеФормы(Форма.Объект,ЭтотОбъект.ОбъектПриходныйОрдерНаТовары);

    НашаОбработкаНаСервере();

    КопироватьДанныеФормы(ЭтотОбъект.ОбъектПриходныйОрдерНаТовары,Форма.Объект);

    КонецЦикла;
    КонецПроцедуры
```
---
El_Loco, По коду наугад не подскажу.
Но лично я в таких случаях подключаю внешнюю обработку через http://infostart.ru/public/141765/
и смотрю пошагово, что происходит.
---
ekaruk, спасибо, у меня как раз не было отладчика ЗТЧ. попробую.

вот через ВызовКлиентскогоМетода все работает, но тогда я не могу дать пользователю возможность задать параметры на форме.

я думаю, проблема будет не только у меня. если кто сталкивался с похожей ситуацией, напишите.
---
El_Loco, возможно речь идет о галочке заполнять которая стояла на реквизите
---
Xershi, не понял вас...
---
El_Loco, БезопасныйРежим выключать пробовали?
---
spacecraft, не помогает.

но я нашел, что именно не работает.

на форму выбора параметров обработки повесил еще одну кнопку с процедуркой:

```1c
    &НаКлиенте
    Процедура Команда1(Команда)
    ВладелецФормы.Объект.Дата = КонецМесяца(ТекущаяДата());
    ЭтаФорма.Закрыть();
    КонецПроцедуры
```

все работает. т.е. форма закрывается и меняется дата в документе.

далее, я вставлял строку

```1c
    ВладелецФормы.Объект.Дата = КонецМесяца(ТекущаяДата());
```

в разные участки кода, чтобы понять где перестает выполняться код.

И докопался до проблемного куска кода. Объясните, почему не работает условие? -- > // Если НЕ Окно.Основное

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

    ОбъектыНазначенияМассив = Параметры.ОбъектыНазначения;

    Для каждого ЭлементОбъектовНазначения из ОбъектыНазначенияМассив Цикл

    КлючПоиска = Новый Структура("Ключ", ЭлементОбъектовНазначения);

    Окна = ПолучитьОкна();

    Для каждого Окно из Окна Цикл

    //-----------------------------------
    // ВОТ В СЛЕДУЮЩЕЕ "ЕСЛИ" ВОЙТИ НЕ ПОЛУЧАЕТСЯ, ПОЭТОМУ НЕ СРАБАТЫВАЕТ ГЛАВНАЯ ПРОЦЕДУРА ПОЛУЧЕНИЯ И ЗАПОЛНЕНИЯ ТАБ.ЧАСТИ
    //-----------------------------------

    Если НЕ Окно.Основное
    И Найти(Окно.Заголовок, ЭлементОбъектовНазначения) Тогда
    Форма = ОткрытьФорму("Документ.ТребованиеНакладная.Форма.ФормаДокумента",КлючПоиска,,,Окно);
    НовыйОбъект = Форма.Объект;
    ЗаполнитьДокументНаСервере(НовыйОбъект);
    КопироватьДанныеФормы(НовыйОбъект, Форма.Объект);
    КонецЕсли;
    КонецЦикла;

    ЭтаФорма.Закрыть();
    КонецЦикла;

    КонецПроцедуры
```
---
Я так понимаю проблема в поиске нужного окна с формой обрабатываемого документа.
Логика поиска такая
Окно изменяемого документа будет точно не основным, а вспомогательным, поэтому сразу пропускаем основное окно, а далее идем на не очень хороший способ поиска открытого окна изменяемого документа. Мы просто переберем все окна, а в заголовке, которых будет встречаться Наименование, номер и дата нужного документа - будем изменять
это кусок из комментария другой обработки.
выходит - проблема в том, что надо как-то получить окно...
---
да, выходит, что обработка не может найти окно с формой.

вот такая процедура дает удивительный результат:

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

    Окна = ПолучитьОкна();

    Для каждого Окно из Окна Цикл
    сообщить ("Заголовок: "+окно.Заголовок +
    "; Начальная страница "+ окно.НачальнаяСтраница +
    "; Основное "+ окно.Основное +
    "; Содержимое "+окно.Содержимое);
    конецЦикла;

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

см. скрин
---
El_Loco, Насколько я понимаю, основное и активное окно это разные вещи.
Я использую другой синтаксис. Работает вполне корректно.
Смысл в том, что активное окно находим как форму объекта, ссылку которого нам передали.

```1c
    &НаКлиенте
    Процедура ВыполнитьКоманду(ИдентификаторКоманды, ОбъектыНазначения) Экспорт
    Для каждого ОбъектНазначение из ОбъектыНазначения Цикл
    ПараметрыФормы = Новый Структура("Ключ", ОбъектНазначение); //это передали в форму заполнения
    Форма = ПолучитьФорму("Документ.ПриходныйОрдерНаТовары.ФормаОбъекта",ПараметрыФормы); //окна не ищем, переполучаем уже открытое

    КопироватьДанныеФормы(Форма.Объект,ЭтотОбъект.ОбъектПриходныйОрдерНаТовары);

    НашаОбработкаНаСервере();

    КопироватьДанныеФормы(ЭтотОбъект.ОбъектПриходныйОрдерНаТовары,Форма.Объект);

    КонецЦикла;
    КонецПроцедуры
```
---
ekaruk, чтобы я без Вас делал? Спасибо, Евгения!

(11) Perrojka, платформа была как раз 8.3.7.1860.

Проблема решена, только вот так и непонятно из-за чего перестало все работать.
---
подскажите пож, как после КопироватьДанныеФормы(ЭтотОбъект.ОбъектПриходныйОрдерНаТовары,Форма.Объект); обновить Форма ? у меня она остается в старом виде, до измениня

вот мой код

```1c
    &НаКлиенте
    Процедура ВыполнитьКоманду(ИдентификаторКоманды, ОбъектыНазначенияМассив) Экспорт

    Для Каждого ОбъектНазначение из ОбъектыНазначенияМассив Цикл

    ПараметрыФормы = Новый Структура("Ключ", ОбъектНазначение);
    Форма = ПолучитьФорму("Документ.ЗаказКлиента.ФормаОбъекта", ПараметрыФормы);

    КопироватьДанныеФормы(Форма.Объект, ЭтотОбъект.ЗаказКлиентаОбъект);

    ОткрытьФорму("ВнешняяОбработка.ShopLogisticsОтправка.Форма.ФормаДоставка",
    ПолучитьПарамНаСервере(),
    ЭтаФорма,
    Истина,,,
    Новый ОписаниеОповещения("ФормаДоставкаЗавершение",
    ЭтаФорма,
    ПараметрыФормы),
    РежимОткрытияОкнаФормы.БлокироватьВесьИнтерфейс);

    Прервать;

    КонецЦикла;

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

    &НаКлиенте
    Процедура ФормаДоставкаЗавершение(Результат, ДополнительныеПараметры) Экспорт

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

    ЗаполнитьЗаказНаСервере();

    КопироватьДанныеФормы(ЗаказКлиентаОбъект, Форма.Объект);

    КонецПроцедуры
```
---
anton.fly7, ОбновитьОтображениеДанных()
---
dj_serega, не, не обновляет ((

пробовал и так

```1c
    &НаКлиенте
    Процедура ФормаДоставкаЗавершение(Результат, ДополнительныеПараметры) Экспорт

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

    ЗаполнитьЗаказНаСервере();

    КопироватьДанныеФормы(ЗаказКлиентаОбъект, Форма.Объект);

    Сообщить(Форма.Объект.Номер);
    Сообщить(Форма.Объект.СпособДоставки);
    Сообщить(Форма.Объект.ПеревозчикПартнер);
    Сообщить(Форма.Объект.ДополнительнаяИнформацияПоДоставке);

    Форма.ОбновитьОтображениеДанных();

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

и так

```1c
    &НаКлиенте
    Процедура ФормаДоставкаЗавершение(Результат, ДополнительныеПараметры) Экспорт

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

    ЗаполнитьЗаказНаСервере();

    КопироватьДанныеФормы(ЗаказКлиентаОбъект, Форма.Объект);

    Сообщить(Форма.Объект.Номер);
    Сообщить(Форма.Объект.СпособДоставки);
    Сообщить(Форма.Объект.ПеревозчикПартнер);
    Сообщить(Форма.Объект.ДополнительнаяИнформацияПоДоставке);

    ОбновитьОтображениеДанных();

    КонецПроцедуры
```
---
при том вот эти сообщения показывают что Форма.Объект изменен, а Форма не перерисовывается

```1c
    &НаКлиенте
    Процедура ФормаДоставкаЗавершение(Результат, ДополнительныеПараметры) Экспорт

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

    ЗаполнитьЗаказНаСервере();

    КопироватьДанныеФормы(ЗаказКлиентаОбъект, Форма.Объект);

    Сообщить(Форма.Объект.Номер);
    Сообщить(Форма.Объект.СпособДоставки);
    Сообщить(Форма.Объект.ПеревозчикПартнер);
    Сообщить(Форма.Объект.ДополнительнаяИнформацияПоДоставке);

    КонецПроцедуры
```
---
добрый день.
подскажите, пожалуйста
    КопироватьДанныеФормы(Форма.Объект,ЭтотОбъект.ОбъектПриходныйОрдерНаТовары);

в этой строке ЭтотОбъект.ОбъектПриходныйОрдерНаТовары - это параметр какого типа? его нужно определить , но не знаю как
---
Посмотрите номер платформы. Похожая беда была. Обновились на 8.3.7.1860(была 1790) и всё стало нормально. Ещё можно посмотреть в режиме совместимости с 8.3.6 как себя ведет.
---
ВОТ ТАК РАБОТАЕТ!!!! :)

```1c
    &НаКлиенте
    Процедура ФормаДоставкаЗавершение(Результат, ДополнительныеПараметры) Экспорт

    ЗаполнитьЗаказНаСервере(Результат);

    КопироватьДанныеФормы(ЗаказКлиентаОбъект, ВладелецФормы.Объект);

    ВладелецФормы.Модифицированность = Истина;
    ВладелецФормы.Элементы.СтраницыДоставки.ТекущаяСтраница = ВладелецФормы.Элементы.СтраницаДоставкаПеревозчиком;

    ОбновитьОтображениеДанных();

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

можно легко заменить на
Форма = ЭтаФорма.ВладелецФормы
т.к. в моем случае нужен был уникальный идентификатор формы владельца