Как программно получить данные из расчетного листка в 1С:ЗУП 3.1?

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

В конфигурации 1С:Зарплата и управление персоналом 3.1 отчет Расчетный листок является одним из самых сложных с точки зрения архитектуры. Он не просто обращается к регистрам сведений или накопления, а использует механизмы компоновки данных с внешними наборами, динамическое формирование временных таблиц и сложные алгоритмы распределения выплат. Часто перед разработчиком встает задача: получить эти данные программно (например, для выгрузки в мобильное приложение, личный кабинет или для специфического анализа), не переписывая с нуля огромные запросы. Рассмотрим, как это сделать правильно.

Метод 1: Использование программного интерфейса общего модуля (Рекомендуемый)

Проанализируем наиболее современный и стабильный способ, который появился в последних релизах (начиная с 3.1.23/3.1.27). В общем модуле ЗарплатаКадрыОтчеты существует функция, которая позволяет получить готовую структуру с данными, не прибегая к ручной настройке компоновщика.

Для реализации этого метода нам потребуется инициализировать объект отчета и вызвать функцию ДанныеРасчетныхЛистков. Разберем пример кода:


// 1. Инициализируем настройки
ОтчетРасчетныйЛисток = ЗарплатаКадрыОтчеты.ОтчетРасчетныйЛисток;

// 2. Вызываем функцию получения данных
// Параметры: ФизическиеЛица, Организация, НачалоПериода, КонецПериода, ОбъектОтчета
РезультатСтруктура = ЗарплатаКадрыОтчеты.ДанныеРасчетныхЛистков(
    СписокФизЛиц, 
    Организация, 
    МесяцФормирования, 
    МесяцФормирования, 
    ОтчетРасчетныйЛисток
);

// 3. Извлекаем таблицу значений
ДанныеТЗ = РезультатСтруктура.ДанныеРасчетныхЛистков;

В переменной ДанныеТЗ мы получим таблицу, где каждая строка содержит данные по конкретному сотруднику и периоду. Важно понимать, что поле ДанныеРасчетныхЛистков внутри структуры — это не просто плоский список, а детализированный набор данных, который система использует для заполнения макета. Если вам нужен сам печатный документ, в этой же структуре будет поле ДокументРезультат с типом ТабличныйДокумент.

Метод 2: Ручное формирование через Систему компоновки данных (СКД)

Если вам требуется более тонкая настройка или вы работаете на более старых релизах, где первый метод недоступен, можно пойти по пути программного выполнения схемы компоновки. Отчет Анализ начислений и удержаний (частью которого является расчетный листок) работает на внешних наборах данных. Это значит, что просто вызвать СкомпоноватьРезультат() не получится — нужно подготовить эти наборы вручную.

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


// Создаем объект отчета
ОтчетОбъект = Отчеты.АнализНачисленийИУдержаний.Создать();
ОтчетОбъект.ИнициализироватьОтчет();

// Находим нужный вариант (Расчетный листок)
ВариантОтчета = ОтчетОбъект.СхемаКомпоновкиДанных.ВариантыНастроек.Найти("РасчетныйЛисток");
Если ВариантОтчета = Неопределено Тогда
    Возврат;
КонецЕсли;

НастройкиОтчета = ВариантОтчета.Настройки;

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

// Устанавливаем отбор по ФИЗИЧЕСКОМУ ЛИЦУ
// Это критически важный момент: РЛ работает через физлиц для объединения данных по совместительству
СписокФизЛиц = Новый СписокЗначений;
СписокФизЛиц.Добавить(НужныйСотрудник.ФизическоеЛицо);
ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбора(НастройкиОтчета.Отбор, "ФизическоеЛицо", СписокФизЛиц, ВидСравненияКомпоновкиДанных.ВСписке, , Истина);

ОтчетОбъект.КомпоновщикНастроек.ЗагрузитьНастройки(НастройкиОтчета);

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

ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
// Ключевой момент: получение структуры внешних наборов
НачисленияУдержанияДокумента = ЗарплатаКадрыОтчетыБазовый.НаборыВнешнихДанныхАнализНачисленийИУдержаний();

ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновкиДанных, НачисленияУдержанияДокумента, , Истина);

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

Важные технические нюансы и "подводные камни"

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

  1. Отбор по сотруднику vs Физлицу: В СКД расчетного листка часто настроены связи, которые ориентированы на ФизическоеЛицо. Если установить отбор только по полю Сотрудник, отчет может вернуть пустой результат или некорректные данные по начислениям. Всегда проверяйте, какой тип отбора используется в вашем варианте настроек.
  2. Внешние наборы данных: Метод ЗарплатаКадрыОтчетыБазовый.НаборыВнешнихДанныхАнализНачисленийИУдержаний() возвращает структуру таблиц (Начисления, Удержания, Выплаты и т.д.). Система сама заполнит их в процессе выполнения, если правильно переданы параметры периода и организации.
  3. Месяц начисления: Расчетный листок в ЗУП формируется по месяцам начисления, а не по фактическим датам регистра. Если вы укажете произвольный период (например, с 15-го по 15-е число), данные могут "разъехаться". Используйте строго начало и конец календарного месяца.
  4. Долги и сальдо: Данные о долгах на начало и конец месяца рассчитываются в момент формирования отчета на основании регистров взаиморасчетов. Если вы получаете пустую таблицу, убедитесь, что в КомпоновщикНастроек загружены ПользовательскиеНастройки, так как некоторые флаги (например, "Выводить взаиморасчеты по данным бухучета") могут находиться именно там.

Когда лучше использовать регистры напрямую?

Проанализируем ситуацию: если ваша задача — просто получить сумму начислений за месяц без детализации "как в листике", то использование механизмов отчета избыточно. В этом случае проще написать прямой запрос к виртуальным таблицам регистров:

Однако, если вам нужно полное соответствие печатной форме (с учетом всех группировок, разбивок по источникам финансирования и специфических вычетов), то описанные выше программные методы вызова ЗарплатаКадрыОтчеты — единственный надежный путь.

← На главную