Глобальный контекст.ПодключитьОбработчикОповещения

Методы · AttachNotificationHandler

Подключает вызов указанной экспортируемой процедуры модуля приложения (модуля обычного приложения) или глобального общего модуля для обработки оповещения при вызове метода Оповестить. Процедура должна быть экспортируемой и иметь три параметра - <Имя события>, <Параметр>, <Источник>.

Синтаксис

ПодключитьОбработчикОповещения(<ИмяПроцедуры>)

Примеры платформы

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

Глобальный контекст.ПодключитьОбработчикОповещения (Global context.AttachNotificationHandler)

Глобальный контекст (Global context)

ПодключитьОбработчикОповещения (AttachNotificationHandler)

Доступен, начиная с версии 8.0.

Синтаксис:
ПодключитьОбработчикОповещения(<ИмяПроцедуры>)
Параметры:

<ИмяПроцедуры> (обязательный)
Тип: Строка.
Имя экспортируемой процедуры модуля приложения (модуля обычного приложения) или общего глобального модуля.
Процедура должна располагаться на клиенте.
Процедура не должна содержать параметров.
Описание:

Подключает вызов указанной экспортируемой процедуры модуля приложения (модуля обычного приложения) или глобального общего модуля для обработки оповещения при вызове метода Оповестить. Процедура должна быть экспортируемой и иметь три параметра - <Имя события>, <Параметр>, <Источник>.

Доступность:

Тонкий клиент, веб-клиент, мобильный клиент, толстый клиент, мобильное приложение (клиент).

Пример:

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

Процедура ПриНачалеРаботыСистемы()
//...

ПодключитьОбработчикОповещения("глОбработкаОповещения");
//...

КонецПроцедуры // ПриНачалеРаботыСистемы()

См. также:
Глобальный контекст, метод ОтключитьОбработчикОповещения
Глобальный контекст, метод Оповестить

Использование в версии:

Доступен, начиная с версии 8.0.

Методическая информация

Практические примеры

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

Подключить настоящую экспортную клиентскую процедуру, передать два собственных оповещения и получить реальные счётчик 2 и сумму 550. Отключить точно эту процедуру, передать контрольное 900 и отдельно прочитать фактические поля; любой лишний или поздний вызов остаётся видимой ошибкой.

Где и как запускать

Клиент; полный модуль собственной управляемой формы ПодпискаОповещений85. Шесть настоящих команд подключают и отключают экспортную процедуру глобального клиентского модуля; серверных вызовов нет.

Подготовка

  1. Будущий опыт — только в своей НОВОЙ пустой учебной конфигурации 8.5.1.1343. Начните НОВЫЙ сеанс толстого управляемого клиента, откройте ровно одну собственную форму. Не используйте рабочую УТ, КА, УНФ или БП, чужие обработчики, расширения или другие открытые формы.

  2. Общие → Общие модули → создать УчебныеГлобальныеОповещения85. Глобальный=Да; Клиент (управляемое приложение)=Да; Сервер=Нет; Клиент (обычное приложение)=Нет; Внешнее соединение=Нет; Привилегированный=Нет; Вызов сервера=Нет; Повторное использование возвращаемых значений=Не использовать. Блок глобального получателя ниже вставить ЦЕЛИКОМ в пустой модуль. Здесь глобальный клиентский модуль нужен именно для регистрации экспортной процедуры по её имени.

  3. Общие → Общие формы → создать управляемую форму ПодпискаОповещений85. Реквизиты Принято85 и Сумма85: Число длиной 15, точность 0. Этап85: Строка длиной 50. Остановлено85: Булево. Результат85: Строка неограниченной длины. Вывести все пять полей только для просмотра. До подключения в своей новой форме реально наблюдайте типизированные Принято85=0, Сумма85=0, Остановлено85=Ложь и пустой Этап85. Код проверяет эти фактические значения, не присваивает их; неподготовленная форма означает остановку.

  4. В свойствах формы отключить сохранение: АвтоматическоеСохранениеДанныхВНастройках=АвтоматическоеСохранениеДанныхФормыВНастройках.НеИспользовать; СохранениеДанныхВНастройках=СохранениеДанныхФормыВНастройках.НеИспользовать. Это два разных перечисления, не Булево. Событие формы ОбработкаОповещения НЕ назначать: числа меняет только подключённый глобальный получатель.

  5. Создать шесть команд формы и кнопки: Подключить85, Передать30085, Передать25085, Отключить85, Передать900После85, ПроверитьПосле85. Действие каждой команды — одноимённая процедура. Основной блок вставить ЦЕЛИКОМ в пустой модуль формы. Не вызывайте обработчики вручную.

  6. Общие → Общие команды → создать ОткрытьПодпискуОповещений85 без параметра, включить в интерфейс своей учебной подсистемы. Третий блок вставить ЦЕЛИКОМ в пустой модуль команды. ОбработкаКоманды получает оба настоящих штатных параметра.

  7. Вручную обновить только свою учебную конфигурацию, проверить компиляцию, запустить НОВЫЙ клиентский сеанс и открыть одну форму общей командой. Здесь ничего не создавалось и не запускалось в 1С; успешные реальные события остаются будущей ручной проверкой.

  8. Не закрывать/не открывать вторую форму и не подключать повторно в этом сеансе. Неизвестный исход или прерванный опыт означает остановку: завершите только собственный учебный клиентский сеанс и начните новый. Нет автоматической очистки, повторной регистрации или отключения чужих процедур.

  9. Вся цепочка клиентская. Нет обращений к серверу, документов, регистров, файлов, Интернету или записи настроек. Отдельная виртуальная машина, пользователь и проверка всех метаданных этому ограниченному опыту не нужны; собственная новая конфигурация и свежий сеанс всё равно обязательны.

&НаКлиенте
Процедура ПроверитьПоля85()
    Если ТипЗнч(ЭтотОбъект) <> Тип("ФормаКлиентскогоПриложения")
        Или ИмяФормы <> "ОбщаяФорма.ПодпискаОповещений85"
        Или АвтоматическоеСохранениеДанныхВНастройках <> АвтоматическоеСохранениеДанныхФормыВНастройках.НеИспользовать
        Или СохранениеДанныхВНастройках <> СохранениеДанныхФормыВНастройках.НеИспользовать Тогда
        ВызватьИсключение "Нужна собственная форма с отключённым сохранением данных";
    КонецЕсли;
    Если ТипЗнч(Принято85) <> Тип("Число") Или ТипЗнч(Сумма85) <> Тип("Число")
        Или ТипЗнч(Этап85) <> Тип("Строка") Или ТипЗнч(Остановлено85) <> Тип("Булево")
        Или ТипЗнч(Результат85) <> Тип("Строка") Тогда
        ВызватьИсключение "Проверьте настоящие типы всех пяти собственных реквизитов";
    КонецЕсли;
    Если Принято85 < 0 Или Цел(Принято85) <> Принято85 Или Сумма85 < 0 Или Цел(Сумма85) <> Сумма85 Тогда
        ВызватьИсключение "Собственные числовые реквизиты должны быть целыми неотрицательными";
    КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ПроверитьКоманду85(Команда, ИмяКоманды, Этап, Принято, Сумма)
    ПроверитьПоля85();
    Если ТипЗнч(Команда) <> Тип("КомандаФормы") Или Команда.Имя <> ИмяКоманды Тогда
        ВызватьИсключение "Нужна настоящая одноимённая собственная команда";
    КонецЕсли;
    Если Остановлено85 Тогда
        ВызватьИсключение "Исход неизвестен или опыт остановлен; не повторяйте операции в этом сеансе";
    КонецЕсли;
    Если Этап85 <> Этап Или Принято85 <> Принято Или Сумма85 <> Сумма Тогда
        ВызватьИсключение "Предыдущий шаг ещё не подтверждён фактическим счётчиком; не повторяйте отправку";
    КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура Подключить85(Команда)
    ПроверитьКоманду85(Команда, "Подключить85", "", 0, 0);
    Остановлено85 = Истина;
    Этап85 = "Подключение неизвестно";
    Результат85 = "Выполняется единственное подключение своего получателя.";
    Попытка
        ПодключитьОбработчикОповещения("УчебныйГлобальныйПолучатель85");
        ПроверитьПоля85();
        Если Принято85 <> 0 Или Сумма85 <> 0 Тогда
            ВызватьИсключение "Счётчик изменился до собственных отправок";
        КонецЕсли;
        Этап85 = "Подключение выполнено";
        Остановлено85 = Ложь;
        Результат85 = "Вызов подключения завершён; фактический приём событий ещё не проверен.";
    Исключение
        Остановлено85 = Истина;
        Этап85 = "Остановлено";
        Результат85 = "Исход подключения неизвестен. Не повторяйте и не выполняйте автоматическую очистку.";
        ВызватьИсключение;
    КонецПопытки;
КонецПроцедуры

&НаКлиенте
Процедура Передать30085(Команда)
    ПроверитьКоманду85(Команда, "Передать30085", "Подключение выполнено", 0, 0);
    Этап85 = "Первое отправлено";
    Результат85 = "Передаётся 300; дождитесь настоящего отчёта получателя и счётчика 1.";
    Попытка
        Оповестить("УчебнаяПодписка85.Сумма", 300, ЭтотОбъект);
    Исключение
        Остановлено85 = Истина;
        Этап85 = "Остановлено";
        Результат85 = "Отправка 300 завершилась ошибкой. Исход неизвестен; повтор запрещён.";
        ВызватьИсключение;
    КонецПопытки;
КонецПроцедуры

&НаКлиенте
Процедура Передать25085(Команда)
    ПроверитьКоманду85(Команда, "Передать25085", "Первое отправлено", 1, 300);
    Этап85 = "Второе отправлено";
    Результат85 = "Передаётся 250; дождитесь настоящего отчёта получателя и счётчика 2.";
    Попытка
        Оповестить("УчебнаяПодписка85.Сумма", 250, ЭтотОбъект);
    Исключение
        Остановлено85 = Истина;
        Этап85 = "Остановлено";
        Результат85 = "Отправка 250 завершилась ошибкой. Исход неизвестен; повтор запрещён.";
        ВызватьИсключение;
    КонецПопытки;
КонецПроцедуры

&НаКлиенте
Процедура Отключить85(Команда)
    ПроверитьКоманду85(Команда, "Отключить85", "Второе отправлено", 2, 550);
    Остановлено85 = Истина;
    Этап85 = "Отключение неизвестно";
    Результат85 = "Выполняется отключение именно своего подключённого получателя.";
    Попытка
        ОтключитьОбработчикОповещения("УчебныйГлобальныйПолучатель85");
        ПроверитьПоля85();
        Если Принято85 <> 2 Или Сумма85 <> 550 Тогда
            ВызватьИсключение "Фактические результаты изменились во время отключения";
        КонецЕсли;
        Этап85 = "Отключение выполнено";
        Остановлено85 = Ложь;
        Результат85 = "Вызов отключения завершён. Проверка следующего события ещё не выполнена.";
    Исключение
        Остановлено85 = Истина;
        Этап85 = "Остановлено";
        Результат85 = "Исход отключения неизвестен. Не повторяйте, не отправляйте дальше и не очищайте автоматически.";
        ВызватьИсключение;
    КонецПопытки;
КонецПроцедуры

&НаКлиенте
Процедура Передать900После85(Команда)
    ПроверитьКоманду85(Команда, "Передать900После85", "Отключение выполнено", 2, 550);
    Этап85 = "После отключения отправлено";
    Результат85 = "Передаётся контрольное 900. Итог пока не проверен; затем отдельно нажмите ПроверитьПосле85.";
    Попытка
        Оповестить("УчебнаяПодписка85.Сумма", 900, ЭтотОбъект);
    Исключение
        Остановлено85 = Истина;
        Этап85 = "Остановлено";
        Результат85 = "Контрольная отправка завершилась ошибкой. Исход неизвестен; повтор запрещён.";
        ВызватьИсключение;
    КонецПопытки;
КонецПроцедуры

&НаКлиенте
Процедура ПроверитьПосле85(Команда)
    ПроверитьКоманду85(Команда, "ПроверитьПосле85", "После отключения отправлено", 2, 550);
    Результат85 = "На момент этой отдельной проверки реально принято: " + Строка(Принято85)
        + "; сумма: " + Строка(Сумма85) + ". Контрольное 900 не учтено."
        + " Любой поздний вызов получателя останется видимым нарушением.";
    Этап85 = "Проверено";
КонецПроцедуры
Целый глобальный клиентский модуль УчебныеГлобальныеОповещения85: настоящий получатель

Общие → Общие модули → УчебныеГлобальныеОповещения85 → пустой модуль. Вставить ЦЕЛИКОМ; Глобальный=Да, Клиент (управляемое приложение)=Да, Сервер=Нет. Не модуль формы.

Глобальный непривилегированный клиентский модуль; экспортную процедуру с тремя настоящими аргументами вызывает платформа через регистрацию в основной форме. Реально учитывает события, в том числе лишние и поздние.

Процедура УчебныйГлобальныйПолучатель85(ИмяСобытия, Параметр, Источник) Экспорт
    Если ТипЗнч(ИмяСобытия) <> Тип("Строка") Или ИмяСобытия <> "УчебнаяПодписка85.Сумма" Тогда
        Возврат;
    КонецЕсли;
    Если ТипЗнч(Источник) <> Тип("ФормаКлиентскогоПриложения") Тогда
        ВызватьИсключение "У собственного события нет настоящей формы-источника";
    КонецЕсли;
    Если Источник.ИмяФормы <> "ОбщаяФорма.ПодпискаОповещений85"
        Или Источник.АвтоматическоеСохранениеДанныхВНастройках <> АвтоматическоеСохранениеДанныхФормыВНастройках.НеИспользовать
        Или Источник.СохранениеДанныхВНастройках <> СохранениеДанныхФормыВНастройках.НеИспользовать Тогда
        ВызватьИсключение "Событие должно принадлежать собственной подготовленной форме";
    КонецЕсли;
    Если ТипЗнч(Параметр) <> Тип("Число") Тогда
        ВызватьИсключение "Собственное событие должно передать настоящее число";
    КонецЕсли;
    Если Параметр <> 300 И Параметр <> 250 И Параметр <> 900 Тогда
        ВызватьИсключение "Допустимы только три собственных учебных числа";
    КонецЕсли;
    До = Источник.Принято85;
    СуммаДо = Источник.Сумма85;
    Если ТипЗнч(До) <> Тип("Число") Или ТипЗнч(СуммаДо) <> Тип("Число") Тогда
        ВызватьИсключение "Собственные счётчик и сумма должны быть настоящими числами";
    КонецЕсли;
    Если До < 0 Или Цел(До) <> До Или СуммаДо < 0 Или Цел(СуммаДо) <> СуммаДо Тогда
        ВызватьИсключение "Собственные счётчик и сумма должны быть целыми неотрицательными";
    КонецЕсли;
    Источник.Принято85 = До + 1;
    Источник.Сумма85 = СуммаДо + Параметр;
    После = Источник.Принято85;
    СуммаПосле = Источник.Сумма85;
    Если ТипЗнч(После) <> Тип("Число") Или ТипЗнч(СуммаПосле) <> Тип("Число")
        Или После <> До + 1 Или СуммаПосле <> СуммаДо + Параметр Тогда
        ВызватьИсключение "Реальный учёт собственного события не подтверждён";
    КонецЕсли;
    Отчет = "Получатель действительно вызван. Принято: " + Строка(После) + "; сумма: " + Строка(СуммаПосле) + ".";
    Если После > 2 Тогда
        Источник.Остановлено85 = Истина;
        Отчет = "ЛИШНЕЕ событие: " + Строка(После) + "; сумма: " + Строка(СуммаПосле)
            + ". Проверка отключения НЕ пройдена; опыт остановлен.";
    КонецЕсли;
    Источник.Результат85 = Отчет;
    Если ТипЗнч(Источник.Результат85) <> Тип("Строка") Или Источник.Результат85 <> Отчет Тогда
        ВызватьИсключение "Не подтверждён видимый отчёт настоящего получателя";
    КонецЕсли;
КонецПроцедуры
Целый модуль своей общей команды ОткрытьПодпискуОповещений85

Общие → Общие команды → ОткрытьПодпискуОповещений85 → пустой модуль команды. Вставить ЦЕЛИКОМ; без параметра, включить в свою подсистему. Открывать ровно одну форму в НОВОМ сеансе.

Толстый управляемый клиент; настоящее ОбработкаКоманды с обоими штатными параметрами. Не вызывает получатель или отправку напрямую.

Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)
    #Если ТолстыйКлиентУправляемоеПриложение Тогда
        Если ПараметрКоманды <> Неопределено
            Или ТипЗнч(ПараметрыВыполненияКоманды) <> Тип("ПараметрыВыполненияКоманды") Тогда
            ВызватьИсключение "Откройте одну свою учебную форму штатной общей командой без параметра";
        КонецЕсли;
        ОткрытьФорму("ОбщаяФорма.ПодпискаОповещений85");
    #Иначе
        ВызватьИсключение "Учебный опыт открывается в толстом управляемом клиенте";
    #КонецЕсли
КонецПроцедуры

Разбор по шагам

  1. Подключить85 один раз передаёт строку УчебныйГлобальныйПолучатель85 в ПодключитьОбработчикОповещения. Это имя существующей экспортной процедуры глобального клиентского модуля, не имя метода формы, не вызов с аргументами и не ОписаниеОповещения.

  2. До подключения и отключения форма ставит Остановлено85=Истина и неизвестный этап. Только нормальный возврат и повторная проверка собственных полей разрешают продолжение. Ошибка оставляет остановку; повтор, автоматическая очистка и следующая отправка запрещены.

  3. Передать30085 вызывает настоящий Оповестить с именем своего события, числом 300 и ЭтотОбъект — настоящей формой-источником. Получатель вызывается самой платформой; он проверяет три фактических аргумента и увеличивает собственные числовые реквизиты формы.

  4. Возврат из Оповестить сам по себе не доказывает доставку. Дождитесь видимых Принято85=1 и Сумма85=300. Только затем отдельно нажмите Передать25085. Второй настоящий вызов получателя должен дать 2 и 550; отправители эти числа не подставляют.

  5. Когда реально видны 2 и 550, нажмите Отключить85. Передаётся точно то же имя процедуры, которая была подключена. Завершение вызова отключения ещё не подменяет проверку следующего события.

  6. Нажмите Передать900После85: то же имя события, число 900, та же настоящая форма. Получатель не проверяет подключённость или этап для молчаливого пропуска: если платформа всё-таки вызовет его, счётчик станет 3, сумма 1450 и появится ЛИШНЕЕ событие.

  7. Отдельным настоящим нажатием ПроверитьПосле85 прочитайте фактические числа. Ожидаются 2 и 550; отчёт говорит только о моменте этой проверки. Поздний настоящий вызов получателя всё равно увеличит числа и заменит отчёт видимым нарушением, даже после этапа Проверено.

  8. Имена других событий получатель игнорирует, не меняя чужие объекты. Для своего имени требуется настоящая собственная форма с точным именем и числовыми полями; неизвестный объект или неверный параметр не превращается в успешный опыт.

Как проверить результат

  1. Первый будущий опыт: фактические типизированные поля 0, 0, пустой этап, Ложь и строковый отчёт. Не присваивайте исходные числа ради прохождения проверки. После Подключить85 написано только о завершении вызова подключения; счётчик ещё 0, приём не объявлен проверенным.

  2. После Передать30085 наблюдайте настоящие 1 и 300 и сообщение Получатель действительно вызван. Если они отсутствуют, первый положительный результат не подтверждён: не повторяйте отправку и не считайте опыт успешным.

  3. Следующее отдельное нажатие Передать25085 должно привести к настоящим 2 и 550. В своём отладчике убедитесь, что Принято85 и Сумма85 увеличиваются в экспортном получателе, вызванном платформой, а не в командах отправки.

  4. После настоящего Отключить85 и Передать900После85 отдельно нажмите ПроверитьПосле85. Ожидаются фактически прочитанные 2 и 550; нет дополнительного учёта контрольного 900 к этому моменту. Не выдавайте отсутствие изменения за гарантию всех будущих моментов.

  5. Только в отдельной собственной учебной копии уберите вызов отключения, затем начните НОВЫЙ сеанс и весь опыт заново. Не меняйте получатель: настоящий третий вызов должен дать 3 и 1450, ЛИШНЕЕ событие и остановку, а не ложный успех из-за флага Отключён.

  6. При любой поздней фактической доставке после итоговой кнопки получатель тоже должен увеличить числа и показать нарушение. Нельзя прятать такой вызов условием по этапу Проверено или сбрасывать счётчик ради ожидаемых 2 и 550.

  7. Нажатия не по порядку или два подключения не должны выполнить новую регистрацию/отправку. Ошибочный вызов регистрации/отключения оставляет неизвестный исход и запрет повторения; конкретный отказ ещё не воспроизведён в 1С.

  8. Никаких ручных вызовов УчебныйГлобальныйПолучатель85 для проверки счётчика: это подменит платформенное событие. Не назначайте параллельно ОбработкаОповещения формы и не применяйте опыт к рабочему клиентскому сеансу.

Ожидаемый результат

Только после реальных платформенных вызовов: первое своё событие даёт 1/300, второе 2/550. После отключения точно этого получателя и отдельной проверки контрольного 900 ожидаются фактически прочитанные 2/550. Это наблюдение в текущий момент, не гарантия всех будущих моментов; любой настоящий третий вызов показывает 3/1450 и видимое нарушение даже после итоговой проверки.

На что обратить внимание

  1. Установленная страница ПодключитьОбработчикОповещения противоречива: в параметре написано «Процедура не должна содержать параметров», а основное описание требует три параметра и пример показывает экспортную процедуру с тремя. Урок следует явному основному описанию и примеру 8.5.1.1343; это не объявлено доказанной опечаткой или проверенным запуском.

  2. В строке регистрации указывается голое имя экспортной глобальной клиентской процедуры. Объект ОписаниеОповещения и процедура модуля формы относятся к другим механизмам и не заменяют этот контракт.

  3. Методы подключения, отключения и Оповестить не возвращают здесь проверяемый дескриптор или Булево. Отметка завершённого вызова не является наблюдением обработанного события; доказательством служат собственные фактические счётчик и сумма.

  4. Оповестить рассылает уведомление всем созданным формам и подключённым процедурам. Имя и источник ограничивают наш учебный получатель, но не делают рассылку приватной или безопасной границей авторизации.

  5. Нативное описание не обещает синхронность или пустую очередь к возврату. Отдельные действия пользователя и реальные наблюдения не подменяются таймером, задержкой, прямым вызовом получателя или обещанием отсутствия любой поздней доставки.

  6. Получатель никогда не прекращает учёт своего корректного события из-за этапа или флага подключения/остановки. Иначе неотключённая процедура могла бы незаметно пропустить 900 и создать ложный положительный результат.

  7. Подписка относится к клиентскому сеансу, а не к строковому полю формы. Новая форма со сброшенными полями не доказывает новую подписку; после прерывания нужен новый собственный клиентский сеанс, а не автоматический повтор.

  8. Строка(Число) зависит от национальных установок. Проверяются настоящие числовые 1/300, 2/550 и при лишнем событии 3/1450, а не заранее заданное форматирование текста.

  9. Во время написания не запускались компилятор, 1С, форма или события. Подготовка и положительные наблюдения остаются будущей ручной проверкой; отказ или пустой счётчик не считаются успешным примером.

Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.

Не хотите разбираться сами?

Адаптируем это решение под вашу базу. Оценка бесплатно.

Оставить задачу

1С, 1С:Предприятие — товарные знаки ООО «1С». Сайт не является официальным представительством фирмы «1С» и не аффилирован с ней.