При настройке дополнительных выплат, привязанных к отпуску в программе 1С:Зарплата и управление персоналом 3.1, пользователи часто сталкиваются с тем, что стандартный показатель КоличествоДнейОтпуска отказывается рассчитываться. В документе Отпуск на вкладке с дополнительными начислениями результат получается нулевым, хотя сам отпуск заполнен корректно. Проанализируем, почему это происходит, и разберем по шагам рабочие способы решения этой задачи.
В системе 1С существует строгое разделение контекстов расчета. Показатель КоличествоДнейОтпуска является предопределенным и жестко «зашит» в логику программы. Рассмотрим подробнее: он предназначен исключительно для начислений, у которых в поле Назначение начисления указано значение Оплата отпуска.
Когда мы пытаемся настроить доплату через механизм Единовременная выплата к отпуску (который активируется одноименной «галочкой» в документе), программа использует другой контекст расчета. Несмотря на то, что выплата происходит в том же документе, вычислительное ядро 1С не передает данные о днях отпуска в показатели сторонних начислений. Для системы это разные сущности: одна — это оплата времени отсутствия, вторая — материальная или стимулирующая выплата, которая просто «соседствует» в документе.
Это самый эффективный и методически верный способ обойти ограничение без программирования. Вместо того чтобы пытаться получить дни напрямую, мы заставим программу «посмотреть» на основное начисление отпуска и взять дни оттуда. Выполним следующие действия:
КоличествоДнейОтпуска мы будем использовать показатели базы. Наша новая формула может выглядеть так:
БазаВРТдн / 28 * СтоимостьДня * ПроцентДоплаты / 100
Отпуск основной (и другие виды отпусков, если доплата положена и к ним).Проанализируем работу этого механизма: показатель БазаВРТдн (Время в днях из расчетной базы) автоматически соберет количество оплаченных дней из всех начислений, указанных в базе. Поскольку в документе Отпуск уже рассчитана основная сумма за определенное количество дней, доплата увидит эти дни через связь по базе и подставит их в расчет.
Если способ с базой по каким-то причинам не подходит (например, если расчетная база уже перегружена другими начислениями), можно попробовать настроить начисление через учет времени. Однако здесь есть нюанс: такое начисление не появится по «галочке» в документе отпуска, оно будет рассчитываться в итоговом документе Начисление зарплаты и взносов.
Рассмотрим порядок действий:
ВремяВДнях.Отпуск основной.В этом случае программа проанализирует все зарегистрированные в месяце документы отпуска и умножит количество дней на ваш алгоритм расчета при итоговом расчете зарплаты за месяц.
Часто в формулах доплат пытаются использовать сложные условия выбора между окладом и дневной ставкой. Посмотрим на пример некорректной формулы:
?(Оклад < ТарифнаяСтавкаДневная, ТарифнаяСтавкаДневная, Оклад)
Такая конструкция избыточна и часто приводит к ошибкам. В 1С:ЗУП 3.1 реализован механизм совокупной тарифной ставки. Вместо того чтобы вручную сравнивать показатели, рекомендуется использовать системный показатель СтоимостьДняЧаса. Программа сама рассчитает стоимость одного дня сотрудника, исходя из настроек, заданных в меню Настройка — Расчет зарплаты — Показатели определяющие состав совокупной тарифной ставки. Это сделает вашу формулу прозрачной и универсальной для всех категорий персонала.
Если бизнес-процесс требует, чтобы расчет происходил строго в документе Отпуск и именно по прямой формуле с днями, придется прибегнуть к расширению конфигурации. Нам нужно «пробросить» значение дней в таблицу показателей, доступных для дополнительных начислений документа.
Рассмотрим пример кода, который необходимо реализовать в расширении (модуль менеджера документа Отпуск, процедура ЗаполнитьПоказателиДляРасчета):
// В обработчике расширения после выполнения основной логики
Для Каждого СтрокаНачисления Из ДополнительныеНачисления Цикл
// Проверяем, что это наша доплата
Если СтрокаНачисления.ВидРасчета = ПланыВидовРасчета.Начисления.НайтиПоНаименованию("Доплата к отпуску") Тогда
// Принудительно устанавливаем значение показателя
// Количество дней мы берем из разности дат основного отпуска в ТЧ документа
СтрокаНачисления.Показатель1 = (ДатаОкончания - ДатаНачала + 1);
КонецЕсли;
КонецЦикла;
Важный момент: при использовании программного метода нужно быть крайне внимательным к перерасчетам. Если отпуск будет впоследствии сторнирован или исправлен больничным листом, программно установленный показатель может потребовать дополнительной логики для корректного пересчета.
Подведем итоги нашего анализа. Чтобы успешно настроить доплату к отпуску, следуйте этим правилам:
КоличествоДнейОтпуска вне основных отпускных начислений — он там всегда будет равен нулю.БазаВРТдн — это самый стабильный способ в рамках типового функционала.СтоимостьДняЧаса.?(), а специальный вид показателя Зависит от стажа (настраивается в меню Показатели расчета зарплаты), который позволяет задать шкалу процентов прямо в интерфейсе.Соблюдение этих рекомендаций позволит вам создать гибкую систему доплат, которая будет работать корректно и не вызовет проблем при обновлении программы.