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