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

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

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

Метод 1: Использование компоновщика отчета «Анализ начислений и удержаний»

Рассмотрим ситуацию, когда мы пытаемся создать отчет программно, используя схему компоновки данных. Типовой расчетный листок строится на базе отчета АнализНачисленийИУдержаний. Проанализируем пример кода, который часто приводит к ошибкам. Для понимания контекста и поиска других доступных процедур полезно иметь под рукой справочник методов конфигурации Зарплата и кадры 3.1 с примерами реализации.


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

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

Метод 2: Использование функции ДанныеРасчетныхЛистков (Рекомендуемый)

Для более стабильной работы программного формирования лучше использовать специализированные функции общего модуля ЗарплатаКадрыОтчеты. Этот метод позволяет получить как готовую таблицу значений с данными, так и сформированный ТабличныйДокумент. Разберем этот способ по шагам:


// Подготавливаем объект отчета
ОтчетРасчетныйЛисток = ЗарплатаКадрыОтчеты.ОтчетРасчетныйЛисток();

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

// Получаем сформированный табличный документ
ТабДок = РезультатСбораДанных.ДокументРезультат;

Преимущество этого метода заключается в том, что РезультатСбораДанных содержит структуру, в которой есть и сырые данные, и уже готовое визуальное представление. Если вам необходимо получить специфические данные, которые трудно извлечь стандартным запросом, рекомендуем использовать консоль запросов ЗУП с поддержкой программного интерфейса, которая позволяет обращаться к методам системы напрямую в теле запроса.

Почему в расчетном листке появляются «лишние» данные и минусы?

Проанализируем ситуацию, когда в листке появляются записи типа «Отсутствие по невыясненной причине» с отрицательными часами и суммами. Это происходит потому, что ЗУП редко отдает корректные данные простыми запросами — за ними стоит сложная бизнес-логика перерасчетов. Чтобы лучше понимать, как устроена эта механика, можно изучить универсальный отчёт для ЗУП, который помогает сократить время разработки сложных отчетов в разы.

Механизм появления сторно-записей обычно следующий:

  1. Механизм вытеснения: В прошлом месяце сотрудник не вышел на работу, и ему был зафиксирован документ «Отсутствие (НН)».
  2. Регистрация документа-исправления: В текущем месяце сотрудник принес больничный лист за тот же период.
  3. Сторнирование: ЗУП автоматически сторнирует (отменяет) начисление «НН» и начисляет «Болничный». Эти сторно-записи имеют период регистрации — текущий месяц, а период действия — прошлый.

Если в расчетном листке вы видите такие записи, это означает, что отчет настроен на вывод данных по периоду регистрации. Проверим настройки периода: если вы формируете листок за декабрь, и в декабре был зарегистрирован перерасчет за ноябрь, эти данные обязаны попасть в декабрьский листок, иначе у вас не сойдется сальдо (взаиморасчеты) с сотрудником.

Как убрать строки с нулевыми суммами или специфические записи?

Если бизнес-логика требует скрыть определенные строки (например, технические доначисления или пустые строки без сумм), обычный отбор через КомпоновщикНастроек.Настройки.Отбор может не сработать, так как структура расчетного листка иерархична. Посмотрим, как применить отбор правильно:

Вариант 1: Использование условного оформления. Вместо удаления данных, мы можем программно скрыть строки. Это более безопасно для итоговых сумм.


ЭлементОформления = ОтчетРасчетныйЛисток.КомпоновщикНастроек.Настройки.УсловноеОформление.Элементы.Добавить();
ЭлементОформления.Оформление.УстановитьЗначениеПараметра("Видимость", Ложь);

// Условие: Сумма равно 0
ЭлементУсловия = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементУсловия.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Сумма");
ЭлементУсловия.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ЭлементУсловия.ПравоеЗначение = 0;
ЭлементУсловия.Использование = Истина;

Вариант 2: Фильтрация вложенных группировок. Расчетный листок состоит из групп «Начисления», «Удержания», «Выплаты». Чтобы отбор по полю Сумма сработал, его нужно накладывать не на весь отчет, а на конкретные ветки структуры настроек СКД. Проанализируем структуру: если поле Сумма является ресурсом, то отбор нужно добавлять в коллекцию Отбор конкретной группировки, отвечающей за детальные записи.

Подведение итогов

Для корректного программного формирования расчетного листка в 1С:ЗУП 3.1 мы рекомендуем придерживаться следующих правил:

  1. Использовать функции общего модуля ЗарплатаКадрыОтчеты, а не пытаться вручную инициализировать СКД «с нуля». Это гарантирует заполнение шапки отчета.
  2. Всегда проверять соответствие периодов начала и окончания месяца. Для расчетного листка критически важно использовать НачалоМесяца и КонецМесяца.
  3. Понимать природу отрицательных значений. Если они появляются — это результат перерасчетов прошлых периодов. Удаление их из листка «силовым» методом приведет к тому, что конечное сальдо в печатной форме не совпадет с бухгалтерским учетом.
  4. Помнить о возможности интеграции с внешними системами.

Следуя этим рекомендациям, вы сможете создавать надежные механизмы формирования отчетности, которые будут полностью соответствовать типовым алгоритмам системы 1С.

← На главную