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