При построении корпоративных аналитических панелей, веб-порталов или BI-систем регулярно возникает задача трансляции ключевых показателей эффективности (KPI) из учетных систем «1С:Предприятие». Типичными примерами служат среднесписочная численность сотрудников из «1С:Зарплата и управление персоналом» или данные о финансовом результате и налоговых базах из «1С:Бухгалтерии предприятия».
Главная сложность заключается в том, что такие показатели не лежат в базе в виде готовой цифры. Они вычисляются сложными алгоритмами конфигураций с учетом множества законодательных правил, графиков работы, табелей и корректировок. Разберем наиболее эффективные и надежные архитектурные решения для передачи таких данных во внешнюю среду.
Рассмотрим популярные, но проблемные способы интеграции и выясним причины, по которым от них следует отказаться:
_Fld1234 могут измениться при очередном обновлении релиза, что полностью сломает интеграцию. Прямой SQL также игнорирует механизм разграничения прав на уровне записей (RLS) и виртуальные таблицы итогов.Самый гибкий подход состоит в создании собственного HTTP-сервиса на стороне 1С. Внутри сервиса мы программно инициализируем нужный типовой отчет (построенный на Системе компоновки данных), выполняем его компоновку и забираем расчетные показатели в типизированном виде.
Чтобы сторонней системе не приходилось разбирать визуальную разметку макета, выведем результат компоновки не в табличный документ, а напрямую в коллекцию значений. Для этого платформа предоставляет специальный объект ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений. Полученную таблицу значений можно легко сериализовать в формат JSON с помощью объекта ЗаписьJSON.
Посмотрим на пример кода метода HTTP-сервиса, рассчитывающего данные отчета:
Функция ПолучитьПоказателиОтчета(Запрос)
ПараметрыЗапроса = Запрос.ПараметрыЗапроса;
ДатаНачала = XMLЗначение(Тип("Дата"), ПараметрыЗапроса.Получить("ДатаНачала"));
ДатаОкончания = XMLЗначение(Тип("Дата"), ПараметрыЗапроса.Получить("ДатаОкончания"));
ОтчетОбъект = Отчеты.ЧисленностьИТекучестьКадров.Создать();
СхемаКД = ОтчетОбъект.СхемаКомпоновкиДанных;
Настройки = СхемаКД.НастройкиПоУмолчанию;
// Устанавливаем параметры периода формирования
ПараметрПериод = Настройки.ПараметрыДанных.Элементы.Найти("Период");
Если ПараметрПериод <> Неопределено Тогда
ПараметрПериод.Значение = Новый СтандартныйПериод(ДатаНачала, ДатаОкончания);
ПараметрПериод.Использование = Истина;
КонецЕсли;
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКД, Настройки,,, Тип("ГенераторМакетаКомпоновкиДанных"));
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);
ТаблицаРезультата = Новый ТаблицаЗначений;
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
ПроцессорВывода.УстановитьОбъект(ТаблицаРезультата);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);
// Преобразуем полученную коллекцию в массив структур для сериализации
МассивРезультат = Новый Массив;
Для Каждого Стр Из ТаблицаРезультата Цикл
СлужебнаяСтруктура = Новый Структура("Подразделение, СредняяЧисленность");
ЗаполнитьЗначенияСвойств(СлужебнаяСтруктура, Стр);
МассивРезультат.Добавить(СлужебнаяСтруктура);
КонецЦикла;
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, МассивРезультат);
СтрокаОтвета = ЗаписьJSON.Закрыть();
Ответ = Новый HTTPСервисОтвет(200);
Ответ.Заголовки.Вставить("Content-Type", "application/json; charset=utf-8");
Ответ.УстановитьТелоИзСтроки(СтрокаОтвета, КодировкаТекста.UTF8);
Возврат Ответ;
КонецФункции
Внешней информационной системе остается лишь отправить простой HTTP GET-запрос с датами и получить готовый структурированный массив чисел.
Если показатели требуются в том виде, в котором они сдаются в государственные органы (например, декларация по налогу на прибыль, расчет по страховым взносам или статистические формы), выполнять расчет заново нецелесообразно. В типовых конфигурациях эти данные уже рассчитаны бухгалтером и записаны в базу.
Проанализируем структуру подсистемы регламентированной отчетности:
РегламентированныйОтчет.ХранилищеЗначения в виде структур, таблиц или XML-пакетов выгрузки в контролирующие органы.В ситуациях, когда во внешней информационной системе нужно не обрабатывать числа математически, а лишь отображать аналитический отчет руководству с сохранением форматирования 1С, оптимален вывод в HTML.
Разберем по шагам реализацию этого механизма:
ТабличныйДокумент.ТабличныйДокумент.Записать() документ сохраняется во временный файл с типом ТипФайлаТабличногоДокумента.HTML.При организации интеграции важно учитывать производительность и стабильность учетной системы:
.cfe). Это гарантирует беспрепятственное автоматическое обновление типовых баз при выходе новых релизов.ФоновыеЗадания: сервис возвращает клиенту идентификатор задачи, а внешняя система периодически опрашивает статус ее готовности.