Разработка современных систем интеграции часто требует мгновенной реакции интерфейса 1С на события, происходящие во внешних системах (сайты, мобильные приложения). Типичная ситуация: внешний сайт отправляет POST-запрос к HTTP-сервису 1С, который программно создает документ. Однако, так как создание происходит в отдельной сессии на сервере, пользователь (диспетчер) в своем клиентском сеансе об этом не узнает без специальных механизмов. Рассмотрим подробнее, как решить задачу оповещения, не перегружая систему.
Важно понимать фундаментальное ограничение платформы 1С: серверный вызов, инициированный внешним запросом, не имеет доступа к клиентскому контексту конкретного пользователя. Процедура ПоказатьОповещениеПользователя() доступна только на клиенте. Если документ создается программно в сессии HTTP-сервиса, платформа "не знает", какому именно пользователю нужно вывести окно. Поэтому нам необходимо организовать "мостик" между серверным событием и клиентским приложением.
Проанализируем самый современный механизм — Систему взаимодействия. Это встроенный в платформу инструмент, позволяющий реализовать полноценные Push-уведомления. Главное преимущество в том, что она работает через протокол WebSocket, поддерживая постоянное соединение, и не требует ежесекундного опроса базы данных.
Для реализации этого метода выполним следующие шаги:
Пример кода на сервере (в модуле HTTP-сервиса или общем модуле):
// Находим пользователя-получателя (например, ответственного диспетчера)
ПользовательСсылка = Справочники.Пользователи.НайтиПоНаименованию("Диспетчер");
ИдентификаторПользователя = СистемаВзаимодействия.ПолучитьИдентификаторПользователя(ПользовательСсылка);
// Создаем новое сообщение
НовоеСообщение = СистемаВзаимодействия.СоздатьСообщение(ИдентификаторПользователя);
НовоеСообщение.Текст = "Поступила новая заявка с сайта! Номер: " + НовыйДокумент.Номер;
НовоеСообщение.Данные = НовыйДокумент.Ссылка; // Передаем ссылку на объект
НовоеСообщение.Записать();
У пользователя в интерфейсе мгновенно появится всплывающее окно или индикатор в панели оповещений, кликнув по которому, он сможет открыть документ.
Если Система взаимодействия недоступна, традиционным решением остается механизм "polling" (опрос). Однако, чтобы избежать DDOS-эффекта на сервер, разберем, как сделать этот процесс максимально легким.
Основная идея: клиент раз в несколько секунд вызывает "легкую" серверную функцию, которая проверяет наличие новых записей в специальной "очереди". В качестве очереди лучше использовать непериодический независимый Регистр Сведений.
Шаг 1. Создание регистра очереди
Создадим регистр ОчередьУведомлений с измерениями Пользователь и Объект. Это позволит нам быстро выбирать записи, предназначенные конкретному сотруднику.
Шаг 2. Запись в очередь на сервере
В момент создания документа в HTTP-сервисе или через Подписку на событие ПриЗаписи документа, добавим запись в этот регистр:
Запись = РегистрыСведений.ОчередьУведомлений.СоздатьМенеджерЗаписи();
Запись.Пользователь = ОтветственныйДиспетчер;
Запись.Объект = СсылкаНаНовыйДокумент;
Запись.Записать();
Шаг 3. Организация опроса на клиенте
В модуле управляемого приложения или в форме, которая всегда открыта у диспетчера, подключим обработчик ожидания. Рекомендуемый интервал — от 10 до 30 секунд.
&НаКлиенте
Процедура ПриОткрытии(Отказ)
// Подключаем опрос раз в 15 секунд
ПодключитьОбработчикОжидания("ПроверитьНовыеДокументы", 15);
КонецПроцедуры
&НаКлиенте
Процедура ПроверитьНовыеДокументы()
// Вызываем серверную функцию проверки
ДанныеОповещения = ПроверитьОчередьНаСервере();
Если ДанныеОповещения <> Неопределено Тогда
Для Каждого Стр Из ДанныеОповещения Цикл
ПоказатьОповещениеПользователя("Новая заявка",
ПолучитьНавигационнуюСсылку(Стр.Объект),
"Создан новый документ с сайта");
КонецЦикла;
КонецЕсли;
КонецПроцедуры
Выясним, как еще сильнее снизить нагрузку на СУБД. Постоянное обращение к таблицам базы данных (даже к маленьким) — это транзакционная нагрузка. Мы можем использовать Параметры сеанса и модули с повторным использованием значений.
Рассмотрим алгоритм "Папа и Сережа" (аналогия из обсуждения):
УведомленияСерверПовтИсп с установленным свойством "Возвращаемые значения на время сеанса".ОбновитьПовторноИспользуемыеЗначения().Клиент, запрашивая данные, будет получать ответ мгновенно из памяти сервера, если новых документов не появлялось. Серверный вызов станет "бесплатным" для производительности системы.
Проанализируем ситуацию, когда вместо простого уведомления требуется гарантированная обработка. В 1С для этого предназначен объект Задача. Вместо того чтобы просто "мигнуть" окошком, HTTP-сервис может создать задачу, адресованную группе "Диспетчеры".
Преимущества использования Задач:
При реализации механизмов частого опроса следует учитывать риск повреждения базы данных, особенно в файловом варианте. Выясним основные правила:
Пока ... Цикл или Предупреждение с таймаутом на сервере.Разделяемая или проверку через ПараметрыСеанса, чтобы не блокировать запись новых документов HTTP-сервисом.ОчередьУведомлений сразу после того, как клиент их получил, иначе регистр разрастется и опрос станет медленным.Таким образом, для простых самописных конфигураций оптимальным будет сочетание Регистра сведений (как очереди) и Обработчика ожидания. Для крупных корпоративных систем единственным правильным решением является Система взаимодействия.