ОбработкаОповещения в управляемых формах

У управляемой формы есть событие ОбработкаОповещения:

Обработчик данного события находится на клиенте и выглядит следующим образом:

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

Данное событие вызывается у всех открытых форм при вызове метода глобального контекста Оповестить(). Параметры у данного метода такие же, как у обработчика события формы: ИмяСобытия, Параметр, Источник. Тип параметра ИмяСобытия — Строка, остальных — произвольный. Метод Оповестить() доступен только на клиенте.

Для примера создадим в пустой конфигурации справочник Контрагенты и добавим у него реквизит «Адрес»:

А также обработку. На форму обработки добавим реквизит Контрагент с типом СправочникСсылка.Контрагенты и реквизит Адрес с типом Строка, доступный только для чтения. При изменении контрагента сделаем заполнение реквизита Адрес адресом из контрагента:

&НаКлиенте
Процедура КонтрагентПриИзменении(Элемент)
	КонтрагентПриИзмененииНаСервере();
КонецПроцедуры
 
&НаСервере
Процедура КонтрагентПриИзмененииНаСервере()
	Если ЗначениеЗаполнено(Контрагент) Тогда
		Адрес = Контрагент.Адрес;
	Иначе
		Адрес = "";
	КонецЕсли;	
КонецПроцедуры

Создадим нового контрагента:

И выберем его на форме обработки:

Адрес заполнился автоматически. Однако, если сейчас изменить адрес контрагента, то на форме по прежнему останется старый адрес:

Вот здесь как раз можно использовать событие ОбработкаОповещения и метод Оповестить().

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

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

Здесь анализируется событие и источник. Если событие равно «Запись_Контрагент» и Источник равен контрагенту на форме, то обновляем адрес контрагента. Условие нужно, чтобы не обновлять впустую адрес, если был вызван метод Оповестить с другим именем события или был записан другой контрагент (не который на форме обработки).

В модуль формы контрагента, в событие ПослеЗаписи добавим следующий код:

&НаКлиенте
Процедура ПослеЗаписи(ПараметрыЗаписи)
	Оповестить("Запись_Контрагент",, Объект.Ссылка);
КонецПроцедуры

Здесь после каждой записи выполняется оповещение всех форм об изменении контрагента. Третьим параметром передается ссылка на записанного контрагента.

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

Нужно учитывать, что при вызове метода Оповестить() выполнение кода продолжится только после выполнения обработчика события ОбработкаОповещения во всех открытых формах. Поэтому не стоит в данном обработчике добавлять код, который может долго выполняться.

Также можно в модуле управляемого приложения или в глобальном клиентском модуле подключить процедуру, которая будет выполняться при каждом вызове метода Оповестить(). Для этого в модуле приложения добавим следующую процедуру:

Процедура ГлобальнаяОбработка(ИмяСобытия, Параметр, Источник) Экспорт
	Если ИмяСобытия = "Запись_Контрагент" Тогда
		Сообщить(Источник);
	КонецЕсли;
КонецПроцедуры

Данная процедура при каждой записи контрагента будет сообщать его наименование. Параметры должны совпадать с параметрами метода Оповестить(). Процедура обязательно должна быть экспортной.

В модуле приложения в обработчике события ПередНачаломРаботыСистемы с помощью метода ПодключитьОбработчикОповещения подключим данную процедуру:

Процедура ПередНачаломРаботыСистемы(Отказ)
	ПодключитьОбработчикОповещения("ГлобальнаяОбработка");
КонецПроцедуры

Теперь при каждом вызове метода Оповестить будет вызываться процедура ГлобальнаяОбработкаОповещений, а при любой записи контрагента будет выводиться его наименование (если форма элемента не была закрыта).

Рейтинг
( Пока оценок нет )
Понравилась статья? Поделиться с друзьями: