Как оповестить пользователя в 1С при получении события через HTTP-сервис?

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

Разработка интеграций часто ставит перед программистом задачу: сервер 1С получает данные через HTTP-сервис (например, POST-запрос от сторонней системы), и на это событие должен мгновенно среагировать конкретный пользователь в открытом сеансе. Основная сложность заключается в архитектуре: HTTP-сервис выполняется в фоновом сеансе на сервере, который "не знает" об открытых клиентских окнах и не может напрямую вызвать метод Оповестить() на клиенте.

В этой статье мы подробно разберем, как преодолеть это ограничение, проанализируем современные инструменты платформы и выберем наиболее эффективные способы реализации механизма "Push" от сервера к клиенту.

Решение 1: Использование Системы взаимодействия (рекомендуемый способ)

Это наиболее современный и технологичный подход. Система взаимодействия позволяет передавать сообщения между пользователями и фоновыми процессами практически мгновенно, используя протокол WebSockets. Преимущество метода в том, что нам не нужно постоянно опрашивать сервер — клиент "слушает" канал и реагирует только при поступлении сообщения.

Рассмотрим по шагам процесс реализации. Сначала нам нужно настроить клиентское приложение на прослушивание определенного обсуждения. Обычно это делается при запуске АРМ (автоматизированного рабочего места) или в обработчике ПриНачалеРаботыСистемы.

Шаг 1. Настройка подписчика на клиенте

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


// В модуле управляемой формы или в общем модуле на клиенте
Процедура ПодключитьСлушателяСобытий() Экспорт
    Ключ = "СобытияHTTPСервиса";
    Обсуждение = СистемаВзаимодействия.ПолучитьОбсуждение(Ключ);
    
    // Если обсуждение не найдено, его можно создать программно
    Если Обсуждение = Неопределено Тогда
        // Код создания обсуждения...
    КонецЕсли;

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

Процедура ОбработкаНовогоСообщения(Сообщение, ДополнительныеПараметры) Экспорт
    // Здесь пишем логику реакции на событие
    // Например, выводим оповещение или открываем форму
    ПоказатьОповещениеПользователя("Новое событие!", , Сообщение.Текст);
КонецПроцедуры

Шаг 2. Отправка сообщения из HTTP-сервиса

Теперь проанализируем серверную часть. В методе POST вашего HTTP-сервиса необходимо создать сообщение в то же самое обсуждение. Важно, что сообщение может содержать не только текст, но и структуру данных в свойстве Данные.


// В модуле HTTP-сервиса (на сервере)
Метод = СистемаВзаимодействия.ПолучитьОбсуждение("СобытияHTTPСервиса");
НовоеСообщение = СистемаВзаимодействия.СоздатьСообщение(Метод);
НовоеСообщение.Текст = "Получены данные от внешней системы";
// Можно передать параметры для обработки на клиенте
НовоеСообщение.Данные = Новый Структура("ИдентификаторСобытия, Тип", "123", "Тикет");
НовоеСообщение.Записать();

Решение 2: Использование внешних компонент (MQTT)

Если Система взаимодействия по каким-то причинам недоступна (например, закрытый контур без интернета и локального сервера системы взаимодействия), можно воспользоваться протоколом MQTT. Это стандарт для "интернета вещей" (IoT), который идеально подходит для мгновенной передачи коротких сообщений.

Разберем принцип работы этого метода:

  1. На стороне клиента подключается внешняя компонента (Native API), которая поддерживает протокол MQTT.
  2. Компонента подключается к MQTT-брокеру (например, бесплатному Mosquitto) и подписывается на определенный топик (канал).
  3. Когда HTTP-сервис получает данные, он выступает в роли MQTT-клиента и публикует сообщение в этот топик.
  4. Внешняя компонента на клиенте мгновенно генерирует ВнешнееСобытие, которое перехватывается в 1С в одноименной процедуре модуля управляемого приложения или формы.

Этот способ считается очень надежным и быстрым, так как не нагружает базу данных 1С лишними транзакциями.

Решение 3: Классический метод через Регистр сведений и Обработчик ожидания

Если требуется решение "из коробки" без дополнительных сервисов и компонент, рассмотрим вариант с использованием регистра сведений. Несмотря на критику из-за нагрузки, при правильной настройке он вполне жизнеспособен.

Проанализируем алгоритм:

  1. Создаем непериодический регистр сведений ОчередьСобытийДляПользователей. Измерения: Пользователь; Ресурсы: ДанныеСобытия, Прочитано (Булево).
  2. В коде HTTP-сервиса записываем новую строку в этот регистр, указывая конкретного пользователя, которому предназначено уведомление.
  3. На клиенте при запуске системы подключаем обработчик ожидания: ПодключитьОбработчикОжидания("ПроверитьНовыеСобытия", 5);.

Выясним причину, по которой этот метод может "тормозить" систему: слишком частые запросы (например, каждую секунду) к базе данных от сотен пользователей создают избыточную нагрузку на SQL-сервер. Чтобы минимизировать влияние, рекомендуется:

Решение 4: Интеграция с внешними мессенджерами

В некоторых случаях пользователю удобнее получить уведомление не в самой 1С, а, например, в Telegram. Это упрощает задачу программиста, так как не требует связи "сервер-клиент" внутри платформы. HTTP-сервис 1С просто отправляет запрос к API Telegram Bot, и сообщение мгновенно появляется у пользователя на телефоне или компьютере.

Пример кода для отправки через Telegram:


Соединение = Новый HTTPСоединение("api.telegram.org", 443, , , , , Новый ЗащищенноеСоединениеOpenSSL());
Запрос = Новый HTTPЗапрос("/bot<Токен>/sendMessage?chat_id=<ID>&text=Событие_получено");
Ответ = Соединение.ОтправитьДляОбработки(Запрос);

Сравнение методов

Выясним, какой метод выбрать в зависимости от условий задачи:

  1. Система взаимодействия: Лучший выбор для современных конфигураций на платформе 8.3.10+. Минимум кода, официальная поддержка.
  2. Внешние компоненты (MQTT/TCP): Подходит для хардкорных задач, где критична скорость в миллисекунды или когда нельзя использовать сервер взаимодействия.
  3. Регистр сведений: "План Б", если нужно быстро реализовать механизм без настройки инфраструктуры, а количество пользователей невелико.
  4. Push-уведомления: Единственный верный путь для мобильных приложений 1С (используется метод ДоставитьПушУведомление).

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

← На главную