Как организовать систему массового оповещения пользователей во всех информационных базах 1С?

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

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

Метод 1: Использование COM-соединения (V83.COMConnector)

Это классический подход, который часто выбирают из-за простоты реализации. Суть заключается в создании «административной» базы, которая поочередно подключается к каждой целевой базе и вносит записи в специальный регистр сведений.

Разберем по шагам логику реализации:

  1. В каждой базе создается регистр сведений (например, ОповещенияПользователей), который мониторится обработчиком ожидания на стороне клиента.
  2. В центральной базе создается обработка, хранящая список строк подключения к целевым базам.
  3. При нажатии кнопки «Оповестить» происходит цикл по базам.

Проанализируем пример кода для подключения через COM-объект:


// Пример подключения к целевой базе через COM
Коннектор = Новый COMОбъект("v83.COMConnector");
СтрокаПодключения = "Srvr='Server1C';Ref='Trade_Base';Usr='Admin';Pwd='Password123';";

Попытка
    Соединение = Коннектор.Connect(СтрокаПодключения);
    
    // Работаем с объектами метаданных целевой базы
    МенеджерРегистра = Соединение.РегистрыСведений.ОповещенияПользователей;
    НоваяЗапись = МенеджерРегистра.СоздатьМенеджерЗаписи();
    НоваяЗапись.Период = ТекущаяДата();
    НоваяЗапись.ТекстСообщения = "Внимание! База будет закрыта через 15 минут.";
    НоваяЗапись.Срочность = Истина;
    НоваяЗапись.Записать();
    
    Соединение = Неопределено; // Разрываем соединение
Исключение
    Сообщить("Не удалось подключиться к базе: " + ОписаниеОшибки());
КонецПопытки;

Важные нюансы:

Метод 2: HTTP-сервисы и REST API (ODATA)

Более современный и масштабируемый способ — использование веб-технологий. Вместо «тяжелого» COM-подключения мы можем передать данные через легкий HTTP-запрос.

Рассмотрим вариант с публикацией HTTP-сервиса. В каждой целевой базе создается сервис с методом POST, который принимает текст оповещения и записывает его в базу.

Преимущества этого подхода:

  1. Скорость: HTTP-соединение устанавливается и разрывается мгновенно.
  2. Экономия лицензий: Сеанс создается только на время выполнения запроса (доли секунды), что позволяет обслуживать большое количество баз даже при дефиците лицензий.
  3. Безопасность: Можно жестко ограничить права доступа только к одной функции записи сообщения.

Если нет желания писать свой сервис, можно воспользоваться стандартным интерфейсом OData. Однако, как справедливо замечено в дискуссии, это потребует публикации каждой информационной базы на веб-сервере, что увеличивает нагрузку на администрирование.

Метод 3: Сервер взаимодействия (Система взаимодействия)

Проанализируем встроенный механизм платформы — Сервер взаимодействия (СВ). Это штатный инструмент для мгновенного обмена сообщениями между пользователями 1С.

Как это работает:

Вы можете программно создавать обсуждения и отправлять сообщения конкретным пользователям или группам. Платформа сама позаботится о доставке «push-уведомления», которое появится в интерфейсе пользователя.

Тонкости лицензирования (ПРОФ vs КОРП):

Выясним причину споров о лицензиях. Для версий платформы начиная с 8.3.14 использование собственного локального Сервера взаимодействия требует наличия лицензий уровня КОРП, если количество пользователей или функционал выходят за рамки базовых возможностей. Однако использование публичного облачного сервиса 1с-dialog.com доступно всем пользователям с действующим договором ИТС без дополнительных затрат на КОРП-лицензии.

Метод 4: Использование утилиты администрирования RAC/RAS

Если задача стоит не просто «показать сообщение», а гарантированно завершить работу пользователей, эффективнее использовать средства администрирования кластера.

Рассмотрим использование утилиты rac. Она позволяет управлять сеансами без входа в саму базу. С помощью скрипта (на 1С или PowerShell) можно:

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

Пример вызова системной команды для отправки сообщения через rac:


// Команда для отправки сообщения пользователю через консоль администрирования
Команда = "rac session --cluster=" + ID_Кластера + " send-message --message='Сохраните данные!' " + ID_Сеанса;
ЗапуститьПриложение(Команда);

Метод 5: Внешние источники данных (Прямой доступ к PostgreSQL)

В обсуждении упоминалась возможность записи напрямую в базу данных. Хотя это не рекомендуется делать в обход объектной модели 1С, существует «легальный» способ — Внешние источники данных.

Проанализируем ситуацию: в административной базе вы настраиваете подключение к таблицам PostgreSQL других баз. Это позволяет использовать стандартный синтаксис 1С СоздатьМенеджерЗаписи(), но при этом данные будут физически попадать в другую базу через механизм ODBC/Native Client. Это самый быстрый способ массовой записи в 20+ баз одновременно, так как исключается накладной расход на запуск сеансов 1С в целевых базах.

Рекомендации по выбору решения

Подведем итог и выберем оптимальный путь в зависимости от условий:

Помните, что при реализации любого метода с «опросом» (polling) через обработчик ожидания (например, раз в 1-5 минут), важно минимизировать нагрузку на сервер. Проверяйте наличие новых записей в регистре максимально легким запросом, чтобы не снижать производительность системы в целом.

← На главную