При интеграции 1С:Зарплата и управление персоналом (ЗУП) с внешними системами, такими как корпоративные порталы, мобильные приложения или личные кабинеты сторонних разработчиков, часто возникает задача передачи данных расчетного листка в структурированном виде (XML или JSON). Стандартно расчетный листок предназначен для вывода на печать или в PDF, однако программный доступ к его данным требует понимания внутренней кухни конфигурации. В этой статье мы разберем несколько способов решения этой задачи: от простой передачи PDF-файла в формате Base64 до глубокого анализа механизмов СКД для получения чистых данных.
Если принимающей стороне достаточно видеть визуальную копию документа, а не обрабатывать отдельные цифры, самым быстрым способом будет программное формирование печатной формы и ее упаковка в Base64. Рассмотрим, как это реализовать на стороне сервера.
Для формирования расчетного листка мы можем воспользоваться функцией типового модуля УчетНачисленнойЗарплаты. Проанализируем пример кода:
&НаСервере
Процедура ПолучитьРасчетныйЛистокНаСервере()
// Инициализируем данные для формирования
ТабДок = УчетНачисленнойЗарплаты.РасчетныйЛистокПоДаннымДокумента(Организация, СписокФизическихЛиц, Месяц);
// Записываем табличный документ во временный поток в формате PDF
ПотокВПамяти = Новый ПотокВПамяти;
ТабДок.Записать(ПотокВПамяти, ТипФайлаТабличногоДокумента.PDF);
// Получаем двоичные данные и переводим в Base64 для передачи через XML или JSON
ДвоичныеДанные = ПотокВПамяти.ЗакрытьИПолучитьДвоичныеДанные();
ДвоичныеДанныеВBase64 = XMLСтрока(ДвоичныеДанные);
// Теперь строку ДвоичныеДанныеВBase64 можно вставить в поле JSON-объекта
КонецПроцедуры
Этот метод хорош тем, что он сохраняет оригинальное оформление расчетного листка, принятое в компании. Однако для анализа данных на стороне получателя он бесполезен.
Рассмотрим более сложный, но правильный с точки зрения обработки данных путь. В современных редакциях ЗУП 3.1 расчетный листок строится на базе системы компоновки данных (СКД). Основная логика сосредоточена в общем модуле ЗарплатаКадрыОтчеты.
Выясним, какие функции отвечают за сбор данных. Ключевыми точками входа являются:
ЗарплатаКадрыОтчеты.ПриКомпоновкеРезультатаРасчетныйЛисток — основная процедура инициализации.ВывестиТелоРасчетногоЛистка — именно здесь происходит наполнение данными структур СтрокиОтчетаНачислено, СтрокиОтчетаУдержано и других.Чтобы получить данные в JSON, нам нужно перехватить эти коллекции до того, как они будут выведены в ДокументРезультат. Проанализируем ситуацию: мы можем создать свой отчет на базе типовой схемы компоновки, но вместо вывода в табличный документ использовать ПроцессорВыводаОбъектаВКоллекциюЗначений.
Разберем по шагам, как получить данные расчетного листка в виде таблицы, которую потом легко сериализовать в JSON. Для этого нам потребуется выполнить компоновку результата в коллекцию.
Схема = Отчеты.НачисленияУдержанияПоСотрудникам.ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
Настройки = Схема.НастройкиПоУмолчанию;
// Устанавливаем параметры: период, организация, сотрудники
ПараметрПериод = Настройки.ПараметрыДанных.Элементы.Найти("Период");
ПараметрПериод.Значение = Новый СтандартныйПериод(НачалоМесяца, КонецМесяца);
ПараметрПериод.Использование = Истина;
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(Схема, Настройки, , , Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
ТаблицаРезультат = Новый ТаблицаЗначений;
ПроцессорВывода.УстановитьОбъект(ТаблицаРезультат);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);
После выполнения этого кода в переменной ТаблицаРезультат окажутся все цифры расчетного листка. Нам остается только преобразовать их в массив структур и вызвать ЗаписатьJSON.
Если вы работаете с актуальными релизами ЗУП 3.1, обратите внимание на модуль КабинетСотрудникаПодготовкаДанных. В рамках этого сервиса фирма «1С» уже реализовала выгрузку расчетных листков в структурированном виде для передачи на облачный сервер.
Проанализируем преимущества этого подхода: Во-первых, данные уже собираются в оптимизированные структуры. Во-вторых, механизмы учитывают все нюансы законодательства (НДФЛ, вычеты, выплаты через банк и кассу). Вы можете вызвать функции этого модуля из своего HTTP-сервиса, чтобы получить готовый XDTO-объект или структуру, готовую к превращению в JSON.
Для обмена между базами 1С формат XML через XDTO является наиболее надежным. Вы можете создать в конфигурации (или расширении) свой пакет XDTO, описывающий структуру расчетного листка (Шапка, Начисления, Удержания, Сальдо).
Посмотрим на пример записи данных в XML:
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.УстановитьСтроку();
// Предположим, ОбъектXDTO уже заполнен данными из выборки
ФабрикаXDTO.ЗаписатьXML(ЗаписьXML, ОбъектXDTO);
РезультатXML = ЗаписьXML.Закрыть();
Использование XDTO гарантирует, что на другой стороне данные будут прочитаны корректно, так как структура жестко типизирована.
При реализации выгрузки через HTTP-запросы следует помнить о нескольких критически важных моментах:
HTTPS и надежные методы авторизации.НачисленияУдержанияПоСотрудникам и ВзаиморасчетыСПотрудниками. Если запросов много, рассмотрите вариант кэширования сформированных JSON-структур в специальном регистре сведений.ISO 8601, который 1С использует по умолчанию.Таким образом, выбор метода зависит от ваших целей. Если нужна просто «картинка» — используйте Base64. Если же данные должны участвовать в дальнейших расчетах или отображаться в интерфейсе другого приложения — используйте программную работу с СКД или функции модуля КабинетСотрудникаПодготовкаДанных.