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