Управляемые формы: не срабатывает оповещение о закрытии формы
После появления управляемых форм и отключения в них модального режима какие-то данные из формы разработчики стали получать через описание оповещения, а точнее через параметр «ОписаниеОповещенияОЗакрытии» при открытии формы. Для того чтобы процедура, прописанная в этом параметре, получила необходимые данные важно принудительно закрыть форму, передавая туда данные.
В коде это обычно выглядит:
Параметры = Новый Структура;
Параметры.Вставить("Ключ", Заказ);
ОповешениеЗакрытия = Новый ОписаниеОповещения("ОтгрузитьЗаказОкончание", ЭтотОбъект, Параметры);
ОткрытьФорму("Документ.ЗаказКлиента.Форма.ФормаДокумента", Параметры, ЭтотОбъект,,,, ОповешениеЗакрытия, РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
Далее создаем функцию, в которую будет возвращаться информация из формы:
&НаКлиенте
Процедура ОтгрузитьЗаказОкончание(Результат, ДопПараметры) Экспорт
Если Результат = Неопределено Тогда
Возврат;
КонецЕсли;
Заказ = Результат;
Если ЗаказГотовКОтгрузке(Заказ) тогда
СоздатьОтгрузкиПоЗаказам(Заказ);
Иначе
Сообщить(СокрЛП(Заказ) + " заказ не готов к отгрузке!");
КонецЕсли;
КонецПроцедуры
Добавляем код в самой форме:
&НаКлиенте
Процедура ЗакрытьОтложенно(Команда)
Закрыть(ТекущийЗаказ);
КонецПроцедуры
Все это писали, всё это хорошо работает, но у вендора есть сюрприз. При принудительном закрытии формы из события «ПриОткрытии» оповещение о закрытии не срабатывает. И что же делать? Я знаю два пути обхода, один я нашел, второй придумал.
Contents
Первый способ
Можем воспользоваться функцией «ПодключитьОбработчикОжидания» при открытии формы, а в назначенной процедуре форму закроем.
&НаКлиенте
Процедура ПриОткрытии(Отказ)
ПодключитьОбработчикОжидания("ЗакрытьОтложенно", 0.1, Истина);
КонецПроцедуры
&НаКлиенте
Процедура ЗакрытьОтложенно()
Закрыть(ТекущийЗаказ);
КонецПроцедуры
Способ рабочий, но при нем форма все же открывается. Если в ней есть множество процедур до подключения обработчика, то она некоторое время висит, потом исчезает. Получается некрасиво.
Второй способ
Воспользуемся тем, что мы открыли форму и передали в нее оповещение закрытия формы. Можем получить его в самой форме (лежит в свойстве формы «ОписаниеОповещенияОЗакрытии») и выполнить напрямую, не открывая форму.
&НаКлиенте
Процедура ПриОткрытии(Отказ)
Отказ = Истина;
ВыполнитьОбработкуОповещения(ОписаниеОповещенияОЗакрытии, ТекущийЗаказ);
КонецПроцедуры
В этом случае пользователь даже не заметит попытку открытия формы.
Comments
So empty here ... leave a comment!