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