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

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

Программное создание документов в конфигурации «Зарплата и управление персоналом 3.1» значительно отличается от простых учетных решений. Документ Увольнение является сложным объектом, который объединяет в себе кадровые данные, расчет среднего заработка, начисление компенсаций, расчет НДФЛ и страховых взносов. Простого создания объекта и заполнения реквизитов недостаточно — документ должен быть «рассчитан». В этой статье мы разберем, как правильно реализовать этот процесс программно.

Шаг 1. Создание объекта и заполнение базовых реквизитов

Для начала рассмотрим процесс создания самого документа и заполнения его ключевых полей. Важно помнить, что в ЗУП 3.1 для корректной работы механизмов расчета необходимо правильно установить ПериодРегистрации и МесяцНачалаРасчетов.


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

Важный нюанс: Если вы планируете рассчитывать средний заработок, проанализируем необходимость заполнения периодов расчета. Как правило, система определяет их автоматически при записи, но для надежности можно указать их явно:


НовДок.ПериодРасчетаСреднегоЗаработкаНачало = ДобавитьМесяц(НачалоМесяца(НовДок.ДатаУвольнения), -12);
НовДок.ПериодРасчетаСреднегоЗаработкаОкончание = КонецМесяца(ДобавитьМесяц(НовДок.ДатаУвольнения, -1));

Шаг 2. Расчет дней компенсации (удержания) отпуска

Одной из самых трудоемких задач является определение количества неиспользованных дней отпуска. Рассмотрим, как это сделать, используя типовые механизмы. Проанализируем пример кода, который обращается к остаткам отпусков:


Процедура РассчитатьКоличествоДнейКомпенсацииНаСервере(Объект)
    // Очищаем старые данные
    Объект.ДополнительныеОтпуска.Очистить();
    
    // Получаем остаток отпуска сотрудника на дату увольнения
    ИсключаемыеРегистраторы = Новый Массив;
    ИсключаемыеРегистраторы.Добавить(Объект.Ссылка);
    
    Результат = ОстаткиОтпусков.ОстатокОтпускаСотрудникаНаДату(Объект.Сотрудник, Объект.ДатаУвольнения, ИсключаемыеРегистраторы, Истина);
    
    Объект.РабочийГодС = Результат.РабочийГодС;
    Объект.РабочийГодПо = Мин(Объект.ДатаУвольнения, Результат.РабочийГодПо);
    
    ВидыОтпусковНеПодлежащихКомпенсации = ОстаткиОтпусков.ВидыОтпусковНеПодлежащихКомпенсацииПриУвольнении();
    
    Для Каждого Остаток Из Результат.ОстаткиВРазрезеВидовОтпусков Цикл
        Если ВидыОтпусковНеПодлежащихКомпенсации.Найти(Остаток.ВидЕжегодногоОтпуска) <> Неопределено Тогда
            Продолжить;
        КонецЕсли;

        // Обработка основного отпуска
        Если Остаток.ВидЕжегодногоОтпуска = Справочники.ВидыОтпусков.Основной Тогда
            Объект.ПризнакКомпенсацииУдержанияОтпуска = ?(Остаток.КоличествоДней > 0, 
                Перечисления.КомпенсацияУдержаниеОтпускаПриУвольнении.КомпенсироватьНеИспользованные,
                Перечисления.КомпенсацияУдержаниеОтпускаПриУвольнении.УдержатьЗаИспользованныеАвансом);
            Объект.ДнейКомпенсацииУдержанияОтпуска = Abs(Остаток.КоличествоДней);
        Иначе 
            // Обработка дополнительных отпусков
            НоваяСтрока = Объект.ДополнительныеОтпуска.Добавить();
            НоваяСтрока.ВидОтпуска = Остаток.ВидЕжегодногоОтпуска;
            НоваяСтрока.ДнейКомпенсацииУдержания = Abs(Остаток.КоличествоДней);
            НоваяСтрока.ПризнакКомпенсацииУдержания = ?(Остаток.КоличествоДней > 0, 
                Перечисления.КомпенсацияУдержаниеОтпускаПриУвольнении.КомпенсироватьНеИспользованные,
                Перечисления.КомпенсацияУдержаниеОтпускаПриУвольнении.УдержатьЗаИспользованныеАвансом);
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры

Обратите внимание на использование функции ОстаткиОтпусков.ОстатокОтпускаСотрудникаНаДату. Это наиболее надежный способ получения данных, учитывающий все кадровые приказы сотрудника.

Шаг 3. Расчет начислений: использование формы документа

В ЗУП 3.1 логика расчета начислений тесно связана с кодом формы. Самый простой (хотя и не самый «чистый» с точки зрения архитектуры) способ выполнить расчет — это программно открыть форму документа и вызвать ее экспортные методы. Это гарантирует, что сработают все подписки и внутренние механизмы платформы.

Выясним, как это реализовать на клиенте:


&НаКлиенте
Процедура СоздатьИРассчитатьУвольнение()
    // 1. Создаем и записываем документ на сервере
    СсылкаНаДок = СоздатьДокументУвольнениеНаСервере();
    
    // 2. Открываем форму созданного документа
    ПараметрыФормы = Новый Структура("Ключ", СсылкаНаДок);
    Форма = ПолучитьФорму("Документ.Увольнение.Форма.ФормаДокумента", ПараметрыФормы);
    
    // 3. Вызываем расчет (метод РассчитатьНачисления должен быть экспортным в форме)
    Форма.Открыть();
    Форма.РассчитатьНачисления(Неопределено);
    
    // 4. После расчета форму можно закрыть с сохранением
    Форма.Записать();
    // Форма.Закрыть(); // При необходимости
КонецПроцедуры

Шаг 4. Расчет без открытия формы (продвинутый уровень)

Если ваша задача — массовое создание документов в фоновом задании, открытие форм невозможно. В этом случае необходимо использовать серверные модули расчета. Посмотрим на алгоритм действий:

  1. Заполните данные о среднем заработке с помощью УчетСреднегоЗаработка.ЗаполнитьДанныеСреднегоЗаработка(ДокументОбъект, ...).
  2. Инициируйте расчет документа через РасчетЗарплатыРасширенный.РассчитатьДокумент(ДокументОбъект).
  3. Проверьте заполнение табличных частей Начисления, НДФЛ и Взносы.

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

Заключение

Мы рассмотрели основной цикл программной работы с документом Увольнение. Помните, что ключевым моментом является не только заполнение реквизитов, но и инициация механизмов расчета. Использование методов формы — это быстрый способ решить задачу «здесь и сейчас», в то время как использование серверных модулей требует более глубокого погружения в программный интерфейс (API) конфигурации ЗУП 3.1, но обеспечивает более высокую производительность и стабильность в пакетных операциях.

← На главную