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

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

Переход со старых версий программных продуктов (например, с легендарной «1С:Зарплата и Кадры 7.7» или «1С:ЗУП 2.5») на современную платформу 1С:Зарплата и управление персоналом 3.1 (ЗУП 3.1) часто сопровождается трудностями перестройки привычных бизнес-процессов. Бухгалтеры привыкают к определенной схеме работы с авансами, когда суммы могут рассчитываться по сложным внутренним формулам организации, зависеть от стажа, должности или совмещения должностей.

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

Архитектура хранения данных об авансах в 1С:ЗУП 3.1

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

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

Важное предупреждение для разработчиков: Настоятельно не рекомендуется записывать данные напрямую в эти регистры сведений с помощью метода СоздатьНаборЗаписей(). Прямая запись в обход проведения документов нарушит синхронизацию между основным и интервальным регистрами. Это приведет к критическим ошибкам при автоматическом заполнении ведомостей на выплату зарплаты. Все изменения должны регистрироваться исключительно через проведение соответствующих документов-регистраторов.

Рекомендуемый способ: программное создание документа «Изменение аванса»

Оптимальным и методически верным способом программной корректировки планового аванса является автоматическое создание и проведение документа Документ.ИзменениеАванса. Этот подход решает сразу две важные задачи: сохраняется прозрачная история изменений для бухгалтерии и гарантируется корректное заполнение всех интервальных регистров системы.

Рассмотрим пример кода, который создает документ «Изменение аванса» и заполняет его необходимыми данными:


// Создаем новый документ "Изменение аванса"
НовыйДокумент = Документы.ИзменениеАванса.СоздатьДокумент();

// Заполняем основные реквизиты шапки
НовыйДокумент.Дата = ТекущаяДата();
НовыйДокумент.Организация = СсылкаНаОрганизацию; // Ссылка на СправочникСсылка.Организации
НовыйДокумент.ИзменитьАвансС = НачалоМесяца(ТекущаяДата()); // Дата, с которой действуют новые условия

// Указываем способ расчета аванса. Используем системное перечисление:
// - Перечисления.СпособыРасчетаАванса.ФиксированнойСуммой
// - Перечисления.СпособыРасчетаАванса.ПроцентомОтТарифа
// - Перечисления.СпособыРасчетаАванса.РасчетомЗаПервуюПоловинуМесяца
НовыйДокумент.СпособРасчетаАванса = Перечисления.СпособыРасчетаАванса.РасчетомЗаПервуюПоловинуМесяца;

// Заполняем табличную часть "Сотрудники"
НоваяСтрока = НовыйДокумент.Сотрудники.Добавить();
НоваяСтрока.Сотрудник = СсылкаНаСотрудника; // Ссылка на СправочникСсылка.Сотрудники

// Если выбран способ "Фиксированной суммой" или "Процентом от тарифа", заполняем размер аванса
// НоваяСтрока.Аванс = 15000; 

// Записываем и проводим документ
Попытка
    НовыйДокумент.Записать(РежимЗаписиДокумента.Проведение);
    Сообщить("Документ успешно сформирован и проведен: " + НовыйДокумент.Ссылка);
Исключение
    ВызватьИсключение "Не удалось провести документ изменения аванса: " + ОписаниеОшибки();
КонецПопытки;

Интеграция с кадровыми событиями (создание триггеров)

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

Для реализации такой логики отлично подходят Подписки на события. Мы можем перехватывать событие проведения целевого документа (например, Совмещение или БольничныйЛист) и в этот момент программно генерировать документ Изменение аванса.

Проанализируем пример функции-обработчика для подписки на событие проведения документа:


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

Альтернативные документы-регистраторы

Помимо специализированного документа ИзменениеАванса, в конфигурации 1С:ЗУП 3.1 изменить параметры планового аванса можно с помощью других стандартных кадровых документов. Их также можно создавать программно в зависимости от решаемой бизнес-задачи:

Важный методологический аспект: НДФЛ и выбор способа расчета аванса

Переходя с прошлых версий программ, бухгалтеры часто просят настроить аванс фиксированной суммой или процентом от тарифа, аргументируя это тем, что «так привычнее и проще». Однако разработчику крайне важно донести до финансовой службы изменения в налоговом законодательстве.

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

Если организация продолжает использовать способы «Фиксированной суммой» или «Процентом от тарифа», программа физически не может рассчитать НДФЛ в момент выплаты без создания промежуточного документа начисления. Это приводит к возникновению ручных корректировок при заполнении регламентированной отчетности 6-НДФЛ. Объясните это бухгалтерам: переход на расчетный аванс избавит их от трудоемкой ручной работы и возможных штрафов со стороны налоговых органов.

← На главную