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

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

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

Рассмотрим, почему так происходит, и разберем два основных способа решения этой задачи.

Причина проблемы и особенности архитектуры ЗУП 3.1

В архитектуре ЗУП 3.1 логика работы с документами разделена на два слоя:

  1. Модуль объекта: отвечая за базовое заполнение структуры через событие ОбработкаЗаполнения(), он не содержит автоматического вызова тяжелых алгоритмов расчета зарплаты, чтобы не замедлять пакетную обработку данных.
  2. Модуль формы и серверные модули: вся интерактивная математика (расчет среднего заработка, начислений, НДФЛ и переначислений) привязана к клиентско-серверному контексту формы и специализированным общим модулям расчета.

Если изменить реквизит документа программно через ДокументОбъект, события формы не сработают, и табличные части останутся пустыми или нескорректированными.

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

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

Проанализируем алгоритм реализации данного подхода:

  1. Создаем или получаем объект документа и записываем его базовые реквизиты.
  2. Получаем форму документа с помощью функции ПолучитьФорму().
  3. Вызываем экспортную процедуру заполнения и перерасчета из модуля формы.

Рассмотрим пример кода:


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

// Открываем форму в контексте клиента и вызываем перерасчет
ПараметрыФормы = Новый Структура("Ключ", ДокОтпуск.Ссылка);
ФормаДокумента = ПолучитьФорму("Документ.Отпуск.Форма.ФормаДокумента", ПараметрыФормы);

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

Ограничение метода: этот вариант не работает в регламентных заданиях, фоновых процессах, REST/SOAP-сервисах или при интеграции через COM-соединение, так как на сервере без клиентского контекста создание форм запрещено платформой 1С.

Способ 2. Серверный расчет через подсистемы ЗУП 3.1 (универсальный способ)

Для фоновой обработки данных и работы на стороне сервера необходимо обращаться напрямую к серверным процедурам подсистемы расчета зарплаты (в частности, к общему модулю РасчетЗарплатыРасширенный и модулям менеджеров документов).

Разберем по шагам правильную последовательность действий:

  1. Инициализация объекта: заполняем реквизиты шапки (Организация, Сотрудник, МесяцНачисления, период отпуска).
  2. Заполнение по умолчанию: вызываем Заполнить() для инициализации базовых флагов и параметров расчета.
  3. Расчет табличных частей: передаем объект документа в функции общего модуля РасчетЗарплатыРасширенный или модуля менеджера соответствующего документа.
  4. Запись и проведение: сохраняем и проводим документ.

Посмотрим на пример серверного кода:


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

// Первичная обработка заполнения
ДокументОбъект.Заполнить(Неопределено);

// Задаем периоды отпуска
ДокументОбъект.ДатаНачала = ДатаНачала;
ДокументОбъект.ДатаОкончания = ДатаОкончания;

// Вызов серверных механизмов перерасчета среднего заработка и начислений
РасчетЗарплатыРасширенный.ЗаполнитьИРассчитатьДокумент(ДокументОбъект);

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

Важные нюансы при программном расчете

  1. Данные среднего заработка: для корректного расчета выплат ЗУП 3.1 использует сведения из регистра Данные о начислениях для расчета среднего заработка. Убедитесь, что за предшествующие 12 месяцев данные в информационной базе проведены и актуализированы.
  2. Порядок заполнения ТЧ: при ручной манипуляции с табличными частями (например, Начисления, НДФЛ, Переначисления) без вызова процедур подсистемы расчета зарплаты повышается риск нерасчета районных коэффициентов или ошибок при последующем формировании документа Начисление зарплаты и взносов.
← На главную