Как реализовать мгновенные оповещения с сервера на клиент при использовании HTTP-сервисов в 1С

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

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

Метод 1. Использование Системы взаимодействия (Штатный механизм)

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

Разберем по шагам, как программно отправить сообщение, которое инициализирует обновление чата у пользователя. Для этого проанализируем пример процедуры, которая рассылает уведомления:


Процедура ОповещениеОтАТС(Кому, ТекстОповещения, Действие = Неопределено, Данные = Неопределено)
    Если НЕ СистемаВзаимодействия.ИнформационнаяБазаЗарегистрирована Тогда
        Возврат;
    КонецЕсли;

    УстановитьПривилегированныйРежим(Истина);
    
    КомуИБ = ПользователиИнформационнойБазы.НайтиПоИмени(СокрЛП(Кому.Наименование));
    КомуИД = СистемаВзаимодействия.ПолучитьИдентификаторПользователя(КомуИБ.УникальныйИдентификатор);
    
    // В данном примере автором выступает системный пользователь "АТС"
    АвторИБ = ПользователиИнформационнойБазы.НайтиПоИмени("АТС");
    АвторИД = СистемаВзаимодействия.ПолучитьИдентификаторПользователя(АвторИБ.УникальныйИдентификатор);
    
    КлючОбсуждения = Строка(АвторИД) + " - " + Строка(КомуИД);
    Обсуждение = СистемаВзаимодействия.ПолучитьОбсуждение(КлючОбсуждения);
    
    // Если обсуждение не найдено, создаем новое приватное обсуждение
    Если Обсуждение = Неопределено Тогда
        Обсуждение = СистемаВзаимодействия.СоздатьОбсуждение;
        Обсуждение.Групповое = Ложь;
        Обсуждение.Ключ = КлючОбсуждения;
        Обсуждение.Участники.Добавить(АвторИД);
        Обсуждение.Участники.Добавить(КомуИД);
        Обсуждение.Записать();
    КонецЕсли;
    
    Сообщение = СистемаВзаимодействия.СоздатьСообщение(Обсуждение.Идентификатор);
    Сообщение.Автор = АвторИД;
    Сообщение.Текст = ТекстОповещения;
    
    // Можно передать структуру с данными, чтобы клиент обработал их программно
    Если Данные <> Неопределено Тогда
        Сообщение.Данные = Данные;
    КонецЕсли;
    
    Сообщение.Записать();
КонецПроцедуры

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

Метод 2. Клиентский опрос (Polling) через обработчик ожидания

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

Логика работы следующая:

  1. При получении данных в HTTP-сервис, мы записываем входящий JSON в специально созданный РегистрСведений (например, "ОчередьСообщений").
  2. В форме чата на клиенте при открытии вызываем ПодключитьОбработчикОжидания("ПроверитьНовыеСообщения", 5).
  3. Раз в 5 секунд срабатывает процедура ПроверитьНовыеСообщения, которая делает легкий запрос к регистру сведений по фильтру "Дата > ДатаПоследнейПроверки".

Проанализируем преимущества этого подхода: он прост в реализации и не требует сторонних сервисов. Основной минус — задержка обновления (в нашем примере до 5 секунд) и постоянные "холостые" обращения к базе данных.

Метод 3. Технология Long Polling (Длинные опросы)

Для минимизации задержек и исключения лишнего трафика разберем концепцию Long Polling. В отличие от обычного опроса, здесь клиент отправляет запрос, а сервер "удерживает" его до тех пор, пока не появится новое сообщение или не выйдет таймаут (например, 30 секунд).

Чтобы интерфейс 1С не "замерзал" во время ожидания, необходимо использовать асинхронные вызовы. Как только в HTTP-сервисе на сервере фиксируется запись в базе, удерживаемый запрос завершается, возвращая данные клиенту. Сразу после обработки ответа клиент инициирует новый "длинный" запрос.

Метод 4. Внешние компоненты и WebSockets

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

Метод 5. Использование JavaScript в Веб-клиенте

Проанализируем ситуацию, когда пользователи работают через браузер. В этом случае мы можем встроить в форму 1С ПолеHTMLДокумента. Внутри этого поля на языке JavaScript можно реализовать полноценный WebSocket-клиент или использовать Server-Sent Events (SSE). JavaScript может взаимодействовать с кодом 1С, вызывая оповещения внутри платформы, что позволяет обойти ограничения серверного контекста 1С.

Выводы и рекомендации

Подведем итог: если ваша конфигурация работает на платформе 8.3.10 и выше, Система взаимодействия — это приоритетный вариант. Она избавляет от необходимости изобретать велосипеды с опросами и сторонними компонентами. Если же вы ограничены старыми версиями или специфическими требованиями безопасности, оптимальным будет сочетание РегистраСведений (как буфера) и ОбработчикаОжидания на клиенте с оптимизированными запросами.

← На главную