Как программно создать документ "Прием на работу" в 1С:ЗУП 3.1 и избежать ошибок с расчетом ФОТ?

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

При программном создании кадровых документов, таких как ПриемНаРаботу, в конфигурации 1С:Зарплата и Управление Персоналом (ЗУП) 3.1 часто возникают неочевидные проблемы. Если мы переносим данные из другой информационной базы через внешнее соединение (COM/OLE) или загружаем из внешнего файла, система может вести себя не так, как при ручном вводе. Давайте подробно рассмотрим типичную проблему, с которой сталкиваются разработчики: некорректное формирование Фонда оплаты труда (ФОТ) при добавлении начислений, зависящих от процента.

Проанализируем суть проблемы

Представим ситуацию: мы программно создаем документ приема на работу и нам нужно добавить сотруднику два начисления: оклад (например, 10 000 рублей) и доплату за вредность (например, 5%). При программном заполнении разработчик может столкнуться со странным поведением системы: документ создается, регистры заполняются, но ФОТ в документе становится равным 10 005 рублям. То есть система прибавляет 5% не как расчетную сумму, а как абсолютное значение — 5 рублей.

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

Разберем структуру табличных частей "Начисления" и "Показатели"

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

  1. Табличная часть "Начисления": предназначена для указания видов расчета, которые назначаются сотруднику. Здесь есть важный реквизит Размер. Ключевая ошибка заключается в том, что многие пытаются записать в этот реквизит процент (наши 5%). Однако в ЗУП 3.1 колонка Размер в этой табличной части используется системой для хранения вычисленного денежного эквивалента вклада данного начисления в общий ФОТ.
  2. Табличная часть "Показатели": предназначена для хранения значений самих показателей расчета (процентов, коэффициентов, количества дней и т.д.). Именно сюда нужно записывать значение "5" для показателя процента надбавки.

Таким образом, когда мы программно подставляем цифру 5 в реквизит Начисления.Размер, система воспринимает это как 5 рублей вклада в ФОТ, и складывает: 10 000 (оклад) + 5 (рублей надбавки) = 10 005. Если же мы оставим поле Размер пустым, алгоритмы проведения документа могут выдать ошибку или оставить ФОТ незаполненным, так как расчет "на лету" без формы не отработал.

Посмотрим на варианты решения проблемы

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

Вариант 1: Самостоятельный математический расчет на стороне источника

Если мы создаем документ напрямую через COM-соединение строка за строкой, мы должны взять на себя математику расчета вкладов в ФОТ. Мы заполняем и ТЧ "Показатели", и ТЧ "Начисления", но в Начисления.Размер передаем вычисленную сумму.

Проанализируем пример кода:


// Добавляем Оклад
НачислениеОклад = ДокПрием.Начисления.Добавить();
НачислениеОклад.Начисление = СсылкаНаОклад;
НачислениеОклад.ИдентификаторСтрокиВидаРасчета = 1;
НачислениеОклад.Размер = 10000; // Оклад в рублях

ПоказательОклад = ДокПрием.Показатели.Добавить();
ПоказательОклад.Показатель = СсылкаПоказательОклад;
ПоказательОклад.Значение = 10000;
ПоказательОклад.ИдентификаторСтрокиВидаРасчета = 1;

// Добавляем Процентную надбавку
НачислениеПроцент = ДокПрием.Начисления.Добавить();
НачислениеПроцент.Начисление = СсылкаНаНадбавку;
НачислениеПроцент.ИдентификаторСтрокиВидаРасчета = 2;
// Вычисляем абсолютный размер вклада в ФОТ: (10000 * 5) / 100 = 500 рублей
НачислениеПроцент.Размер = 500; 

ПоказательПроцент = ДокПрием.Показатели.Добавить();
ПоказательПроцент.Показатель = СсылкаПоказательПроцент;
ПоказательПроцент.Значение = 5; // А вот тут пишем сами проценты
ПоказательПроцент.ИдентификаторСтрокиВидаРасчета = 2;

Этот способ хорошо работает для простых формул расчета (как процент от оклада). Но если у вас сложные зависимые базы, расчет может стать затруднительным.

Вариант 2: Использование экспортных процедур ЗУП (Рекомендуемый подход)

Более надежный вариант — не создавать документ "снаружи" через COM-соединение по строкам, а написать небольшую функцию (или веб-сервис) внутри самой базы ЗУП 3.1. В эту функцию мы передаем только базовые параметры, а внутри она вызывает типовые механизмы пересчета ФОТ.

В конфигурации ЗУП 3.1 есть процедура, подобная ПерезаполнитьНачисленияСотрудника, или общие модули (например, РасчетЗарплатыРасширенный или КадровыйУчет), которые умеют инициализировать пересчет планового ФОТ для объекта документа до его записи.

Рассмотрим примерную схему работы такой процедуры-обертки:


Процедура СоздатьПриемНаРаботуСПересчетом(ПараметрыСотрудника) Экспорт
    
    ДокОбъект = Документы.ПриемНаРаботу.СоздатьДокумент();
    // Заполнение шапки документа
    ДокОбъект.Организация = ПараметрыСотрудника.Организация;
    ДокОбъект.Сотрудник = ПараметрыСотрудника.Сотрудник;
    
    // Заполняем только показатели, как они есть (оклад = 10000, процент = 5)
    // ... логика добавления строк в Показатели ...
    
    // Вызываем типовой метод конфигурации для пересчета начислений и ФОТ по показателям
    // Внимание: точное имя модуля зависит от релиза ЗУП 3.1.
    // Часто используются методы из модулей ЗарплатаКадрыРасширенный или КадровыйУчет
    ПараметрыПересчета = Новый Структура("ПересчитыватьФОТ", Истина);
    ОбработкаТабличныхЧастейЗарплатаКадры.ПриИзмененииПоказателей(ДокОбъект, ПараметрыПересчета);
    
    ДокОбъект.Записать(РежимЗаписиДокумента.Проведение);
    
КонецПроцедуры

Вариант 3: Использование служебной обработки "Пересчет планового ФОТ"

Если документы уже созданы загрузкой "как есть" (с кривым ФОТ, где 10000+5=10005), и менять механизм интеграции сложно, можно воспользоваться встроенным инструментом системы.

В самом ЗУП 3.1 существует штатная обработка Пересчет планового ФОТ (находится в разделе "Зарплата" – "Сервис"). После того как документы приема на работу загружены программно, вы можете запустить эту обработку. Выберите нужных сотрудников и нажмите кнопку пересчета. Система проанализирует табличные части Показатели, самостоятельно выполнит все расчеты по актуальным формулам начислений и корректно обновит скрытые реквизиты размеров и общий ФОТ.

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

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

← На главную