Как организовать динамический веб-мониторинг заявок из 1С в реальном времени

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

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

Вариант 1. Разработка собственного HTTP-сервиса в 1С

Использование встроенного объекта метаданных HTTPСервис — это наиболее гибкий и производительный вариант для получения агрегированных данных. В отличие от тяжелых SOAP веб-сервисов или передачи избыточных данных, HTTP-сервис позволяет возвращать клиенту компактный JSON с готовыми цифрами.

Рассмотрим по шагам, как устроен этот механизм:

  1. В дереве метаданных конфигурации создаем объект HTTPСервис с корневым шаблоном URL, например /api/dashboard.
  2. Создаем метод HTTP (например, GET) и назначаем ему имя обработчика в модуле сервиса.
  3. В обработчике запроса формируем запрос к СУБД для подсчета заявок в разрезе статусов и сериализуем результат в формат JSON.

Посмотрим на пример реализации серверного обработчика 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-дереве страницы.

Вариант 2. Фоновая выгрузка статического JSON (снятие нагрузки с СУБД)

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

Разберем алгоритм настройки:

  1. Создаем регламентное задание с интервалом запуска 15–30 секунд.
  2. В процедуре задания выполняем расчет показателей и сохраняем результирующий JSON-файл прямо в каталог веб-сервера (Nginx, IIS или Apache).
  3. Браузер с монитором обращается не к 1С, а к статическому файлу dashboard.json. Веб-сервер отдает файл мгновенно, не расходуя лицензии 1С и не создавая серверных сеансов.

Вариант 3. Реализация монитора в штатном Веб-клиенте 1С

Если нет необходимости разрабатывать отдельный сторонний сайт, задачу можно решить полностью средствами платформы 1С без верстки внешних HTML-страниц.

Проанализируем шаги реализации:

  1. База данных публикуется на веб-сервере для доступа через браузер.
  2. Создается отдельная управляемая форма (обработки или рабочего стола) с крупными элементами оформления.
  3. В модуле формы подключается периодическое обновление с помощью метода ПодключитьОбработчикОжидания().

Пример кода модуля управляемой формы:


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

&НаКлиенте
Процедура ОбновитьДанныеМонитора()
	ОбновитьПоказателиНаСервере();
КонецПроцедуры

&НаСервере
Процедура ОбновитьПоказателиНаСервере()
	// Получение и заполнение реквизитов формы для отображения на экране
	ВРаботе = Документы.ЗаявкаКлиента.ПолучитьКоличествоПоСтатусу(Перечисления.СостоянияЗаявок.ВРаботе);
	ВОжидании = Документы.ЗаявкаКлиента.ПолучитьКоличествоПоСтатусу(Перечисления.СостоянияЗаявок.ВОжидании);
	Выполнено = Документы.ЗаявкаКлиента.ПолучитьКоличествоПоСтатусу(Перечисления.СостоянияЗаявок.Выполнено);
КонецПроцедуры

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

При организации периодических запросов к 1С следует учитывать системные ограничения:

  1. Настройка пула сеансов: При использовании HTTP-сервисов обязательно проверьте файл публикации default.vrd. Для исключения накладных расходов на постоянное создание и уничтожение пользовательских сеансов параметры пула (poolSize, poolTimeout) должны быть настроены на переиспользование активных сессий.
  2. Оптимизация запросов: Не выбирайте детальные таблицы документов. Подсчет должен выполняться сгруппированными запросами с обязательным ограничением по индексированным полям (например, по дате и статусу), либо с использованием оперативных регистров сведений.
  3. Событийная модель (Push): Если интервал обновления в 15 секунд оказывается недостаточным, используется промежуточный сервис очередей (WebSocket / Webhooks), куда 1С отправляет событие изменения статуса документа из события ПриЗаписи через объект HTTPСоединение, после чего промежуточный сервер мгновенно транслирует данные на открытый веб-экран.
← На главную