Как в ЗУП 3.1 настроить автоматическую доплату, зависящую от суммы другого начисления?

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

В практике настройки расчета зарплаты в 1С:ЗУП 3.1 часто встречаются задачи, когда необходимо выполнить начисление (например, доплату) только при выполнении определенных условий по сумме другого начисления. Рассмотрим классический пример: сотруднику необходимо начислить «Доплату», если сумма «Северной надбавки» меньше 10 000 рублей. Размер доплаты рассчитывается как разница между 30 000 рублей и фактически начисленной надбавкой.

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

Понимание механизма расчета в ЗУП 3.1

Прежде чем переходить к настройкам, давайте вспомним важный архитектурный принцип ЗУП. Расчетный механизм работает по правилу: «Нет назначения — нет расчета».

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

  1. Либо назначено сотруднику как плановое (в кадровых документах).
  2. Либо введено специальным документом-основанием (например, «Премия», «Данные для расчета зарплаты»).

Простое использование показателя РасчетнаяБаза в формуле не является триггером для начала расчета. Это лишь инструмент для вычисления результата.

Вариант 1. Использование планового начисления и сложной формулы

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

Создадим новое начисление со следующими настройками:

1. Настройка формулы

Нам необходимо, чтобы если сумма базового начисления меньше 10 000, начислялась разница до 30 000. Если больше — результат должен быть 0.

Используем конструкцию условия ?(Условие, ЗначениеЕслиИстина, ЗначениеЕслиЛожь).

?(РасчетнаяБаза < 10000, 30000 - РасчетнаяБаза, 0)

Однако здесь есть нюанс: если у сотрудника вообще нет базового начисления (например, он в отпуске за свой счет весь месяц), РасчетнаяБаза будет равна 0. Тогда формула вернет 30 000, что может быть некорректно. Доработаем формулу:

?(РасчетнаяБаза = 0, 0, ?(РасчетнаяБаза < 10000, 30000 - РасчетнаяБаза, 0))

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

2. Настройка вкладки «Расчетная база»

Обязательно включите в список базовых начислений то начисление, от которого зависит расчет (в нашем примере — «Северная надбавка»). Период расчета базы — «Текущий месяц».

3. Настройка приоритетов (Критически важно!)

Перейдите на вкладку «Приоритет». Чтобы РасчетнаяБаза была посчитана корректно, базовое начисление («Северная надбавка») должно быть рассчитано РАНЬШЕ, чем наша доплата.

Обычно ЗУП автоматически определяет порядок: если одно начисление входит в базу другого, оно считается первым. Но всегда стоит проверить настройки вытеснения и порядок расчета. Если доплата посчитается раньше базы, результат базы будет равен 0, и сотрудник ошибочно получит 30 000 руб.

4. Назначение сотрудникам

Это начисление нужно назначить сотрудникам (документом «Назначение планового начисления» или при приеме на работу). В результате в документе «Начисление зарплаты и взносов» у сотрудника всегда будет появляться эта строка. Если условие не выполнено, результат будет 0. В расчетном листке строки с нулевыми суммами обычно не выводятся (зависит от настроек), но в документе начисления они будут видны.

Вариант 2. Использование показателя-триггера (полуавтоматический метод)

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

В настройках начисления на вкладке «Основное» выбираем: «Начисление выполняется: Только если введено значение показателя».

Здесь есть два пути:

А. Использование постоянного показателя (Без ежемесячного ввода)

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

Пока показатель действует, начисление будет пытаться рассчитаться. Этот метод похож на Вариант 1, но семантически мы оперируем показателями, а не плановыми видами расчета.

Б. Программное заполнение (Как сделал автор темы)

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

Алгоритм действий:

  1. В формуле начисления используем разовый показатель, например ТребуетсяДоплата.
  2. Настройка начисления: выполняется, только если введен показатель ТребуетсяДоплата.
  3. Сам показатель вводить вручную пользователю запрещаем (организационно) или облегчаем этот процесс.

Поскольку типовой функционал не умеет сам анализировать базу и вводить показатели до расчета зарплаты, мы создаем Внешнюю обработку заполнения табличной части для документа «Данные для расчета зарплаты».

Логика работы обработки:

  1. Пользователь создает документ «Данные для расчета зарплаты» перед окончательным расчетом зарплаты.
  2. Нажимает кнопку (нашу обработку) «Заполнить тех, у кого надбавка < 10 000».
  3. Обработка программно:
    • Анализирует регистры расчета за текущий месяц (или плановые начисления).
    • Находит сотрудников, у которых плановая (или предварительно расчетная) Северная надбавка меньше лимита.
    • Заполняет табличную часть сотрудниками.
  4. Документ проводится.
  5. При расчете документа «Начисление зарплаты и взносов» подхватывается этот показатель, и начисление срабатывает.

Вариант 3. Использование шкалы (Оценочная шкала)

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

Однако, если зависимость можно выразить коэффициентом, то:

  1. Создается показатель ШкалаДоплаты.
  2. Настраивается зависимость этого показателя от другого (например, от суммы базы), но в типовой ЗУП шкалы обычно зависят от стажа или числовых показателей, введенных вручную. Автоматически привязать значение шкалы к результату расчета другого начисления без доработки конфигурации проблематично.

Итоговая рекомендация

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

Формула для копирования:

?(РасчетнаяБаза > 0, МАКС(0, 30000 - РасчетнаяБаза), 0)

В этой формуле функция МАКС(0, ...) дополнительно страхует от получения отрицательных значений, если вдруг база окажется больше 30 000 (хотя условие ?(...) это тоже может регулировать).

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

← На главную