При разработке интерфейса на обычных формах 1С часто возникает задача: пользователь открывает подчиненную форму в немодальном режиме, совершает в ней действия, а после ее закрытия главная форма (владелец) должна автоматически обновить свои данные или выполнить определенный алгоритм. Рассмотрим, какие методы существуют для решения этой задачи и как их правильно реализовать.
Разберем самый прямой и прозрачный вариант — обращение к форме-владельцу через системное свойство Владелец. В этом случае подчиненная форма напрямую вызывает процедуру, объявленную с ключевым словом Экспорт в модуле формы-владельца.
Сначала в модуле формы-владельца создадим процедуру, которая будет выполнять нужные действия при закрытии дочернего окна:
Процедура ОповеститьОЗакрытииПодчиненнойФормы() Экспорт
// Код обновления данных или пересчета на форме-владельце
ОбновитьТабличнуюЧасть();
КонецПроцедуры
Затем в модуле подчиненной формы перехватим событие ПриЗакрытии. Чтобы избежать ошибок выполнения (например, если подчиненная форма была открыта без указания владельца или если владелец был закрыт раньше), обязательно выполним цепочку проверок:
Владелец заполнено (Владелец <> Неопределено).ТипЗнч(Владелец) = Тип("Форма")).Владелец.Открыта()).Посмотрим на итоговый код в модуле подчиненной формы:
Процедура ПриЗакрытии()
Если Владелец <> Неопределено И ТипЗнч(Владелец) = Тип("Форма") Тогда
Если Владелец.Открыта() Тогда
Владелец.ОповеститьОЗакрытииПодчиненнойФормы();
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Проанализируем второй способ, основанный на системном методе Оповестить(). Этот метод производит рассылку сообщения всем созданным формам приложения, у которых реализована предопределенная процедура ОбработкаОповещения().
Главная особенность метода Оповестить() заключается в том, что оно приходит абсолютно всем открытым формам (включая саму подчиненную форму). Чтобы форма-владелец могла идентифицировать нужное событие, используем параметры метода:
ИмяСобытия — уникальная строка-идентификатор события.Параметр — произвольные данные, которые передаются вместе с оповещением.Источник — ссылка на форму или объект, отправивший оповещение (обычно передается ЭтаФорма).В модуле подчиненной формы в обработчике события ПриЗакрытии вызовем процедуру оповещения:
Процедура ПриЗакрытии()
Оповестить("ЗакрытаПодчиненнаяФормаВвода", СтруктураПараметров, ЭтаФорма);
КонецПроцедуры
В модуле формы-владельца опишем предопределенную процедуру ОбработкаОповещения, где отфильтруем incoming-события по имени:
Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)
Если ИмяСобытия = "ЗакрытаПодчиненнаяФормаВвода" Тогда
// Выполняем логику обновления формы-владельца
ПрочитатьЗаполненныеДанные(Параметр);
КонецЕсли;
КонецПроцедуры
Если подчиненная форма предназначена для выбора или подбора значений, наилучшим решением станет метод ОповеститьОВыборе(). Этот метод передает выбранное значение владельцу и автоматически закрывает подчиненную форму (если свойство ЗакрыватьПриВыборе установлено в Истина).
В модуле подчиненной формы при выборе элемента (например, по кнопке или двойному клику) вызываем:
Процедура СписокВыбор(Элемент, ВыбраннаяСтрока, Колонка, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
ЗначениеВыбора = ЭлементыФормы.Список.ТекущиеДанные.Ссылка;
ОповеститьОВыборе(ЗначениеВыбора);
КонецПроцедуры
На стороне формы-владельца результат выборки обрабатывается в стандартной процедуре ОбработкаВыбора:
Процедура ОбработкаВыбора(ЗначениеВыбора, Источник)
Если ТипЗнч(ЗначениеВыбора) = Тип("СправочникСсылка.Номенклатура") Тогда
// Логика обработки полученного значения
ЗаполнитьРеквизит(ЗначениеВыбора);
КонецЕсли;
КонецПроцедуры
Выбор конкретного подхода зависит от архитектуры вашей задачи в 1С:
Владелец с проверкой Открыта().Оповестить() и обработчик ОбработкаОповещения().ОповеститьОВыборе() и событие ОбработкаВыбора().