В практике настройки расчета зарплаты в 1С:ЗУП 3.1 часто встречаются задачи, когда необходимо выполнить начисление (например, доплату) только при выполнении определенных условий по сумме другого начисления. Рассмотрим классический пример: сотруднику необходимо начислить «Доплату», если сумма «Северной надбавки» меньше 10 000 рублей. Размер доплаты рассчитывается как разница между 30 000 рублей и фактически начисленной надбавкой.
Основная сложность здесь заключается не столько в формуле, сколько в механизме инициализации расчета: как заставить программу автоматически добавить строку с доплатой в документ «Начисление зарплаты», не заставляя расчетчика вводить данные вручную каждый месяц. Разберем подробно несколько вариантов решения этой задачи.
Прежде чем переходить к настройкам, давайте вспомним важный архитектурный принцип ЗУП. Расчетный механизм работает по правилу: «Нет назначения — нет расчета».
Программа не перебирает всех сотрудников каждый месяц, проверяя условия для всех существующих в базе видов начислений. Чтобы начисление попало в документ, оно должно быть:
Простое использование показателя РасчетнаяБаза в формуле не является триггером для начала расчета. Это лишь инструмент для вычисления результата.
Если мы хотим избежать ежемесячного ввода данных и программирования, самым надежным способом является назначение такой доплаты как планового начисления всем сотрудникам, для которых она потенциально возможна.
Создадим новое начисление со следующими настройками:
1. Настройка формулы
Нам необходимо, чтобы если сумма базового начисления меньше 10 000, начислялась разница до 30 000. Если больше — результат должен быть 0.
Используем конструкцию условия ?(Условие, ЗначениеЕслиИстина, ЗначениеЕслиЛожь).
?(РасчетнаяБаза < 10000, 30000 - РасчетнаяБаза, 0)
Однако здесь есть нюанс: если у сотрудника вообще нет базового начисления (например, он в отпуске за свой счет весь месяц), РасчетнаяБаза будет равна 0. Тогда формула вернет 30 000, что может быть некорректно. Доработаем формулу:
?(РасчетнаяБаза = 0, 0, ?(РасчетнаяБаза < 10000, 30000 - РасчетнаяБаза, 0))
Или, если доплата должна срабатывать даже при нулевой базе (но при условии, что сотрудник работал), нужно использовать показатель отработанного времени.
2. Настройка вкладки «Расчетная база»
Обязательно включите в список базовых начислений то начисление, от которого зависит расчет (в нашем примере — «Северная надбавка»). Период расчета базы — «Текущий месяц».
3. Настройка приоритетов (Критически важно!)
Перейдите на вкладку «Приоритет». Чтобы РасчетнаяБаза была посчитана корректно, базовое начисление («Северная надбавка») должно быть рассчитано РАНЬШЕ, чем наша доплата.
Обычно ЗУП автоматически определяет порядок: если одно начисление входит в базу другого, оно считается первым. Но всегда стоит проверить настройки вытеснения и порядок расчета. Если доплата посчитается раньше базы, результат базы будет равен 0, и сотрудник ошибочно получит 30 000 руб.
4. Назначение сотрудникам
Это начисление нужно назначить сотрудникам (документом «Назначение планового начисления» или при приеме на работу). В результате в документе «Начисление зарплаты и взносов» у сотрудника всегда будет появляться эта строка. Если условие не выполнено, результат будет 0. В расчетном листке строки с нулевыми суммами обычно не выводятся (зависит от настроек), но в документе начисления они будут видны.
Если мы не хотим назначать начисление плановым (чтобы не перегружать список плановых начислений) или хотим видеть строку расчета только тогда, когда сумма реально нужна, можно использовать подход с вводом значения показателя.
В настройках начисления на вкладке «Основное» выбираем: «Начисление выполняется: Только если введено значение показателя».
Здесь есть два пути:
ПризнакНачисленияДоплаты.Пока показатель действует, начисление будет пытаться рассчитаться. Этот метод похож на Вариант 1, но семантически мы оперируем показателями, а не плановыми видами расчета.
Если мы хотим полной автоматизации, чтобы система сама решала, кому положена доплата в текущем месяце, можно использовать комбинацию настроек и простой обработки.
Алгоритм действий:
ТребуетсяДоплата.ТребуетсяДоплата.Поскольку типовой функционал не умеет сам анализировать базу и вводить показатели до расчета зарплаты, мы создаем Внешнюю обработку заполнения табличной части для документа «Данные для расчета зарплаты».
Логика работы обработки:
В обсуждении упоминалось использование шкалы, но этот метод больше подходит, когда зависимость прямая (от стажа или процента). В случае, когда нам нужна обратная зависимость («доплатить до суммы»), шкалы использовать сложнее, так как они возвращают фиксированное значение или процент, а нам нужна разница между константой и базой.
Однако, если зависимость можно выразить коэффициентом, то:
ШкалаДоплаты.Наиболее «чистым» с точки зрения методологии 1С и удобным для поддержки является Вариант 1 (Плановое начисление с формулой условия). Он не требует написания кода, внешних обработок и работает полностью в автоматическом режиме.
Формула для копирования:
?(РасчетнаяБаза > 0, МАКС(0, 30000 - РасчетнаяБаза), 0)
В этой формуле функция МАКС(0, ...) дополнительно страхует от получения отрицательных значений, если вдруг база окажется больше 30 000 (хотя условие ?(...) это тоже может регулировать).
Если же наличие «пустых» строк в расчете зарплаты критично для заказчика, то следует применить метод с программным созданием документа «Данные для расчета зарплаты» через внешнюю обработку заполнения, как наиболее безопасный вариант автоматизации без снятия конфигурации с поддержки.