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

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

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

Проблема разделения контекстов: Сервер vs Клиент

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

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

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

Для реализации этого метода выполним следующие шаги:

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

Пример кода на сервере (в модуле HTTP-сервиса или общем модуле):


// Находим пользователя-получателя (например, ответственного диспетчера)
ПользовательСсылка = Справочники.Пользователи.НайтиПоНаименованию("Диспетчер");
ИдентификаторПользователя = СистемаВзаимодействия.ПолучитьИдентификаторПользователя(ПользовательСсылка);

// Создаем новое сообщение
НовоеСообщение = СистемаВзаимодействия.СоздатьСообщение(ИдентификаторПользователя);
НовоеСообщение.Текст = "Поступила новая заявка с сайта! Номер: " + НовыйДокумент.Номер;
НовоеСообщение.Данные = НовыйДокумент.Ссылка; // Передаем ссылку на объект
НовоеСообщение.Записать();

У пользователя в интерфейсе мгновенно появится всплывающее окно или индикатор в панели оповещений, кликнув по которому, он сможет открыть документ.

Решение 2: Оптимизированный опрос через обработчик ожидания

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

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

Шаг 1. Создание регистра очереди

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

Шаг 2. Запись в очередь на сервере

В момент создания документа в HTTP-сервисе или через Подписку на событие ПриЗаписи документа, добавим запись в этот регистр:


Запись = РегистрыСведений.ОчередьУведомлений.СоздатьМенеджерЗаписи();
Запись.Пользователь = ОтветственныйДиспетчер;
Запись.Объект = СсылкаНаНовыйДокумент;
Запись.Записать();

Шаг 3. Организация опроса на клиенте

В модуле управляемого приложения или в форме, которая всегда открыта у диспетчера, подключим обработчик ожидания. Рекомендуемый интервал — от 10 до 30 секунд.


&НаКлиенте
Процедура ПриОткрытии(Отказ)
    // Подключаем опрос раз в 15 секунд
    ПодключитьОбработчикОжидания("ПроверитьНовыеДокументы", 15);
КонецПроцедуры

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

Решение 3: Использование параметров сеанса и повторного использования значений

Выясним, как еще сильнее снизить нагрузку на СУБД. Постоянное обращение к таблицам базы данных (даже к маленьким) — это транзакционная нагрузка. Мы можем использовать Параметры сеанса и модули с повторным использованием значений.

Рассмотрим алгоритм "Папа и Сережа" (аналогия из обсуждения):

  1. Создадим общий модуль УведомленияСерверПовтИсп с установленным свойством "Возвращаемые значения на время сеанса".
  2. Внутри модуля создадим функцию, которая возвращает дату последнего созданного документа или булево-флаг.
  3. При создании документа через HTTP-сервис будем сбрасывать кэш этого модуля методом ОбновитьПовторноИспользуемыеЗначения().

Клиент, запрашивая данные, будет получать ответ мгновенно из памяти сервера, если новых документов не появлялось. Серверный вызов станет "бесплатным" для производительности системы.

Решение 4: Бизнес-процессы и Задачи

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

Преимущества использования Задач:

Важные рекомендации по безопасности и стабильности

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

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

← На главную