Как создать механизм оповещения всех активных пользователей в 1С?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

В практике администрирования и разработки на платформе 1С:Предприятие 8.3 часто возникает задача оперативного информирования всех работающих в системе пользователей. Это может быть уведомление о предстоящем техническом обслуживании, обновлении конфигурации или важное организационное сообщение. Рассмотрим подробно, как реализовать такой механизм, используя различные подходы: от простых внешних обработок до использования Библиотеки стандартных подсистем (БСП) и Системы взаимодействия.

Архитектура системы оповещения: почему просто внешней обработки недостаточно

Разберем важный нюанс, упомянутый в обсуждении. Если мы напишем код внутри формы внешней обработки, он будет выполняться только в том случае, если эта обработка открыта у пользователя на экране. Как только пользователь закроет форму, механизм перестанет работать. Для полноценного «фонового» оповещения нам необходимо, чтобы код проверки новых сообщений работал постоянно в течение всего сеанса пользователя.

Проанализируем оптимальную схему реализации:

  1. Хранилище сообщений: Место, куда администратор записывает текст уведомления (Регистр сведений или Константа).
  2. Механизм мониторинга: Код на стороне клиента, который периодически «опрашивает» хранилище.
  3. Интерфейс уведомления: Окно или всплывающее сообщение, которое увидит пользователь.

Решение 1: Использование Регистра сведений и обработчика ожидания

Это классический и наиболее надежный метод, не требующий сложной настройки серверов. Рассмотрим его по шагам.

Шаг 1. Создание хранилища. Создадим непериодический Регистр сведений ОбщиеОповещения с измерениями (например, Идентификатор) и ресурсами ТекстСообщения (строка), ДатаСоздания (ДатаВремя) и АктуальноДо (ДатаВремя).

Шаг 2. Реализация проверки. Нам нужно запустить процедуру, которая будет проверяться раз в некоторое время (например, раз в 60 секунд). Для этого используется метод ПодключитьОбработчикОжидания.

Рассмотрим пример кода, который должен располагаться в модуле управляемого приложения или подключаться через расширение:


Процедура ПриНачалеРаботыСистемы()
    // Подключаем проверку сообщений раз в минуту (60 секунд)
    ПодключитьОбработчикОжидания("ПроверитьНаличиеНовыхОповещений", 60);
КонецПроцедуры

Процедура ПроверитьНаличиеНовыхОповещений() Экспорт
    // Вызываем серверный метод для проверки регистра
    ТекстОповещения = ПолучитьАктуальноеОповещениеНаСервере();
    
    Если ЗначениеЗаполнено(ТекстОповещения) Тогда
        ПоказатьОповещениеПользователя("ВНИМАНИЕ!", , ТекстОповещения);
    КонецЕсли;
КонецПроцедуры

Важный момент оптимизации: Постоянное чтение тяжелого регистра всеми пользователями может нагрузить базу данных. Чтобы этого избежать, рекомендуется хранить в ПараметрахСеанса дату последнего прочитанного сообщения и запрашивать на сервере только записи, созданные позже этой даты.

Решение 2: Использование возможностей БСП (Библиотека стандартных подсистем)

Если ваша конфигурация построена на базе БСП (УТ 11, ERP, БП 3.0), то изобретать велосипед не стоит. Проанализируем возможности подсистемы «Текущие дела» или использование программного интерфейса для вывода уведомлений.

Для вывода всплывающего окна в нижнем правом углу, которое не блокирует работу пользователя, используется метод ПоказатьОповещениеПользователя. Он выглядит следующим образом:


Текст = "Сервер будет перезагружен через 15 минут. Пожалуйста, сохраните работу.";
ПоказатьОповещениеПользователя("Важное сообщение", "e1cib/app/ВнешняяОбработка.ИмяВашейОбработки", Текст, БиблиотекаКартинок.ВажнаяИнформация);

Преимущество этого метода в том, что он позволяет добавить гиперссылку, при нажатии на которую откроется конкретный объект или форма внешней обработки с подробностями.

Решение 3: Низкоуровневое оповещение через системные команды (RDP)

Выясним причину, по которой иногда выбирают метод msg. Если база работает в терминальном режиме на одном сервере, администратор может отправить системное сообщение Windows, которое появится поверх всех окон, включая 1С. Это гарантирует, что пользователь его не пропустит.

Пример кода для вызова из 1С:


ТекстСообщения = "Срочно выйдите из базы для обновления!";
Команда = "msg * /server:Localhost " + ТекстСообщения;
ЗапуститьПриложение(Команда, , Ложь);

Внимание: Этот метод работает только в рамках локальной сети или терминального сервера и требует соответствующих прав доступа у пользователя, от имени которого запускается команда.

Решение 4: Система взаимодействия

Это наиболее современный и «нативный» способ для платформы 1С. Система взаимодействия позволяет отправлять сообщения конкретным пользователям или в общие каналы. Если она настроена, нам не нужно использовать обработчики ожидания — платформа сама доставит Push-уведомление клиенту.

Рассмотрим логику работы:

  1. Администратор в своей обработке создает новое сообщение в обсуждении, где состоят все пользователи.
  2. Платформа автоматически отображает уведомление у всех активных участников.

Этот способ является самым производительным, так как не создает лишней нагрузки на СУБД постоянными запросами из обработчика ожидания.

Сравнение типов окон: Модальные против Немодальных

При реализации оповещений важно выбрать правильный тип визуализации:

Резюме для разработчика: Для создания «своей» обработки оповещений лучше всего использовать связку Регистр сведений + Расширение конфигурации. В расширении пропишите запуск обработчика ожидания в модуле управляемого приложения, а в самой внешней обработке реализуйте интерфейс для записи сообщений в этот регистр. Это обеспечит стабильную работу системы без необходимости держать внешнюю обработку постоянно открытой у всех пользователей.

← На главную