Доброе утро.
БП 3.0
Платформа 8.3 управляемая

Есть документ, у него 2 формы: сокращенная и расширенная. Из первой открываем вторую для редактирования, делаем манипуляции (добавляем строки ТЧ, изменяем реквизиты документа), проводим и записываем и возвращаемся на первую форму, которая хотелось бы чтобы обновилась.
В основной форме делаю оповещение:

```1c
    &НаКлиенте
    Процедура ПередЗакрытием(Отказ, ЗавершениеРаботы, ТекстПредупреждения, СтандартнаяОбработка)
    Оповестить("ОбновитьДанныеФормыПосещенияУрока");
    КонецПроцедуры
```

в сокращенной форме обрабатываю оповещение таким образом:

```1c
    &НаКлиенте
    Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)

    Если ИмяСобытия ="ОбновитьДанныеФормыПосещенияУрока" ТОгда
    ЭтотОбъект.Прочитать();
    ЭтаФорма.ОбновитьОтображениеДанных();
    КонецЕсли;

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

и как вы догадались - ничего не работает... А почему?
---
Попробуйте так:

```1c
    ///Форма1
    &НаКлиенте
    Процедура КомандаОткрытьФормуВыбора(Команда)

    ОП = Новый ОписаниеОповещения("ПриЗакрытииФормыВыбора", ЭтаФорма,"ПодборРеализации");
    ОткрытьФорму("Документ.РеализацияТоваровУслуг.ФормаВыбора",ПараметрыФормы,ЭтотОбъект, , , , ОП);

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

    ///Форма1
    &НаКлиенте
    Процедура ПриЗакрытииФормыВыбора(Значение, ДопПараметры) Экспорт

    //Дополнительные условия если необходимо
    //Если ДопПараметры = "ПодборРеализации" тогда

    Если Значение = Неопределено Тогда
    Возврат;
    КонецЕсли;

    Если Значение ="ОбновитьДанныеФормыПосещенияУрока" ТОгда
    ЭтотОбъект.Прочитать();
    ЭтаФорма.ОбновитьОтображениеДанных();
    КонецЕсли;

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

    ///Форма2
    &НаКлиенте
    Процедура КомандаЗакрыть(Команда)

    Закрыть("ОбновитьДанныеФормыПосещенияУрока");

    КонецПроцедуры
```
---
Попробуйте так:

```1c
    ///Форма1
    &НаКлиенте
    Процедура КомандаОткрытьФормуВыбора(Команда)

    ОП = Новый ОписаниеОповещения("ПриЗакрытииФормыВыбора", ЭтаФорма,"ПодборРеализации");
    ОткрытьФорму("Документ.РеализацияТоваровУслуг.ФормаВыбора",ПараметрыФормы,ЭтотОбъект, , , , ОП);

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

    ///Форма1
    &НаКлиенте
    Процедура ПриЗакрытииФормыВыбора(Значение, ДопПараметры) Экспорт

    //Дополнительные условия если необходимо
    //Если ДопПараметры = "ПодборРеализации" тогда

    Если Значение = Неопределено Тогда
    Возврат;
    КонецЕсли;

    Если Значение ="ОбновитьДанныеФормыПосещенияУрока" ТОгда
    ЭтотОбъект.Прочитать();
    ЭтаФорма.ОбновитьОтображениеДанных();
    КонецЕсли;

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

    ///Форма2
    &НаКлиенте
    Процедура КомандаЗакрыть(Команда)

    Закрыть("ОбновитьДанныеФормыПосещенияУрока");

    КонецПроцедуры
```
---
ОбновитьДанныеФормыПосещенияУрока
Никак не пойму: на форме 2 у вас команда "закрыть"? А если у меня стандартная кнопка провести и закрыть, и мне надо проведение оставить? ТОгда мне использовать обработчик событий надо. Если я использую обработчик событий :

```1c
    &НаКлиенте
    Процедура ПриЗакрытии(ЗавершениеРаботы)
    Закрыть("ОбновитьДанныеФормыПосещенияУрока");
    КонецПроцедуры
```

то ругается: Ошибка при вызове метода контекста (Закрыть) по причине: Недопустимая операция для неоткрытой формы.
---
Разобрался: В процедуре
```1c
    &НаКлиенте
    Процедура ПриЗакрытии(ЗавершениеРаботы)
    Закрыть("ОбновитьДанныеФормыПосещенияУрока");
    КонецПроцедуры
```

уже форма как бы закрыта. Вызвал в процедуре "ПередЗакрытием"

```1c
    &НаКлиенте
    Процедура ПередЗакрытием(Отказ, ЗавершениеРаботы, ТекстПредупреждения, СтандартнаяОбработка)
    Закрыть("ОбновитьДанныеФормыПосещенияУрока");
    КонецПроцедуры
```
. Заработало!
---
Кстати, Можно еще так:

```1c
    ///Форма1
    &НаКлиенте
    Процедура КомандаОткрытьФормуВыбора(Команда)

    ДопПараметры = Новый Структура;
    ДопПараметры.Вставить("ОбновитьФорму",Ложь);

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

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

    ///Форма1
    &НаКлиенте
    Процедура ПриЗакрытииФормыВыбора(Значение, ДопПараметры) Экспорт

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

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

    ///Форма2
    &НаКлиенте
    Процедура ПриЗакрытии(ЗавершениеРаботы)
    Если ЭтаФорма.ОписаниеОповещенияОЗакрытии <> Неопределено Тогда
    ЭтаФорма.ОписаниеОповещенияОЗакрытии.ДополнительныеПараметры.ОбновитьФорму = Истина;
    КонецЕсли;
    КонецПроцедуры
```
---
Наверное это метод даже лучше: решается с помощью доп параметров, а не с помощью закрытия формы во время закрытия формы... (и это не тавтология!). А так в принципе задействуется все таже обработка оповещения.
Спасибо!