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