В практике администрирования и разработки на платформе 1С:Предприятие 8.3 часто возникает задача оперативного информирования всех работающих в системе пользователей. Это может быть уведомление о предстоящем техническом обслуживании, обновлении конфигурации или важное организационное сообщение. Рассмотрим подробно, как реализовать такой механизм, используя различные подходы: от простых внешних обработок до использования Библиотеки стандартных подсистем (БСП) и Системы взаимодействия.
Разберем важный нюанс, упомянутый в обсуждении. Если мы напишем код внутри формы внешней обработки, он будет выполняться только в том случае, если эта обработка открыта у пользователя на экране. Как только пользователь закроет форму, механизм перестанет работать. Для полноценного «фонового» оповещения нам необходимо, чтобы код проверки новых сообщений работал постоянно в течение всего сеанса пользователя.
Проанализируем оптимальную схему реализации:
Это классический и наиболее надежный метод, не требующий сложной настройки серверов. Рассмотрим его по шагам.
Шаг 1. Создание хранилища. Создадим непериодический Регистр сведений ОбщиеОповещения с измерениями (например, Идентификатор) и ресурсами ТекстСообщения (строка), ДатаСоздания (ДатаВремя) и АктуальноДо (ДатаВремя).
Шаг 2. Реализация проверки. Нам нужно запустить процедуру, которая будет проверяться раз в некоторое время (например, раз в 60 секунд). Для этого используется метод ПодключитьОбработчикОжидания.
Рассмотрим пример кода, который должен располагаться в модуле управляемого приложения или подключаться через расширение:
Процедура ПриНачалеРаботыСистемы()
// Подключаем проверку сообщений раз в минуту (60 секунд)
ПодключитьОбработчикОжидания("ПроверитьНаличиеНовыхОповещений", 60);
КонецПроцедуры
Процедура ПроверитьНаличиеНовыхОповещений() Экспорт
// Вызываем серверный метод для проверки регистра
ТекстОповещения = ПолучитьАктуальноеОповещениеНаСервере();
Если ЗначениеЗаполнено(ТекстОповещения) Тогда
ПоказатьОповещениеПользователя("ВНИМАНИЕ!", , ТекстОповещения);
КонецЕсли;
КонецПроцедуры
Важный момент оптимизации: Постоянное чтение тяжелого регистра всеми пользователями может нагрузить базу данных. Чтобы этого избежать, рекомендуется хранить в ПараметрахСеанса дату последнего прочитанного сообщения и запрашивать на сервере только записи, созданные позже этой даты.
Если ваша конфигурация построена на базе БСП (УТ 11, ERP, БП 3.0), то изобретать велосипед не стоит. Проанализируем возможности подсистемы «Текущие дела» или использование программного интерфейса для вывода уведомлений.
Для вывода всплывающего окна в нижнем правом углу, которое не блокирует работу пользователя, используется метод ПоказатьОповещениеПользователя. Он выглядит следующим образом:
Текст = "Сервер будет перезагружен через 15 минут. Пожалуйста, сохраните работу.";
ПоказатьОповещениеПользователя("Важное сообщение", "e1cib/app/ВнешняяОбработка.ИмяВашейОбработки", Текст, БиблиотекаКартинок.ВажнаяИнформация);
Преимущество этого метода в том, что он позволяет добавить гиперссылку, при нажатии на которую откроется конкретный объект или форма внешней обработки с подробностями.
Выясним причину, по которой иногда выбирают метод msg. Если база работает в терминальном режиме на одном сервере, администратор может отправить системное сообщение Windows, которое появится поверх всех окон, включая 1С. Это гарантирует, что пользователь его не пропустит.
Пример кода для вызова из 1С:
ТекстСообщения = "Срочно выйдите из базы для обновления!";
Команда = "msg * /server:Localhost " + ТекстСообщения;
ЗапуститьПриложение(Команда, , Ложь);
Внимание: Этот метод работает только в рамках локальной сети или терминального сервера и требует соответствующих прав доступа у пользователя, от имени которого запускается команда.
Это наиболее современный и «нативный» способ для платформы 1С. Система взаимодействия позволяет отправлять сообщения конкретным пользователям или в общие каналы. Если она настроена, нам не нужно использовать обработчики ожидания — платформа сама доставит Push-уведомление клиенту.
Рассмотрим логику работы:
Этот способ является самым производительным, так как не создает лишней нагрузки на СУБД постоянными запросами из обработчика ожидания.
При реализации оповещений важно выбрать правильный тип визуализации:
Резюме для разработчика: Для создания «своей» обработки оповещений лучше всего использовать связку Регистр сведений + Расширение конфигурации. В расширении пропишите запуск обработчика ожидания в модуле управляемого приложения, а в самой внешней обработке реализуйте интерфейс для записи сообщений в этот регистр. Это обеспечит стабильную работу системы без необходимости держать внешнюю обработку постоянно открытой у всех пользователей.