Разработка интеграций часто ставит перед программистом задачу: сервер 1С получает данные через HTTP-сервис (например, POST-запрос от сторонней системы), и на это событие должен мгновенно среагировать конкретный пользователь в открытом сеансе. Основная сложность заключается в архитектуре: HTTP-сервис выполняется в фоновом сеансе на сервере, который "не знает" об открытых клиентских окнах и не может напрямую вызвать метод Оповестить() на клиенте.
В этой статье мы подробно разберем, как преодолеть это ограничение, проанализируем современные инструменты платформы и выберем наиболее эффективные способы реализации механизма "Push" от сервера к клиенту.
Это наиболее современный и технологичный подход. Система взаимодействия позволяет передавать сообщения между пользователями и фоновыми процессами практически мгновенно, используя протокол WebSockets. Преимущество метода в том, что нам не нужно постоянно опрашивать сервер — клиент "слушает" канал и реагирует только при поступлении сообщения.
Рассмотрим по шагам процесс реализации. Сначала нам нужно настроить клиентское приложение на прослушивание определенного обсуждения. Обычно это делается при запуске АРМ (автоматизированного рабочего места) или в обработчике ПриНачалеРаботыСистемы.
Шаг 1. Настройка подписчика на клиенте
Для того чтобы клиент среагировал на сообщение, мы используем метод НачатьПодключениеОбработчикаНовыхСообщений. Разберем пример кода:
// В модуле управляемой формы или в общем модуле на клиенте
Процедура ПодключитьСлушателяСобытий() Экспорт
Ключ = "СобытияHTTPСервиса";
Обсуждение = СистемаВзаимодействия.ПолучитьОбсуждение(Ключ);
// Если обсуждение не найдено, его можно создать программно
Если Обсуждение = Неопределено Тогда
// Код создания обсуждения...
КонецЕсли;
ДопПараметр = Новый Структура("КлючОбсуждения", Обсуждение);
ОП = Новый ОписаниеОповещения("ОбработкаНовогоСообщения", ЭтотОбъект, ДопПараметр);
// Подключаем обработчик, который сработает при поступлении сообщения
СистемаВзаимодействия.НачатьПодключениеОбработчикаНовыхСообщений(, Обсуждение, ОП);
КонецПроцедуры
Процедура ОбработкаНовогоСообщения(Сообщение, ДополнительныеПараметры) Экспорт
// Здесь пишем логику реакции на событие
// Например, выводим оповещение или открываем форму
ПоказатьОповещениеПользователя("Новое событие!", , Сообщение.Текст);
КонецПроцедуры
Шаг 2. Отправка сообщения из HTTP-сервиса
Теперь проанализируем серверную часть. В методе POST вашего HTTP-сервиса необходимо создать сообщение в то же самое обсуждение. Важно, что сообщение может содержать не только текст, но и структуру данных в свойстве Данные.
// В модуле HTTP-сервиса (на сервере)
Метод = СистемаВзаимодействия.ПолучитьОбсуждение("СобытияHTTPСервиса");
НовоеСообщение = СистемаВзаимодействия.СоздатьСообщение(Метод);
НовоеСообщение.Текст = "Получены данные от внешней системы";
// Можно передать параметры для обработки на клиенте
НовоеСообщение.Данные = Новый Структура("ИдентификаторСобытия, Тип", "123", "Тикет");
НовоеСообщение.Записать();
Если Система взаимодействия по каким-то причинам недоступна (например, закрытый контур без интернета и локального сервера системы взаимодействия), можно воспользоваться протоколом MQTT. Это стандарт для "интернета вещей" (IoT), который идеально подходит для мгновенной передачи коротких сообщений.
Разберем принцип работы этого метода:
ВнешнееСобытие, которое перехватывается в 1С в одноименной процедуре модуля управляемого приложения или формы.Этот способ считается очень надежным и быстрым, так как не нагружает базу данных 1С лишними транзакциями.
Если требуется решение "из коробки" без дополнительных сервисов и компонент, рассмотрим вариант с использованием регистра сведений. Несмотря на критику из-за нагрузки, при правильной настройке он вполне жизнеспособен.
Проанализируем алгоритм:
ОчередьСобытийДляПользователей. Измерения: Пользователь; Ресурсы: ДанныеСобытия, Прочитано (Булево).ПодключитьОбработчикОжидания("ПроверитьНовыеСобытия", 5);.Выясним причину, по которой этот метод может "тормозить" систему: слишком частые запросы (например, каждую секунду) к базе данных от сотен пользователей создают избыточную нагрузку на SQL-сервер. Чтобы минимизировать влияние, рекомендуется:
В некоторых случаях пользователю удобнее получить уведомление не в самой 1С, а, например, в Telegram. Это упрощает задачу программиста, так как не требует связи "сервер-клиент" внутри платформы. HTTP-сервис 1С просто отправляет запрос к API Telegram Bot, и сообщение мгновенно появляется у пользователя на телефоне или компьютере.
Пример кода для отправки через Telegram:
Соединение = Новый HTTPСоединение("api.telegram.org", 443, , , , , Новый ЗащищенноеСоединениеOpenSSL());
Запрос = Новый HTTPЗапрос("/bot<Токен>/sendMessage?chat_id=<ID>&text=Событие_получено");
Ответ = Соединение.ОтправитьДляОбработки(Запрос);
Выясним, какой метод выбрать в зависимости от условий задачи:
ДоставитьПушУведомление).Рассмотрев все варианты, мы видим, что 1С прошла долгий путь от простых обработчиков ожидания до полноценных событийных моделей. Выбор конкретного инструмента должен основываться на требованиях к оперативности оповещения и готовности ИТ-инфраструктуры к внедрению дополнительных сервисов, таких как сервер системы взаимодействия или MQTT-брокер.