При автоматизации сервисных служб, отделов логистики и технической поддержки часто возникает задача вывести оперативные показатели (количество заявок в работе, на согласовании, выполненных) на отдельный экран или монитор в браузере с автоматическим обновлением каждые несколько секунд. Разберем основные архитектурные варианты решения этой задачи, особенности реализации и способы оптимизации нагрузки на базу данных 1С.
Использование встроенного объекта метаданных HTTPСервис — это наиболее гибкий и производительный вариант для получения агрегированных данных. В отличие от тяжелых SOAP веб-сервисов или передачи избыточных данных, HTTP-сервис позволяет возвращать клиенту компактный JSON с готовыми цифрами.
Рассмотрим по шагам, как устроен этот механизм:
HTTPСервис с корневым шаблоном URL, например /api/dashboard.GET) и назначаем ему имя обработчика в модуле сервиса.Посмотрим на пример реализации серверного обработчика HTTP-сервиса:
Функция МониторЗаявокGET(Запрос)
Ответ = Новый HTTPСервисОтвет(200);
Ответ.Заголовки.Вставить("Content-Type", "application/json; charset=utf-8");
Ответ.Заголовки.Вставить("Access-Control-Allow-Origin", "*");
ЗапросБД = Новый Запрос;
ЗапросБД.Текст =
"ВЫБРАТЬ
| Заявка.Состояние КАК Статус,
| КОЛИЧЕСТВО(Заявка.Ссылка) КАК Количество
|ИЗ
| Документ.ЗаявкаКлиента КАК Заявка
|ГДЕ
| Заявка.Проведен = ИСТИНА
| И Заявка.Дата МЕЖДУ НАЧАЛОПЕРИОДА(&ТекущаяДата, ДЕНЬ) И КОНЕЦПЕРИОДА(&ТекущаяДата, ДЕНЬ)
|СГРУППИРОВАТЬ ПО
| Заявка.Состояние";
ЗапросБД.УстановитьПараметр("ТекущаяДата", ТекущаяДатаСеанса());
Выборка = ЗапросБД.Выполнить().Выбрать();
СтруктураДанных = Новый Структура;
СтруктураДанных.Вставить("ВРаботе", 0);
СтруктураДанных.Вставить("ВОжидании", 0);
СтруктураДанных.Вставить("Выполнено", 0);
Пока Выборка.Следующий() Цикл
Если Выборка.Статус = Перечисления.СостоянияЗаявок.ВРаботе Тогда
СтруктураДанных.ВРаботе = Выборка.Количество;
ИначеЕсли Выборка.Статус = Перечисления.СостоянияЗаявок.ВОжидании Тогда
СтруктураДанных.ВОжидании = Выборка.Количество;
ИначеЕсли Выборка.Статус = Перечисления.СостоянияЗаявок.Выполнено Тогда
СтруктураДанных.Выполнено = Выборка.Количество;
КонецЕсли;
КонецЦикла;
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, СтруктураДанных);
Ответ.УстановитьТелоИзСтроки(ЗаписьJSON.Закрыть(), КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);
Возврат Ответ;
КонецФункции
На стороне внешней веб-страницы достаточно использовать стандартный JavaScript-таймер setInterval(), который каждые 15 секунд отправляет асинхронный запрос fetch() к опубликованному сервису и обновляет блоки с цифрами в DOM-дереве страницы.
Если к странице мониторинга обращается много пользователей или база 1С высоконагружена, постоянные частые запросы (polling) могут нагружать сервер. В таком случае эффективнее использовать генерацию статического файла регламентным заданием.
Разберем алгоритм настройки:
dashboard.json. Веб-сервер отдает файл мгновенно, не расходуя лицензии 1С и не создавая серверных сеансов.Если нет необходимости разрабатывать отдельный сторонний сайт, задачу можно решить полностью средствами платформы 1С без верстки внешних HTML-страниц.
Проанализируем шаги реализации:
ПодключитьОбработчикОжидания().Пример кода модуля управляемой формы:
&НаКлиенте
Процедура ПриОткрытии(Отказ)
ОбновитьДанныеМонитора();
// Подключаем автоматический вызов процедуры каждые 15 секунд
ПодключитьОбработчикОжидания("ОбновитьДанныеМонитора", 15, Ложь);
КонецПроцедуры
&НаКлиенте
Процедура ОбновитьДанныеМонитора()
ОбновитьПоказателиНаСервере();
КонецПроцедуры
&НаСервере
Процедура ОбновитьПоказателиНаСервере()
// Получение и заполнение реквизитов формы для отображения на экране
ВРаботе = Документы.ЗаявкаКлиента.ПолучитьКоличествоПоСтатусу(Перечисления.СостоянияЗаявок.ВРаботе);
ВОжидании = Документы.ЗаявкаКлиента.ПолучитьКоличествоПоСтатусу(Перечисления.СостоянияЗаявок.ВОжидании);
Выполнено = Документы.ЗаявкаКлиента.ПолучитьКоличествоПоСтатусу(Перечисления.СостоянияЗаявок.Выполнено);
КонецПроцедуры
При организации периодических запросов к 1С следует учитывать системные ограничения:
default.vrd. Для исключения накладных расходов на постоянное создание и уничтожение пользовательских сеансов параметры пула (poolSize, poolTimeout) должны быть настроены на переиспользование активных сессий.ПриЗаписи через объект HTTPСоединение, после чего промежуточный сервер мгновенно транслирует данные на открытый веб-экран.