Как передавать расчетные данные и отчеты из 1С в стороннюю систему

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

При построении корпоративных аналитических панелей, веб-порталов или BI-систем регулярно возникает задача трансляции ключевых показателей эффективности (KPI) из учетных систем «1С:Предприятие». Типичными примерами служат среднесписочная численность сотрудников из «1С:Зарплата и управление персоналом» или данные о финансовом результате и налоговых базах из «1С:Бухгалтерии предприятия».

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

Почему не стоит использовать прямые SQL-запросы и COM-соединение

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

  1. Прямые запросы к СУБД (через ODBC или ADO). Попытка повторить алгоритм расчета регламентированного отчета (например, среднесписочной численности) на чистом SQL приводит к колоссальным трудозатратам. Кроме того, прямое чтение таблиц СУБД в обход сервера приложений нарушает лицензионное соглашение платформы «1С:Предприятие». Структура таблиц базы данных динамическая: имена полей вида _Fld1234 могут измениться при очередном обновлении релиза, что полностью сломает интеграцию. Прямой SQL также игнорирует механизм разграничения прав на уровне записей (RLS) и виртуальные таблицы итогов.
  2. Использование COM-соединения (COMConnector). Технология COM жестко привязана к операционной системе Windows. Если сторонний веб-сервер работает под управлением Linux, поднять прямое COM-подключение невозможно. Кроме того, COM-соединения требовательны к оперативной памяти сервера, медленно инициализируют сеансы и могут зависать при сбоях сетевого стека.

Решение 1. Программное формирование СКД-отчета через HTTP-сервис

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

Решение 2. Извлечение данных из сохраненной регламентированной отчетности

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

Проанализируем структуру подсистемы регламентированной отчетности:

  1. Экземпляры отчетов хранятся в документах или элементах справочника РегламентированныйОтчет.
  2. Все показатели форм размещены внутри реквизитов с типом ХранилищеЗначения в виде структур, таблиц или XML-пакетов выгрузки в контролирующие органы.
  3. Для интеграции достаточно реализовать HTTP-сервис, который находит последний утвержденный отчет за нужный отчетный период и считывает готовые ячейки.
  4. Если внешняя программа ориентирована на прием XML, можно использовать штатный алгоритм выгрузки регламентированного отчета, возвращая полученный XML-файл напрямую в теле HTTP-ответа.

Решение 3. Формирование табличного документа в формате HTML

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

Разберем по шагам реализацию этого механизма:

  1. В коде сервиса отчет выводится в стандартный объект ТабличныйДокумент.
  2. С помощью метода ТабличныйДокумент.Записать() документ сохраняется во временный файл с типом ТипФайлаТабличногоДокумента.HTML.
  3. Полученный HTML-текст передается в теле HTTP-ответа. Сторонняя система встраивает данный фрагмент во фрейм или блок страницы без какой-либо дополнительной верстки.

Архитектурные рекомендации по оптимизации взаимодействия

При организации интеграции важно учитывать производительность и стабильность учетной системы:

  1. Использование расширений конфигурации. Не изменяйте типовую конфигурацию «1С:ЗУП» или «1С:Бухгалтерия». Все HTTP-сервисы и вспомогательные модули создавайте в отдельном расширении (.cfe). Это гарантирует беспрепятственное автоматическое обновление типовых баз при выходе новых релизов.
  2. Устранение тайм-аутов веб-сервера. Расчет сложных аналитических отчетов за большой период может занимать от десятков секунд до нескольких минут. При синхронном запросе внешний веб-сервер может разорвать соединение по таймауту. В таких случаях выгрузку выносят в асинхронный режим с помощью объекта ФоновыеЗадания: сервис возвращает клиенту идентификатор задачи, а внешняя система периодически опрашивает статус ее готовности.
  3. Предварительный расчет (кэширование). Если показатели нужны регулярно и оперативно (например, для утреннего дашборда директора), настройте регламентное задание 1С, которое в ночное время формирует отчеты и записывает готовые агрегаты в специальный регистр сведений. HTTP-сервис в этом случае будет мгновенно отдавать готовые цифры из регистра без нагрузки на процессор.
← На главную