Как настроить доплату к отпуску в 1С:ЗУП 3.1, если показатель «Количество дней отпуска» в формуле равен нулю?

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

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

Выясним причину: почему показатель не работает

В системе 1С существует строгое разделение контекстов расчета. Показатель КоличествоДнейОтпуска является предопределенным и жестко «зашит» в логику программы. Рассмотрим подробнее: он предназначен исключительно для начислений, у которых в поле Назначение начисления указано значение Оплата отпуска.

Когда мы пытаемся настроить доплату через механизм Единовременная выплата к отпуску (который активируется одноименной «галочкой» в документе), программа использует другой контекст расчета. Несмотря на то, что выплата происходит в том же документе, вычислительное ядро 1С не передает данные о днях отпуска в показатели сторонних начислений. Для системы это разные сущности: одна — это оплата времени отсутствия, вторая — материальная или стимулирующая выплата, которая просто «соседствует» в документе.

Способ 1. Использование механизма расчетной базы (рекомендуемый)

Это самый эффективный и методически верный способ обойти ограничение без программирования. Вместо того чтобы пытаться получить дни напрямую, мы заставим программу «посмотреть» на основное начисление отпуска и взять дни оттуда. Выполним следующие действия:

  1. Откроем карточку нашего начисления (доплаты).
  2. На вкладке Основное проверим, что в формуле вместо КоличествоДнейОтпуска мы будем использовать показатели базы. Наша новая формула может выглядеть так:

    БазаВРТдн / 28 * СтоимостьДня * ПроцентДоплаты / 100

  3. Перейдем на вкладку Расчет базы.
  4. В списке Основные начисления нажмем кнопку Подбор и выберем вид расчета Отпуск основной (и другие виды отпусков, если доплата положена и к ним).
  5. В поле Период расчета базы укажем Текущий месяц. Это критически важно, так как расчет происходит внутри одного документа в одном расчетном периоде.

Проанализируем работу этого механизма: показатель БазаВРТдн (Время в днях из расчетной базы) автоматически соберет количество оплаченных дней из всех начислений, указанных в базе. Поскольку в документе Отпуск уже рассчитана основная сумма за определенное количество дней, доплата увидит эти дни через связь по базе и подставит их в расчет.

Способ 2. Настройка через «Прочие начисления» и учет времени

Если способ с базой по каким-то причинам не подходит (например, если расчетная база уже перегружена другими начислениями), можно попробовать настроить начисление через учет времени. Однако здесь есть нюанс: такое начисление не появится по «галочке» в документе отпуска, оно будет рассчитываться в итоговом документе Начисление зарплаты и взносов.

Рассмотрим порядок действий:

  1. Создадим начисление с назначением Прочие начисления и выплаты.
  2. Установим признак Выполняется ежемесячно (или по отдельному документу).
  3. В формуле используем универсальный показатель ВремяВДнях.
  4. Самое важное — на вкладке Учет времени выберем Используемое время: «Дополнительное начисление за уже оплаченное время».
  5. В поле Вид времени выберем Отпуск основной.

В этом случае программа проанализирует все зарегистрированные в месяце документы отпуска и умножит количество дней на ваш алгоритм расчета при итоговом расчете зарплаты за месяц.

Способ 3. Оптимизация формулы и показателей оклада

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

?(Оклад < ТарифнаяСтавкаДневная, ТарифнаяСтавкаДневная, Оклад)

Такая конструкция избыточна и часто приводит к ошибкам. В 1С:ЗУП 3.1 реализован механизм совокупной тарифной ставки. Вместо того чтобы вручную сравнивать показатели, рекомендуется использовать системный показатель СтоимостьДняЧаса. Программа сама рассчитает стоимость одного дня сотрудника, исходя из настроек, заданных в меню Настройка — Расчет зарплаты — Показатели определяющие состав совокупной тарифной ставки. Это сделает вашу формулу прозрачной и универсальной для всех категорий персонала.

Способ 4. Программная доработка (вариант для программиста)

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

Рассмотрим пример кода, который необходимо реализовать в расширении (модуль менеджера документа Отпуск, процедура ЗаполнитьПоказателиДляРасчета):


// В обработчике расширения после выполнения основной логики
Для Каждого СтрокаНачисления Из ДополнительныеНачисления Цикл
    // Проверяем, что это наша доплата
    Если СтрокаНачисления.ВидРасчета = ПланыВидовРасчета.Начисления.НайтиПоНаименованию("Доплата к отпуску") Тогда
        // Принудительно устанавливаем значение показателя
        // Количество дней мы берем из разности дат основного отпуска в ТЧ документа
        СтрокаНачисления.Показатель1 = (ДатаОкончания - ДатаНачала + 1); 
    КонецЕсли;
КонецЦикла;

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

Резюме и рекомендации

Подведем итоги нашего анализа. Чтобы успешно настроить доплату к отпуску, следуйте этим правилам:

Соблюдение этих рекомендаций позволит вам создать гибкую систему доплат, которая будет работать корректно и не вызовет проблем при обновлении программы.

← На главную