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

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

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

В чем заключается проблема расчета при кадровом переводе

Проанализируем конкретный пример. Сотруднику назначена надбавка за выслугу лет в размере 700 рублей в месяц. При норме 17 рабочих дней сотрудник отработал 18 дней (17 по графику плюс 1 день в выходной или праздник). В середине месяца (16 числа) произошел кадровый перевод, в результате чего месяц разбился на два периода действия:

  1. С 01 по 15 число — отработано 6 дней (5 по графику + 1 праздничный).
  2. С 16 по 31 число — отработано 12 дней по графику.

Для ограничения суммы часто пытаются применить формулу с условием:


?(НормаДней >= ОтработаноДней, РазмерНадбавкиЗаВыслугуЛет / НормаДней * ОтработаноДней, РазмерНадбавкиЗаВыслугуЛет)

или аналогичную конструкцию с функцией МИН:


МИН(РазмерНадбавкиЗаВыслугуЛет / НормаДней * ОтработаноДней, РазмерНадбавкиЗаВыслугуЛет)

Посмотрим на результат расчета, который выдает программа:

  1. За период с 01 по 15 число: 700 / 17 * 6 = 247,06 руб.
  2. За период с 16 по 31 число: 700 / 17 * 12 = 494,12 руб.

В сумме за месяц получается 741,18 рубля вместо положенного максимума в 700 рублей. Ограничение не сработало.

Выясним причину такого поведения программы

Разберем внутренний механизм расчета зарплаты в «1С:Зарплата и управление персоналом 3.1». При оформлении кадрового перевода создаются две отдельные записи в регистре расчета. Механизм расчета вычисляет каждую строку изолированно:

  1. Показатели фактически отработанного времени (ОтработаноДней, ВремяВДнях) определяются строго в границах текущего периода действия конкретной строки (в первой строке — 6 дней, во второй — 12 дней).
  2. Показатель НормаДней определяется за весь месяц (17 дней).
  3. В момент вычисления формулы для первой строки программа видит, что 6 меньше 17, и начисляет пропорциональную долю. Во второй строке 12 также меньше 17, и программа снова начисляет пропорциональную долю.
  4. Формульный движок программы в текущей строке не имеет доступа к показателям и результатам других периодов того же месяца. Вследствие этого функция МИН контролирует непревышение порога 700 рублей внутри каждого отрезка отдельно, а не по итогам месяца в целом.

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

Решение 1. Схлопывание периодов с помощью накапливаемого показателя

Для того чтобы программа не дробила начисление на отдельные периоды при кадровых изменениях, можно задействовать методику объединения расчета («схлопывания»). Этот метод часто применяется разработчиками конфигурации для расчетов, которые должны подводить итог за весь месяц (например, доплата до МРОТ).

Разберем настройку по шагам:

  1. Перейдем в меню Настройка — Показатели расчета зарплаты и создадим новый показатель (например, ФиктивныйНакопитель). Назначим ему назначение «Для сотрудника», тип «Числовой», порядок ввода: «Накапливается по отдельным значениям документами ввода данных для расчета зарплаты». Значение этого показателя вводить не потребуется — он останется равным нулю.
  2. Откроем карточку нашего начисления и скорректируем формулу, добавив умножение фиктивного показателя на ноль, чтобы математический результат не изменился:
    
    МИН(РазмерНадбавкиЗаВыслугуЛет / НормаДней * ВремяВДнях, РазмерНадбавкиЗаВыслугуЛет) + (ФиктивныйНакопитель * 0)
    
  3. В настройках начисления на вкладке Основное появится блок настройки накапливаемых показателей. Выберем вариант: «Все накопленные значения за месяц».

Благодаря наличию накапливаемого показателя с такой настройкой программа объединит начисление в одну строку за месяц в целом, даже если внутри месяца был кадровый перевод без изменения самого размера надбавки. Ограничение через МИН отработает один раз на общую сумму отработанного времени за месяц.

Решение 2. Установка признака «Начисляется в целом за месяц»

В объекте плана видов расчета Начисления существует внутренний признак НачисляетсяВЦеломЗаМесяц. Если кадровый перевод изменяет только подразделение или должность, но не меняет размер самой плановой надбавки, начисление можно принудительно рассчитывать одной строкой.

  1. Откроем обработку Групповое изменение реквизитов (раздел Администрирование — Обслуживание — Корректировка данных).
  2. Выберем элемент плана видов расчета Начисления, найдем нашу надбавку за выслугу лет.
  3. В дополнительных параметрах обработки включим режим разработчика (показ служебных реквизитов).
  4. Установим флаг для реквизита НачисляетсяВЦеломЗаМесяц в значение Истина и выполним изменение.

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

Решение 3. Расчет отдельным документом в конце месяца

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

  1. В виде начисления установим назначение: «Прочие начисления и выплаты».
  2. В поле «Начисление выполняется» выберем: «По отдельному документу» (документ Разовое начисление).
  3. Расчет будет производиться в конце месяца отдельным документом после проведения всех документов отклонений, табелей и кадровых приказов. Документ разового начисления рассчитывает результат без нарезки на периоды кадровых изменений.
  4. Для упрощения работы расчетчика к документу Разовое начисление можно подключить внешнюю обработку заполнения табличной части, которая автоматически соберет стаж, норму, факт времени и рассчитает итоговую сумму с учетом установленного максимума.

Решение 4. Корректировка через расширение конфигурации

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

  1. Подключим расширение с назначением «Адаптация».
  2. Перехватим процедуру расчета начислений в общем модуле расчета зарплаты после стандартного расчета строк.
  3. В коде постобработки выполним группировку строк по сотруднику и виду начисления. Если сумма результатов по нескольким строкам одного месяца превышает предел, уменьшим сумму во второй (или последней) строке на величину переплаты:

Если СуммаЗаМесяц > МаксимальныйРазмер Тогда
    Излишек = СуммаЗаМесяц - МаксимальныйРазмер;
    СтрокаНачисленияПоследняя.Результат = СтрокаНачисленияПоследняя.Результат - Излишек;
КонецЕсли;

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

← На главную