К статье
Практический материал

Разработка и Конфигурация · 11 мин

Как работает метод Оповестить в 1С: механизм оповещений между формами

Разбираем метод Оповестить в 1С: синтаксис, передача параметров между формами, ОбработкаОповещения, отличия от ОповеститьОбИзменении, примеры кода и типичные ошибки.

Метод Оповестить() в 1С — это штатный механизм обмена сообщениями между открытыми формами прикладного решения. Он позволяет одной форме уведомить все остальные открытые формы о каком-либо событии: записи элемента справочника, изменении настроек, завершении фоновой операции. При этом формы не знают друг о друге напрямую — связь происходит через имя события, что сохраняет независимость кода.

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

Типовой сценарий выглядит так: форма-источник вызывает Оповестить("ИмяСобытия", Параметр, Источник), а все формы, у которых в модуле объявлена процедура ОбработкаОповещения, получают это сообщение и реагируют, если имя события им интересно. Ниже разберём синтаксис, порядок обработки, отличия от похожих методов и типовые ошибки.

Синтаксис и параметры метода Оповестить

Метод доступен на клиенте (в тонком, толстом и веб-клиенте) и вызывается в контексте формы или глобального контекста. Полный синтаксис:

Оповестить(ИмяСобытия, Параметр, Источник)

  • ИмяСобытия — строка, идентификатор сообщения. По ней формы-получатели отличают одно событие от другого. Имя произвольное, но принято давать осмысленные значения: «ЗаписанаНоменклатура», «ИзмененыНастройкиОбмена».
  • Параметр — произвольное значение, которое нужно передать получателям: ссылка на объект, структура с данными, массив. Параметр необязателен.
  • Источник — произвольное значение, указывающее, кто отправил оповещение. Часто передают ЭтаФорма или уникальный ключ формы, чтобы получатель мог отличить «своё» событие от чужого. Тоже необязательный параметр.

Важная особенность: параметр передаётся по значению в момент вызова. Если передать структуру, получатель получит её копию на момент отправки — последующие изменения исходной переменной в форме-источнике на доставленные данные не повлияют.

Как форма получает оповещение: ОбработкаОповещения

Чтобы форма реагировала на оповещения, в её модуле объявляют обработчик с фиксированной сигнатурой:

&НаКлиенте

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

Если ИмяСобытия = "ЗаписанаНоменклатура" Тогда

Элементы.Список.Обновить();

КонецЕсли;

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

Ключевые правила работы обработчика:

  • Процедура вызывается платформой автоматически для каждого оповещения, разосланного в сеансе, — независимо от того, интересно оно форме или нет. Поэтому внутри всегда нужна проверка ИмяСобытия.
  • Обработчик выполняется на клиенте. Обращаться к серверным данным напрямую нельзя — только через серверные вызовы.
  • Если форма закрыта, её обработчик не вызывается: оповещения доходят только до открытых в данный момент форм.
  • Одна форма может обрабатывать несколько разных событий через цепочку Если... ИначеЕсли....

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

Порядок действий
  1. 1
    В форме-источнике после нужного действия вызовите Оповестить("ИмяСобытия", Параметр, ЭтаФорма).
  2. 2
    В форме-получателе объявите процедуру ОбработкаОповещения(ИмяСобытия, Параметр, Источник) с директивой &НаКлиенте.
  3. 3
    Внутри обработчика проверьте ИмяСобытия и при необходимости Источник.
  4. 4
    Выполните реакцию: обновите список, перечитайте данные, измените видимость элементов.
  5. 5
    Проверьте работу: откройте обе формы, выполните действие в источнике и убедитесь, что получатель отреагировал.

Типовые сценарии использования

Обновление списка после записи элемента

Самый частый случай — форма элемента записала объект, а открытая форма списка должна показать изменения. В типовых конфигурациях для этого чаще используется ОповеститьОбИзменении(), но и ручное оповещение применяется, когда нужна нестандартная реакция: например, обновить не только список, но и связанные показатели на панели.

Передача данных между независимыми формами

Если две формы открыты независимо (не владелец и подчинённая), прямой доступ друг к другу затруднён. Оповещение решает задачу: одна форма рассылает событие с параметром-структурой, вторая забирает данные. Это удобно для рабочих мест, где несколько форм образуют единый интерфейс.

Уведомление о смене настроек

Форма настроек после записи может разослать событие «ИзмененыНастройки», и все открытые рабочие формы перечитают параметры и перестроят интерфейс. Без оповещения пришлось бы закрывать и открывать формы заново.

Отличия от ОповеститьОбИзменении и ОписаниеОповещения

Начинающие разработчики часто смешивают три разных механизма. Различия принципиальны:

МеханизмЧто делаетКогда применять
Оповестить()Рассылает произвольное событие всем открытым формамПользовательские события, передача данных между формами
ОповеститьОбИзменении()Сигнализирует об изменении конкретного объекта (ссылки); платформа сама обновляет динамические списки и открытые формы объектаСтандартная реакция на запись объекта — не нужно писать обработчик вручную
ОписаниеОповещенияОбъект-«обратный вызов»: указывает, какую процедуру вызвать после завершения асинхронной операции (вопрос, выбор файла, закрытие формы)Обработка результата асинхронных вызовов, а не рассылка событий

Практическое правило: если задача — «сказать платформе, что объект изменился», используйте ОповеститьОбИзменении(Ссылка). Если нужно нестандартное событие с собственным именем и логикой реакции — Оповестить(). Если нужно получить результат из модального вызова — ОписаниеОповещения.

Сравнение вариантов

Оповестить

Гибкое произвольное событие. Требует ручного обработчика в каждой форме-получателе. Подходит для нестандартной логики.

ОповеститьОбИзменении

Стандартное уведомление об изменении объекта. Платформа сама обновляет списки и формы. Не передаёт произвольные параметры.

ОписаниеОповещения

Не рассылка, а обратный вызов одной конкретной процедуры. Используется в паре с ПоказатьВопрос, ОткрытьФорму и другими асинхронными методами.

Типичные ошибки и ограничения

Первая ошибка — попытка использовать Оповестить на сервере. Метод доступен только в клиентском контексте; в серверной процедуре он недоступен. Если событие порождается серверной логикой, серверная процедура должна вернуть признак на клиент, а уже клиентский код рассылает оповещение.

Вторая ошибка — расчёт на то, что оповещение «дойдёт» до конкретной формы, которая не открыта. Сообщение не ставится в очередь и не накапливается: закрытая форма ничего не получит. Если нужно гарантированное получение данных при следующем открытии, сохраняйте их в базе (регистр сведений, хранилище настроек), а не полагайтесь на оповещения.

Третья ошибка — конфликт имён событий. Строковые имена не проверяются компилятором: опечатка в имени приводит к молчаливой неработоспособности, которую трудно отладить. Хорошая практика — выносить имена событий в функции общего модуля или использовать префиксы подсистемы.

Четвёртая ошибка — тяжёлая логика внутри ОбработкаОповещения. Обработчик вызывается синхронно в момент рассылки; длительный серверный вызов внутри него «подвесит» интерфейс формы-источника. Тяжёлые операции стоит выполнять асинхронно или откладывать.

Типичные ошибки
01
Вызов Оповестить из серверной процедуры — метод недоступен на сервере, событие нужно рассылать с клиента.
02
Опечатка в имени события — обработчик молча не срабатывает, ошибку не видно без отладки.
03
Ожидание доставки закрытой форме — оповещения не накапливаются и не ставятся в очередь.
04
Тяжёлый серверный вызов внутри ОбработкаОповещения — интерфейс зависает на время выполнения.
05
Игнорирование параметра Источник — форма реагирует на собственные оповещения и зацикливает логику.

Как проверить и отладить механизм

Отладка оповещений строится на трёх контрольных точках. Первая — точка останова на строке вызова Оповестить: убедитесь, что код вообще выполняется и параметры заполнены ожидаемыми значениями. Вторая — точка останова внутри ОбработкаОповещения формы-получателя: проверьте, что обработчик вызывается и ИмяСобытия совпадает посимвольно с тем, что отправил источник.

Третья точка — проверка состояния формы-получателя: открыта ли она в момент рассылки. Быстрый способ убедиться — временно добавить в начало обработчика вывод в сообщения с именем события и источником. Если обработчик не вызывается вообще, почти всегда причина в том, что форма закрыта, либо оповещение отправляется из другого сеанса.

Контрольные точки

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

Вызов Оповестить выполняется
Норма

Точка останова срабатывает, параметры заполнены

Тревожный признак

Код не доходит до вызова — проверяйте условия в логике источника

ОбработкаОповещения вызывается
Норма

Обработчик срабатывает, ИмяСобытия совпадает посимвольно

Тревожный признак

Обработчик молчит — форма закрыта или имя события отличается

Реакция формы-получателя
Норма

Список обновился, данные перечитались

Тревожный признак

Обработчик отработал, но визуально ничего не изменилось — ошибка в логике реакции

Итог

Что важно запомнить

Оповестить — клиентская рассылка события по имени всем открытым формам сеанса. Получатель реагирует через ОбработкаОповещения с обязательной проверкой имени события. Метод не работает на сервере, не достаёт закрытые формы и не связывает разных пользователей. Для стандартной реакции на запись объекта предпочтительнее ОповеститьОбИзменении.

Частые вопросы

Можно ли вызвать Оповестить из фонового задания?

Нет. Фоновое задание выполняется на сервере и не имеет доступа к клиентским формам. Фоновое задание может вернуть результат через механизм длительных операций, а клиентский код, получив результат, уже рассылает оповещение формам.

Дойдёт ли оповещение до другого пользователя?

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

Как передать несколько значений в параметре?

Упакуйте значения в структуру: Оповестить("Событие", Новый Структура("Ссылка,Комментарий", Ссылка, Текст)). В обработчике обращайтесь к полям структуры через точку, предварительно проверив тип параметра.

Почему обработчик срабатывает несколько раз?

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

Чем заменить Оповестить, если форма-получатель ещё не открыта?

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

Нужно ли как-то «подписываться» на оповещения?

Нет, явной подписки не требуется. Достаточно объявить процедуру ОбработкаОповещения в модуле формы — платформа будет вызывать её при каждом оповещении в сеансе. Фильтрация происходит внутри процедуры по имени события.