Разработка и Конфигурация · 11 мин
Как работает метод Оповестить в 1С: механизм оповещений между формами
Разбираем метод Оповестить в 1С: синтаксис, передача параметров между формами, ОбработкаОповещения, отличия от ОповеститьОбИзменении, примеры кода и типичные ошибки.
Метод Оповестить() в 1С — это штатный механизм обмена сообщениями между открытыми формами прикладного решения. Он позволяет одной форме уведомить все остальные открытые формы о каком-либо событии: записи элемента справочника, изменении настроек, завершении фоновой операции. При этом формы не знают друг о друге напрямую — связь происходит через имя события, что сохраняет независимость кода.
Механизм работает только на клиенте: оповещение доставляется формам, открытым в том же сеансе пользователя. Оно не сохраняется в базе данных, не передаётся другим пользователям и не переживает перезапуск сеанса. Для межпользовательских уведомлений существуют другие инструменты, и путать их с Оповестить — распространённая ошибка начинающих разработчиков.
Типовой сценарий выглядит так: форма-источник вызывает Оповестить("ИмяСобытия", Параметр, Источник), а все формы, у которых в модуле объявлена процедура ОбработкаОповещения, получают это сообщение и реагируют, если имя события им интересно. Ниже разберём синтаксис, порядок обработки, отличия от похожих методов и типовые ошибки.
Синтаксис и параметры метода Оповестить
Метод доступен на клиенте (в тонком, толстом и веб-клиенте) и вызывается в контексте формы или глобального контекста. Полный синтаксис:
Оповестить(ИмяСобытия, Параметр, Источник)
- ИмяСобытия — строка, идентификатор сообщения. По ней формы-получатели отличают одно событие от другого. Имя произвольное, но принято давать осмысленные значения: «ЗаписанаНоменклатура», «ИзмененыНастройкиОбмена».
- Параметр — произвольное значение, которое нужно передать получателям: ссылка на объект, структура с данными, массив. Параметр необязателен.
- Источник — произвольное значение, указывающее, кто отправил оповещение. Часто передают
ЭтаФормаили уникальный ключ формы, чтобы получатель мог отличить «своё» событие от чужого. Тоже необязательный параметр.
Важная особенность: параметр передаётся по значению в момент вызова. Если передать структуру, получатель получит её копию на момент отправки — последующие изменения исходной переменной в форме-источнике на доставленные данные не повлияют.
Как форма получает оповещение: ОбработкаОповещения
Чтобы форма реагировала на оповещения, в её модуле объявляют обработчик с фиксированной сигнатурой:
&НаКлиенте
Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)
Если ИмяСобытия = "ЗаписанаНоменклатура" Тогда
Элементы.Список.Обновить();
КонецЕсли;
КонецПроцедуры
Ключевые правила работы обработчика:
- Процедура вызывается платформой автоматически для каждого оповещения, разосланного в сеансе, — независимо от того, интересно оно форме или нет. Поэтому внутри всегда нужна проверка
ИмяСобытия. - Обработчик выполняется на клиенте. Обращаться к серверным данным напрямую нельзя — только через серверные вызовы.
- Если форма закрыта, её обработчик не вызывается: оповещения доходят только до открытых в данный момент форм.
- Одна форма может обрабатывать несколько разных событий через цепочку
Если... ИначеЕсли....
Проверка параметра Источник позволяет избежать ложных срабатываний. Например, форма списка может игнорировать оповещения, отправленные ею же самой, сравнив Источник с собственным уникальным идентификатором.
- 1В форме-источнике после нужного действия вызовите Оповестить("ИмяСобытия", Параметр, ЭтаФорма).
- 2В форме-получателе объявите процедуру ОбработкаОповещения(ИмяСобытия, Параметр, Источник) с директивой &НаКлиенте.
- 3Внутри обработчика проверьте ИмяСобытия и при необходимости Источник.
- 4Выполните реакцию: обновите список, перечитайте данные, измените видимость элементов.
- 5Проверьте работу: откройте обе формы, выполните действие в источнике и убедитесь, что получатель отреагировал.
Типовые сценарии использования
Обновление списка после записи элемента
Самый частый случай — форма элемента записала объект, а открытая форма списка должна показать изменения. В типовых конфигурациях для этого чаще используется ОповеститьОбИзменении(), но и ручное оповещение применяется, когда нужна нестандартная реакция: например, обновить не только список, но и связанные показатели на панели.
Передача данных между независимыми формами
Если две формы открыты независимо (не владелец и подчинённая), прямой доступ друг к другу затруднён. Оповещение решает задачу: одна форма рассылает событие с параметром-структурой, вторая забирает данные. Это удобно для рабочих мест, где несколько форм образуют единый интерфейс.
Уведомление о смене настроек
Форма настроек после записи может разослать событие «ИзмененыНастройки», и все открытые рабочие формы перечитают параметры и перестроят интерфейс. Без оповещения пришлось бы закрывать и открывать формы заново.
Отличия от ОповеститьОбИзменении и ОписаниеОповещения
Начинающие разработчики часто смешивают три разных механизма. Различия принципиальны:
| Механизм | Что делает | Когда применять |
|---|---|---|
Оповестить() | Рассылает произвольное событие всем открытым формам | Пользовательские события, передача данных между формами |
ОповеститьОбИзменении() | Сигнализирует об изменении конкретного объекта (ссылки); платформа сама обновляет динамические списки и открытые формы объекта | Стандартная реакция на запись объекта — не нужно писать обработчик вручную |
ОписаниеОповещения | Объект-«обратный вызов»: указывает, какую процедуру вызвать после завершения асинхронной операции (вопрос, выбор файла, закрытие формы) | Обработка результата асинхронных вызовов, а не рассылка событий |
Практическое правило: если задача — «сказать платформе, что объект изменился», используйте ОповеститьОбИзменении(Ссылка). Если нужно нестандартное событие с собственным именем и логикой реакции — Оповестить(). Если нужно получить результат из модального вызова — ОписаниеОповещения.
Сравнение вариантов
Гибкое произвольное событие. Требует ручного обработчика в каждой форме-получателе. Подходит для нестандартной логики.
Стандартное уведомление об изменении объекта. Платформа сама обновляет списки и формы. Не передаёт произвольные параметры.
Не рассылка, а обратный вызов одной конкретной процедуры. Используется в паре с ПоказатьВопрос, ОткрытьФорму и другими асинхронными методами.
Типичные ошибки и ограничения
Первая ошибка — попытка использовать Оповестить на сервере. Метод доступен только в клиентском контексте; в серверной процедуре он недоступен. Если событие порождается серверной логикой, серверная процедура должна вернуть признак на клиент, а уже клиентский код рассылает оповещение.
Вторая ошибка — расчёт на то, что оповещение «дойдёт» до конкретной формы, которая не открыта. Сообщение не ставится в очередь и не накапливается: закрытая форма ничего не получит. Если нужно гарантированное получение данных при следующем открытии, сохраняйте их в базе (регистр сведений, хранилище настроек), а не полагайтесь на оповещения.
Третья ошибка — конфликт имён событий. Строковые имена не проверяются компилятором: опечатка в имени приводит к молчаливой неработоспособности, которую трудно отладить. Хорошая практика — выносить имена событий в функции общего модуля или использовать префиксы подсистемы.
Четвёртая ошибка — тяжёлая логика внутри ОбработкаОповещения. Обработчик вызывается синхронно в момент рассылки; длительный серверный вызов внутри него «подвесит» интерфейс формы-источника. Тяжёлые операции стоит выполнять асинхронно или откладывать.
Как проверить и отладить механизм
Отладка оповещений строится на трёх контрольных точках. Первая — точка останова на строке вызова Оповестить: убедитесь, что код вообще выполняется и параметры заполнены ожидаемыми значениями. Вторая — точка останова внутри ОбработкаОповещения формы-получателя: проверьте, что обработчик вызывается и ИмяСобытия совпадает посимвольно с тем, что отправил источник.
Третья точка — проверка состояния формы-получателя: открыта ли она в момент рассылки. Быстрый способ убедиться — временно добавить в начало обработчика вывод в сообщения с именем события и источником. Если обработчик не вызывается вообще, почти всегда причина в том, что форма закрыта, либо оповещение отправляется из другого сеанса.
Как проверить результат
Точка останова срабатывает, параметры заполнены
Код не доходит до вызова — проверяйте условия в логике источника
Обработчик срабатывает, ИмяСобытия совпадает посимвольно
Обработчик молчит — форма закрыта или имя события отличается
Список обновился, данные перечитались
Обработчик отработал, но визуально ничего не изменилось — ошибка в логике реакции
Что важно запомнить
Оповестить — клиентская рассылка события по имени всем открытым формам сеанса. Получатель реагирует через ОбработкаОповещения с обязательной проверкой имени события. Метод не работает на сервере, не достаёт закрытые формы и не связывает разных пользователей. Для стандартной реакции на запись объекта предпочтительнее ОповеститьОбИзменении.
Частые вопросы
Можно ли вызвать Оповестить из фонового задания?
Нет. Фоновое задание выполняется на сервере и не имеет доступа к клиентским формам. Фоновое задание может вернуть результат через механизм длительных операций, а клиентский код, получив результат, уже рассылает оповещение формам.
Дойдёт ли оповещение до другого пользователя?
Нет, механизм ограничен текущим сеансом. Для межпользовательских уведомлений применяют систему взаимодействия, запись данных в базу с периодическим опросом или обсуждения встроенного чата.
Как передать несколько значений в параметре?
Упакуйте значения в структуру: Оповестить("Событие", Новый Структура("Ссылка,Комментарий", Ссылка, Текст)). В обработчике обращайтесь к полям структуры через точку, предварительно проверив тип параметра.
Почему обработчик срабатывает несколько раз?
Проверьте, не рассылает ли источник оповещение в нескольких местах кода (например, при записи и при закрытии формы одновременно). Также убедитесь, что форма-получатель не открыта в нескольких экземплярах — каждый экземпляр получит событие.
Чем заменить Оповестить, если форма-получатель ещё не открыта?
Сохраните данные в базе (регистр сведений, константа, хранилище общих настроек), а форма-получатель при открытии прочитает их в обработчике ПриОткрытии. Оповещение в этой схеме нужно только для обновления уже открытых форм.
Нужно ли как-то «подписываться» на оповещения?
Нет, явной подписки не требуется. Достаточно объявить процедуру ОбработкаОповещения в модуле формы — платформа будет вызывать её при каждом оповещении в сеансе. Фильтрация происходит внутри процедуры по имени события.