В конфигурации 1С:Зарплата и управление персоналом 3.1 отчет Расчетный листок является одним из самых сложных с точки зрения архитектуры. Он не просто обращается к регистрам сведений или накопления, а использует механизмы компоновки данных с внешними наборами, динамическое формирование временных таблиц и сложные алгоритмы распределения выплат. Часто перед разработчиком встает задача: получить эти данные программно (например, для выгрузки в мобильное приложение, личный кабинет или для специфического анализа), не переписывая с нуля огромные запросы. Рассмотрим, как это сделать правильно.
Проанализируем наиболее современный и стабильный способ, который появился в последних релизах (начиная с 3.1.23/3.1.27). В общем модуле ЗарплатаКадрыОтчеты существует функция, которая позволяет получить готовую структуру с данными, не прибегая к ручной настройке компоновщика.
Для реализации этого метода нам потребуется инициализировать объект отчета и вызвать функцию ДанныеРасчетныхЛистков. Разберем пример кода:
// 1. Инициализируем настройки
ОтчетРасчетныйЛисток = ЗарплатаКадрыОтчеты.ОтчетРасчетныйЛисток;
// 2. Вызываем функцию получения данных
// Параметры: ФизическиеЛица, Организация, НачалоПериода, КонецПериода, ОбъектОтчета
РезультатСтруктура = ЗарплатаКадрыОтчеты.ДанныеРасчетныхЛистков(
СписокФизЛиц,
Организация,
МесяцФормирования,
МесяцФормирования,
ОтчетРасчетныйЛисток
);
// 3. Извлекаем таблицу значений
ДанныеТЗ = РезультатСтруктура.ДанныеРасчетныхЛистков;
В переменной ДанныеТЗ мы получим таблицу, где каждая строка содержит данные по конкретному сотруднику и периоду. Важно понимать, что поле ДанныеРасчетныхЛистков внутри структуры — это не просто плоский список, а детализированный набор данных, который система использует для заполнения макета. Если вам нужен сам печатный документ, в этой же структуре будет поле ДокументРезультат с типом ТабличныйДокумент.
Если вам требуется более тонкая настройка или вы работаете на более старых релизах, где первый метод недоступен, можно пойти по пути программного выполнения схемы компоновки. Отчет Анализ начислений и удержаний (частью которого является расчетный листок) работает на внешних наборах данных. Это значит, что просто вызвать СкомпоноватьРезультат() не получится — нужно подготовить эти наборы вручную.
Рассмотрим пошагово, как инициализировать отчет и получить данные в ТаблицуЗначений:
// Создаем объект отчета
ОтчетОбъект = Отчеты.АнализНачисленийИУдержаний.Создать();
ОтчетОбъект.ИнициализироватьОтчет();
// Находим нужный вариант (Расчетный листок)
ВариантОтчета = ОтчетОбъект.СхемаКомпоновкиДанных.ВариантыНастроек.Найти("РасчетныйЛисток");
Если ВариантОтчета = Неопределено Тогда
Возврат;
КонецЕсли;
НастройкиОтчета = ВариантОтчета.Настройки;
// Устанавливаем период
ПараметрПериод = НастройкиОтчета.ПараметрыДанных.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("Период"));
Если ПараметрПериод <> Неопределено Тогда
ПараметрПериод.Значение = Новый СтандартныйПериод(НачалоМесяца, КонецМесяца);
ПараметрПериод.Использование = Истина;
КонецЕсли;
// Устанавливаем отбор по ФИЗИЧЕСКОМУ ЛИЦУ
// Это критически важный момент: РЛ работает через физлиц для объединения данных по совместительству
СписокФизЛиц = Новый СписокЗначений;
СписокФизЛиц.Добавить(НужныйСотрудник.ФизическоеЛицо);
ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбора(НастройкиОтчета.Отбор, "ФизическоеЛицо", СписокФизЛиц, ВидСравненияКомпоновкиДанных.ВСписке, , Истина);
ОтчетОбъект.КомпоновщикНастроек.ЗагрузитьНастройки(НастройкиОтчета);
// Подготавливаем процессор компоновки и внешние наборы данных
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновкиДанных = КомпоновщикМакета.Выполнить(ОтчетОбъект.СхемаКомпоновкиДанных, ОтчетОбъект.КомпоновщикНастроек.Настройки, , , Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));
ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
// Ключевой момент: получение структуры внешних наборов
НачисленияУдержанияДокумента = ЗарплатаКадрыОтчетыБазовый.НаборыВнешнихДанныхАнализНачисленийИУдержаний();
ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновкиДанных, НачисленияУдержанияДокумента, , Истина);
// Выводим результат в таблицу значений
ДанныеТЗ = Новый ТаблицаЗначений;
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
ПроцессорВывода.УстановитьОбъект(ДанныеТЗ);
ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных);
При программной работе с расчетными листками важно учитывать несколько неочевидных моментов, на которых часто спотыкаются разработчики:
ФизическоеЛицо. Если установить отбор только по полю Сотрудник, отчет может вернуть пустой результат или некорректные данные по начислениям. Всегда проверяйте, какой тип отбора используется в вашем варианте настроек.ЗарплатаКадрыОтчетыБазовый.НаборыВнешнихДанныхАнализНачисленийИУдержаний() возвращает структуру таблиц (Начисления, Удержания, Выплаты и т.д.). Система сама заполнит их в процессе выполнения, если правильно переданы параметры периода и организации.КомпоновщикНастроек загружены ПользовательскиеНастройки, так как некоторые флаги (например, "Выводить взаиморасчеты по данным бухучета") могут находиться именно там.Проанализируем ситуацию: если ваша задача — просто получить сумму начислений за месяц без детализации "как в листике", то использование механизмов отчета избыточно. В этом случае проще написать прямой запрос к виртуальным таблицам регистров:
РегистрНакопления.НачисленияУдержанияПоСотрудникам.ОборотыРегистрНакопления.ВзаиморасчетыС_Сотрудниками.ОстаткиИОборотыОднако, если вам нужно полное соответствие печатной форме (с учетом всех группировок, разбивок по источникам финансирования и специфических вычетов), то описанные выше программные методы вызова ЗарплатаКадрыОтчеты — единственный надежный путь.