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

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

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

Особенности архитектуры документа в ЗУП 3.1

Прежде чем приступать к написанию кода, проанализируем ситуацию: документ Документ.РазовоеНачисление содержит несколько ключевых табличных частей (ТЧ), которые должны быть синхронизированы между собой:

  1. Начисления — здесь фиксируется список сотрудников, вид начисления и общие суммы.
  2. Показатели — содержит значения показателей (например, «Процент премии» или «Сумма»), на основании которых рассчитывается результат.
  3. НДФЛ — расчет налога, который в ЗУП 3.1 часто происходит «внутри» документа начисления.
  4. Взносы — расчет страховых взносов (если предусмотрено настройками).

Связь между строкой в ТЧ Начисления и соответствующими ей строками в ТЧ Показатели или НДФЛ осуществляется через специальное поле ИдентификаторСтроки. Это числовое поле (целое число), которое должно быть уникальным в рамках документа для каждой строки сотрудника, но одинаковым для всех связанных данных этого сотрудника.

Способ 1: Прямое программное создание документа «Разовое начисление»

Рассмотрим по шагам, как реализовать создание документа. Выясним причину, почему недостаточно просто добавить строку в ТЧ Начисления: без заполнения ТЧ Показатели и корректной связи формула начисления просто не сработает.

Шаг 1. Создание объекта и заполнение шапки

Сначала мы создаем новый объект документа и заполняем основные реквизиты: организацию, месяц начисления и дату выплаты. Последний реквизит критически важен для НДФЛ.


НовыйДокумент = Документы.РазовоеНачисление.СоздатьДокумент();
НовыйДокумент.Дата = ТекущаяДата();
НовыйДокумент.Организация = СсылкаНаОрганизацию;
НовыйДокумент.МесяцНачисления = НачалоМесяца(ДатаНачисления);
НовыйДокумент.Начисление = СсылкаНаВидРасчета; // Например, Премия разовая
НовыйДокумент.ДатаВыплаты = ПланируемаяДатаВыплаты;

Шаг 2. Заполнение табличных частей и связывание через идентификатор

Проанализируем процесс добавления строк. Для каждого сотрудника мы должны сгенерировать уникальный ИдентификаторСтроки.


СчетчикID = 0;
Для Каждого СтрокаДанных Из ВашаТаблицаСДанными Цикл
    СчетчикID = СчетчикID + 1;
    
    // Заполняем основную таблицу начислений
    НоваяСтрокаНачисления = НовыйДокумент.Начисления.Добавить();
    НоваяСтрокаНачисления.Сотрудник = СтрокаДанных.Сотрудник;
    НоваяСтрокаНачисления.ФизическоеЛицо = СтрокаДанных.Сотрудник.ФизическоеЛицо;
    НоваяСтрокаНачисления.ИдентификаторСтроки = СчетчикID;
    
    // Заполняем показатели для этой строки
    // Предположим, у начисления есть показатель "Процент"
    НоваяСтрокаПоказателя = НовыйДокумент.Показатели.Добавить();
    НоваяСтрокаПоказателя.ИдентификаторСтроки = СчетчикID;
    НоваяСтрокаПоказателя.Показатель = Справочники.ПоказателиРасчетаЗарплаты.НайтиПоНаименованию("Процент");
    НоваяСтрокаПоказателя.Значение = СтрокаДанных.Процент;
КонецЦикла;

Шаг 3. Расчет документа

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

Используем специализированный программный интерфейс. В ЗУП 3.1 за это отвечает модуль РасчетЗарплатыРасширенный. Однако, стоит учитывать, что полный расчет «в фоне» требует подготовки структуры параметров. Если автоматический расчет вызывает сложности, можно записать документ и оставить его для «ручного» пересчета пользователем, но для полной автоматизации используйте:


// Перед расчетом документ должен быть записан (хотя бы в режиме Запись)
НовыйДокумент.Записать(РежимЗаписиДокумента.Запись);

ПараметрыРасчета = РасчетЗарплатыРасширенный.ПараметрыРасчетаДокумента();
ПараметрыРасчета.ДокументСсылка = НовыйДокумент.Ссылка;
// Вызов серверной процедуры расчета НДФЛ и сумм
РасчетЗарплатыРасширенный.Рассчитать(НовыйДокумент.Ссылка);

Способ 2: Использование документа «Данные для расчета зарплаты»

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

Преимущества этого метода:

Реализация по шагам:

  1. Создайте в интерфейсе Шаблон ввода данных (Настройка — Шаблоны ввода исходных данных). В шаблоне укажите, какие показатели вы будете вводить (например, «Процент премии»).
  2. В коде создавайте документ ДанныеДляРасчетаЗарплаты, указывая этот шаблон.

ДокДанные = Документы.ДанныеДляРасчетаЗарплаты.СоздатьДокумент();
ДокДанные.Дата = ТекущаяДата();
ДокДанные.Организация = СсылкаНаОрганизацию;
ДокДанные.НастройкаИзмененияДанных = СсылкаНаШаблон; // Ссылка на созданный ранее шаблон
ДокДанные.ПериодРегистрации = НачалоМесяца(ТекущаяДата());

Для Каждого Стр Из ТаблицаЗначений Цикл
    НоваяСтрока = ДокДанные.ТаблицаДанных.Добавить();
    НоваяСтрока.Сотрудник = Стр.Сотрудник;
    // Имя реквизита будет соответствовать коду показателя из шаблона
    НоваяСтрока.ПроцентПремии = Стр.Процент; 
КонецЦикла;

ДокДанные.Записать(РежимЗаписиДокумента.Проведение);

Важные нюансы и типичные ошибки

Проанализируем критические моменты, которые часто упускают при разработке в ЗУП:

1. Дата выплаты и НДФЛ
В ЗУП 3.1 доход для целей НДФЛ фиксируется не по дате документа, а по реквизиту ДатаВыплаты. Если вы создаете Разовое начисление и не заполняете эту дату, налог может рассчитаться некорректно или «уйти» на другую дату, что испортит отчет 6-НДФЛ. Всегда программно устанавливайте актуальную планируемую дату выплаты.

2. Межрасчетный период vs Зарплата
Если в настройках начисления указано, что оно выплачивается «С зарплатой», то документ Разовое начисление может вообще не рассчитывать НДФЛ внутри себя — он просто зафиксирует сумму, а налог доначислится в конце месяца. Если же выплата «В межрасчетный период», то расчет НДФЛ внутри документа обязателен.

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

Вывод: для разовых премий или доплат, зависящих от внешних данных (например, загрузка процентов из Excel), оптимальным решением является использование документа Данные для расчета зарплаты. Если же бизнес-процесс требует именно отдельный документ Разовое начисление, не забывайте про ИдентификаторСтроки и обязательную установку ДатыВыплаты.

← На главную