Как выгрузить расчетный листок из 1С:ЗУП в форматы XML или JSON

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

При интеграции 1С:Зарплата и управление персоналом (ЗУП) с внешними системами, такими как корпоративные порталы, мобильные приложения или личные кабинеты сторонних разработчиков, часто возникает задача передачи данных расчетного листка в структурированном виде (XML или JSON). Стандартно расчетный листок предназначен для вывода на печать или в PDF, однако программный доступ к его данным требует понимания внутренней кухни конфигурации. В этой статье мы разберем несколько способов решения этой задачи: от простой передачи PDF-файла в формате Base64 до глубокого анализа механизмов СКД для получения чистых данных.

Способ 1: Передача печатной формы в формате Base64

Если принимающей стороне достаточно видеть визуальную копию документа, а не обрабатывать отдельные цифры, самым быстрым способом будет программное формирование печатной формы и ее упаковка в Base64. Рассмотрим, как это реализовать на стороне сервера.

Для формирования расчетного листка мы можем воспользоваться функцией типового модуля УчетНачисленнойЗарплаты. Проанализируем пример кода:


&НаСервере
Процедура ПолучитьРасчетныйЛистокНаСервере()
    // Инициализируем данные для формирования
    ТабДок = УчетНачисленнойЗарплаты.РасчетныйЛистокПоДаннымДокумента(Организация, СписокФизическихЛиц, Месяц);
    
    // Записываем табличный документ во временный поток в формате PDF
    ПотокВПамяти = Новый ПотокВПамяти;
    ТабДок.Записать(ПотокВПамяти, ТипФайлаТабличногоДокумента.PDF);
    
    // Получаем двоичные данные и переводим в Base64 для передачи через XML или JSON
    ДвоичныеДанные = ПотокВПамяти.ЗакрытьИПолучитьДвоичныеДанные();
    ДвоичныеДанныеВBase64 = XMLСтрока(ДвоичныеДанные);
    
    // Теперь строку ДвоичныеДанныеВBase64 можно вставить в поле JSON-объекта
КонецПроцедуры

Этот метод хорош тем, что он сохраняет оригинальное оформление расчетного листка, принятое в компании. Однако для анализа данных на стороне получателя он бесполезен.

Способ 2: Использование типовых механизмов отчета «Расчетный листок»

Рассмотрим более сложный, но правильный с точки зрения обработки данных путь. В современных редакциях ЗУП 3.1 расчетный листок строится на базе системы компоновки данных (СКД). Основная логика сосредоточена в общем модуле ЗарплатаКадрыОтчеты.

Выясним, какие функции отвечают за сбор данных. Ключевыми точками входа являются:

  1. ЗарплатаКадрыОтчеты.ПриКомпоновкеРезультатаРасчетныйЛисток — основная процедура инициализации.
  2. ВывестиТелоРасчетногоЛистка — именно здесь происходит наполнение данными структур СтрокиОтчетаНачислено, СтрокиОтчетаУдержано и других.

Чтобы получить данные в JSON, нам нужно перехватить эти коллекции до того, как они будут выведены в ДокументРезультат. Проанализируем ситуацию: мы можем создать свой отчет на базе типовой схемы компоновки, но вместо вывода в табличный документ использовать ПроцессорВыводаОбъектаВКоллекциюЗначений.

Способ 3: Программная работа с СКД для получения таблицы значений

Разберем по шагам, как получить данные расчетного листка в виде таблицы, которую потом легко сериализовать в JSON. Для этого нам потребуется выполнить компоновку результата в коллекцию.


Схема = Отчеты.НачисленияУдержанияПоСотрудникам.ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
Настройки = Схема.НастройкиПоУмолчанию;

// Устанавливаем параметры: период, организация, сотрудники
ПараметрПериод = Настройки.ПараметрыДанных.Элементы.Найти("Период");
ПараметрПериод.Значение = Новый СтандартныйПериод(НачалоМесяца, КонецМесяца);
ПараметрПериод.Использование = Истина;

КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(Схема, Настройки, , , Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));

ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);

ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
ТаблицаРезультат = Новый ТаблицаЗначений;
ПроцессорВывода.УстановитьОбъект(ТаблицаРезультат);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);

После выполнения этого кода в переменной ТаблицаРезультат окажутся все цифры расчетного листка. Нам остается только преобразовать их в массив структур и вызвать ЗаписатьJSON.

Способ 4: Использование механизмов сервиса «1С:Кабинет сотрудника»

Если вы работаете с актуальными релизами ЗУП 3.1, обратите внимание на модуль КабинетСотрудникаПодготовкаДанных. В рамках этого сервиса фирма «1С» уже реализовала выгрузку расчетных листков в структурированном виде для передачи на облачный сервер.

Проанализируем преимущества этого подхода: Во-первых, данные уже собираются в оптимизированные структуры. Во-вторых, механизмы учитывают все нюансы законодательства (НДФЛ, вычеты, выплаты через банк и кассу). Вы можете вызвать функции этого модуля из своего HTTP-сервиса, чтобы получить готовый XDTO-объект или структуру, готовую к превращению в JSON.

Способ 5: Сериализация данных в XML через XDTO

Для обмена между базами 1С формат XML через XDTO является наиболее надежным. Вы можете создать в конфигурации (или расширении) свой пакет XDTO, описывающий структуру расчетного листка (Шапка, Начисления, Удержания, Сальдо).

Посмотрим на пример записи данных в XML:


ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.УстановитьСтроку();

// Предположим, ОбъектXDTO уже заполнен данными из выборки
ФабрикаXDTO.ЗаписатьXML(ЗаписьXML, ОбъектXDTO);

РезультатXML = ЗаписьXML.Закрыть();

Использование XDTO гарантирует, что на другой стороне данные будут прочитаны корректно, так как структура жестко типизирована.

Важные нюансы и производительность

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

  1. Безопасность: Расчетный листок содержит персональные данные. Используйте только HTTPS и надежные методы авторизации.
  2. Производительность: Генерация расчетного листка — это сложный запрос к регистрам НачисленияУдержанияПоСотрудникам и ВзаиморасчетыСПотрудниками. Если запросов много, рассмотрите вариант кэширования сформированных JSON-структур в специальном регистре сведений.
  3. Формат дат: При сериализации в JSON убедитесь, что принимающая сторона понимает стандарт ISO 8601, который 1С использует по умолчанию.

Таким образом, выбор метода зависит от ваших целей. Если нужна просто «картинка» — используйте Base64. Если же данные должны участвовать в дальнейших расчетах или отображаться в интерфейсе другого приложения — используйте программную работу с СКД или функции модуля КабинетСотрудникаПодготовкаДанных.

← На главную