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