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