Почему не рассчитываются отпускные при переходящем отпуске в 1С:ЗУП 2.5 и как это исправить?

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

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

Рассмотрим подробнее, почему возникает эта ошибка, разберем техническую архитектуру хранения данных в ЗУП 2.5 и изучим программные способы массового решения проблемы, когда ручное переполнение сотен графиков невозможно.

Выясним причину проблемы: архитектура регистров

Проанализируем ситуацию с точки зрения системы. В версии 2.5 данные о рабочем времени хранятся не только в самом объекте СправочникСсылка.ГрафикиРаботы, но и в специализированном регистре сведений «Графики работы по видам времени». Именно данные из этого регистра используются расчетными механизмами для определения нормы времени, количества рабочих дней и, соответственно, суммы начисления за период.

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

Разбор механизма «Данные календаря изменены»

Проанализируем код в модуле формы или объекта справочника ГрафикиРаботы. В процедуре ПередЗаписью существует критически важная логика, которая управляет обновлением данных в регистрах. Система проверяет значение внутренней переменной ДанныеКалендаряИзменены. Если этот флаг равен Ложь, то при записи элемента никаких движений в регистре сведений на будущие периоды не происходит.

Посмотрим на фрагмент кода, который отвечает за это в типовой конфигурации ЗУП 2.5:


Процедура ПередЗаписью(Отказ)
    Если НЕ ЗначениеЗаполнено(Наименование) Тогда
        Отказ = Истина;
        Сообщить("Не заполнено наименование графика работы!");
    КонецЕсли;

    Если ДанныеКалендаряИзменены Тогда
        // Запоминаем интервалы для записи в соответствии
        СоответствиеИнтервалыРедактирования.Вставить(Дата(НомерТекущегоГода, 1, 1), Истина);
        // ... (заполнение для всех месяцев)
        
        // Вызов основной функции заполнения регистра
        ПоместитьТаблицуВТаблицуДляЗаписи(КалендарьНаборЗаписей, ТаблицаДляЗаписи, НачалоГода(ТекущийГод), КонецГода(ТекущийГод));
        ДанныеКалендаряИзменены = Ложь;
    КонецЕсли;
КонецПроцедуры

Как мы видим, если мы программно просто вызываем метод Записать(), переменная ДанныеКалендаряИзменены остается пустой, и данные в регистр на январь следующего года не попадают. Именно поэтому расчет отпуска видит «пустоту» в графике сотрудника за январь и возвращает нулевой результат.

Решение проблемы через внешнюю обработку

Чтобы решить проблему массово, нам необходимо написать небольшую обработку, которая «обманет» систему, принудительно установив нужные флаги перед записью каждого графика. Посмотрим на пример кода, который можно использовать в такой обработке:


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

Важный момент: перед запуском такой обработки на рабочей базе обязательно проверьте ее на копии. Убедитесь, что переменная НомерТекущегоГода установлена правильно, иначе вы рискуете перезаписать или очистить данные за прошлые периоды, что приведет к пересчетам зарплаты «задним числом».

Использование штатных инструментов без программирования

Если вы не хотите прибегать к написанию кода, разберем штатные возможности ЗУП 2.5, которые могут помочь в этой ситуации:

  1. Обработка «Обновление графиков работы». В типовых решениях часто присутствует встроенная обработка, предназначенная специально для массового пересчета графиков после изменения производственного календаря. Она находится в меню «Сервис» или в интерфейсе «Расчет зарплаты».
  2. Групповая обработка справочников и документов. Можно попробовать использовать ее для изменения какого-либо реквизита (например, «Комментарий»), но это сработает только в том случае, если в коде конфигурации нет жесткой привязки к интерактивному нажатию кнопки «Заполнить». В большинстве случаев в 2.5 этот метод без программной правки флага ДанныеКалендаряИзменены оказывается неэффективным.

Проанализируем последствия: средний заработок и налоги

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

1. Расчет среднего заработка. Напомним, что если отпуск начинается в декабре, то расчетным периодом будут 12 месяцев, предшествующих декабрю. Если в декабре (уже после расчета отпуска) сотруднику будет начислена годовая премия или произойдет повышение окладов, систему потребуется пересчитать, чтобы январская часть также получила верную индексацию.

2. Страховые взносы и НДФЛ. В ЗУП 2.5 начисление отпуска происходит целиком в месяце его выплаты (в декабре). Это означает, что:

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

Заключение

Подведем итог. Проблема с переходящими отпусками в 1С:ЗУП 2.5 вызвана зависимостью расчетных механизмов от регистра сведений Графики работы по видам времени. Для исправления ситуации необходимо:

  1. Убедиться, что заполнен производственный календарь.
  2. Использовать программную обработку для установки флага ДанныеКалендаряИзменены и записи графиков на будущий год.
  3. Проверить результаты расчета в документе «Начисление отпуска сотрудникам организаций», убедившись, что вкладка «Оплата» содержит строки за оба месяца.

Такой подход позволяет быстро и эффективно подготовить систему к расчету предновогодних отпусков даже на предприятиях с очень сложной структурой графиков работы.

← На главную