При программном создании кадровых документов, таких как ПриемНаРаботу, в конфигурации 1С:Зарплата и Управление Персоналом (ЗУП) 3.1 часто возникают неочевидные проблемы. Если мы переносим данные из другой информационной базы через внешнее соединение (COM/OLE) или загружаем из внешнего файла, система может вести себя не так, как при ручном вводе. Давайте подробно рассмотрим типичную проблему, с которой сталкиваются разработчики: некорректное формирование Фонда оплаты труда (ФОТ) при добавлении начислений, зависящих от процента.
Представим ситуацию: мы программно создаем документ приема на работу и нам нужно добавить сотруднику два начисления: оклад (например, 10 000 рублей) и доплату за вредность (например, 5%). При программном заполнении разработчик может столкнуться со странным поведением системы: документ создается, регистры заполняются, но ФОТ в документе становится равным 10 005 рублям. То есть система прибавляет 5% не как расчетную сумму, а как абсолютное значение — 5 рублей.
Выясним причину такого поведения. Дело в том, что в ЗУП 3.1 архитектура хранения плановых начислений разделена между несколькими табличными частями. Если мы заполняем документ интерактивно (руками), отрабатывают события формы, которые на лету пересчитывают все зависимые показатели. При программном создании (особенно через внешнее соединение) форма документа не открывается, события не вызываются, и мы остаемся один на один с "голыми" табличными частями.
Чтобы понять, как правильно решить задачу, посмотрим на назначение ключевых табличных частей документа ПриемНаРаботу.
Размер. Ключевая ошибка заключается в том, что многие пытаются записать в этот реквизит процент (наши 5%). Однако в ЗУП 3.1 колонка Размер в этой табличной части используется системой для хранения вычисленного денежного эквивалента вклада данного начисления в общий ФОТ.Таким образом, когда мы программно подставляем цифру 5 в реквизит Начисления.Размер, система воспринимает это как 5 рублей вклада в ФОТ, и складывает: 10 000 (оклад) + 5 (рублей надбавки) = 10 005. Если же мы оставим поле Размер пустым, алгоритмы проведения документа могут выдать ошибку или оставить ФОТ незаполненным, так как расчет "на лету" без формы не отработал.
Существует несколько путей обхода этой особенности ЗУП 3.1. Рассмотрим подробнее каждый из них, чтобы вы могли выбрать наиболее подходящий для вашей задачи.
Если мы создаем документ напрямую через COM-соединение строка за строкой, мы должны взять на себя математику расчета вкладов в ФОТ. Мы заполняем и ТЧ "Показатели", и ТЧ "Начисления", но в Начисления.Размер передаем вычисленную сумму.
Проанализируем пример кода:
// Добавляем Оклад
НачислениеОклад = ДокПрием.Начисления.Добавить();
НачислениеОклад.Начисление = СсылкаНаОклад;
НачислениеОклад.ИдентификаторСтрокиВидаРасчета = 1;
НачислениеОклад.Размер = 10000; // Оклад в рублях
ПоказательОклад = ДокПрием.Показатели.Добавить();
ПоказательОклад.Показатель = СсылкаПоказательОклад;
ПоказательОклад.Значение = 10000;
ПоказательОклад.ИдентификаторСтрокиВидаРасчета = 1;
// Добавляем Процентную надбавку
НачислениеПроцент = ДокПрием.Начисления.Добавить();
НачислениеПроцент.Начисление = СсылкаНаНадбавку;
НачислениеПроцент.ИдентификаторСтрокиВидаРасчета = 2;
// Вычисляем абсолютный размер вклада в ФОТ: (10000 * 5) / 100 = 500 рублей
НачислениеПроцент.Размер = 500;
ПоказательПроцент = ДокПрием.Показатели.Добавить();
ПоказательПроцент.Показатель = СсылкаПоказательПроцент;
ПоказательПроцент.Значение = 5; // А вот тут пишем сами проценты
ПоказательПроцент.ИдентификаторСтрокиВидаРасчета = 2;
Этот способ хорошо работает для простых формул расчета (как процент от оклада). Но если у вас сложные зависимые базы, расчет может стать затруднительным.
Более надежный вариант — не создавать документ "снаружи" через COM-соединение по строкам, а написать небольшую функцию (или веб-сервис) внутри самой базы ЗУП 3.1. В эту функцию мы передаем только базовые параметры, а внутри она вызывает типовые механизмы пересчета ФОТ.
В конфигурации ЗУП 3.1 есть процедура, подобная ПерезаполнитьНачисленияСотрудника, или общие модули (например, РасчетЗарплатыРасширенный или КадровыйУчет), которые умеют инициализировать пересчет планового ФОТ для объекта документа до его записи.
Рассмотрим примерную схему работы такой процедуры-обертки:
Процедура СоздатьПриемНаРаботуСПересчетом(ПараметрыСотрудника) Экспорт
ДокОбъект = Документы.ПриемНаРаботу.СоздатьДокумент();
// Заполнение шапки документа
ДокОбъект.Организация = ПараметрыСотрудника.Организация;
ДокОбъект.Сотрудник = ПараметрыСотрудника.Сотрудник;
// Заполняем только показатели, как они есть (оклад = 10000, процент = 5)
// ... логика добавления строк в Показатели ...
// Вызываем типовой метод конфигурации для пересчета начислений и ФОТ по показателям
// Внимание: точное имя модуля зависит от релиза ЗУП 3.1.
// Часто используются методы из модулей ЗарплатаКадрыРасширенный или КадровыйУчет
ПараметрыПересчета = Новый Структура("ПересчитыватьФОТ", Истина);
ОбработкаТабличныхЧастейЗарплатаКадры.ПриИзмененииПоказателей(ДокОбъект, ПараметрыПересчета);
ДокОбъект.Записать(РежимЗаписиДокумента.Проведение);
КонецПроцедуры
Если документы уже созданы загрузкой "как есть" (с кривым ФОТ, где 10000+5=10005), и менять механизм интеграции сложно, можно воспользоваться встроенным инструментом системы.
В самом ЗУП 3.1 существует штатная обработка Пересчет планового ФОТ (находится в разделе "Зарплата" – "Сервис"). После того как документы приема на работу загружены программно, вы можете запустить эту обработку. Выберите нужных сотрудников и нажмите кнопку пересчета. Система проанализирует табличные части Показатели, самостоятельно выполнит все расчеты по актуальным формулам начислений и корректно обновит скрытые реквизиты размеров и общий ФОТ.
При программной работе с документами, изменяющими плановые начисления в 1С:ЗУП 3.1, всегда помните о разделении данных: в табличную часть Показатели идут сами вводимые значения (проценты, тарифы, дни), а в Начисления.Размер — итоговый денежный вклад этого начисления в ФОТ в валюте учета. Применяя описанные выше подходы, вы сможете автоматизировать кадровый учет без искажения данных о фонде оплаты труда предприятия.