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