При расчете заработной платы в системах 1С:Зарплата и Управление Персоналом (1С:ЗУП) часто возникает необходимость гибкого подхода к тарификации труда. Одним из таких сценариев является изменение часовой ставки оплаты в зависимости от общего количества отработанных часов за расчетный период, причем с условием, что при достижении нового порога новая ставка применяется ко всем ранее отработанным часам. Например, если сотрудник отработал более 40 часов, все 40 часов (и более) должны оплачиваться по повышенной ставке, а не только часы сверх 40. Давайте рассмотрим, как это можно реализовать.
Прежде чем перейти к формулам и настройкам, давайте четко сформулируем нашу задачу. Нам нужно, чтобы:
Именно этот принцип – применение единой ставки ко всему объему отработанных часов после достижения порога – мы будем реализовывать.
Один из самых простых способов реализовать динамическую ставку – это использовать условные операторы непосредственно в формуле начисления. В 1С для этого применяется тернарный оператор ?(Условие, ЗначениеЕслиИстина, ЗначениеЕслиЛожь). Мы построим вложенную структуру, которая последовательно проверяет количество отработанных часов.
Рассмотрим примерную формулу, которая может быть использована в Виде расчета (начислении) для оплаты по часовой ставке:
ЧасовОтработано * ?(ЧасовОтработано < 40, 270,
?(ЧасовОтработано < 60, 300,
?(ЧасовОтработано < 80, 330,
?(ЧасовОтработано < 100, 360, 400))))
Давайте разберем эту формулу по частям:
ЧасовОтработано: Это основной показатель, который хранит общее количество часов, отработанных сотрудником за расчетный период. К нему будет применяться итоговая ставка.?(ЧасовОтработано < 40, 270, ...): Первая проверка. Если количество отработанных часов меньше 40, то ставка устанавливается в 270 рублей. Если нет (то есть 40 часов и более), система переходит к следующему условию.?(ЧасовОтработано < 60, 300, ...): Это условие выполняется только если ЧасовОтработано больше или равно 40. Здесь проверяется, если часов меньше 60 (т.е. от 40 до 59.99), ставка становится 300 рублей. И так далее, по цепочке.400: Это значение будет применено, если все предыдущие условия не выполнены, то есть, если ЧасовОтработано равно или более 100.Таким образом, эта формула берет общее количество отработанных часов и применяет к ним единую ставку, которая определяется порогом, достигнутым сотрудником. Например, если сотрудник отработал 45 часов, формула определит ставку в 300 рублей и умножит 45 на 300, а не 40 на 270 и 5 на 300.
Для корректной работы формулы нам необходимо правильно настроить используемые Показатели в 1С:ЗУП.
ЧасовОтработано: Этот показатель является ключевым. Он должен содержать фактическое количество отработанных часов сотрудником за месяц. В 1С:ЗУП существуют предопределенные показатели для времени, такие как ОтработаноЧасов, которые обычно заполняются на основании Табеля учета рабочего времени.Разряд): Если у вас есть разные разряды, и для каждого разряда может быть своя шкала ставок, то показатель Разряд может быть создан как Постоянный для сотрудника и меняться документом Кадровый перевод. В этом случае, формула может стать еще более сложной или, что предпочтительнее, использовать регистры сведений (об этом чуть позже).Важный момент из обсуждения: в формулу начисления необходимо включать только те компоненты, которые относятся к расчету часовой ставки. Если у вас окладная часть рассчитывается отдельно, то не включайте в эту формулу компоненты типа Оклад / ВремяВЧасах. Формула, предложенная в сообщении 17, очищена от лишних компонентов: *(?(Разряд = 1,ПорогЧасов1Разряд,?(Разряд = 2,ПорогЧасов2Разряд,0))) * ВремяВЧасах, где ВремяВЧасах - это наш ЧасовОтработано, а остальное – логика определения ставки. Убедитесь, что ваш Вид расчета (начисление) настроен только на расчет по часам без смешивания с окладом, если оклад является отдельным видом расчета.
Сама формула не решит проблему, если система не будет "знать" фактическое количество отработанных часов. Если вы заметите, что "формула выглядит так, будто сотрудники отработали максимальное количество часов", это означает, что показатель ЧасовОтработано либо не заполняется, либо заполняется некорректно.
Для ввода фактического количества отработанных часов за месяц используются различные механизмы в 1С:ЗУП:
Табель учета рабочего времени: Это основной документ для регистрации фактического отработанного времени. В нем вы вручную или автоматически указываете часы, дни, явки, неявки. На основании данных табеля заполняются основные показатели времени для расчетов.Индивидуальный график: Он используется для предопределения ожидаемого времени работы сотрудника. Однако фактические отклонения от графика (например, переработки или отсутствие) должны быть зафиксированы другими документами или Табелем.Документы отклонений: Сверхурочные часы, работа в выходные или праздники, отпуска, больничные – все эти события влияют на общее количество отработанных часов и должны быть зарегистрированы соответствующими документами.Шаблон ввода исходных данных: В некоторых случаях, если для специфических сотрудников не ведется детальный табель, или требуется ввести какой-либо уникальный показатель вручную, можно создать специальный Шаблон ввода исходных данных, в котором вы будете указывать фактическое количество отработанных часов.Крайне важно обеспечить, чтобы показатель ЧасовОтработано (или его аналог в вашей конфигурации) корректно заполнялся перед расчетом начисления. В противном случае, расчет будет неверным.
Хотя прямая формула с условными операторами работает, она имеет существенный недостаток: при каждом изменении ставок или добавлении нового порога необходимо изменять конфигурацию (саму формулу начисления). Это неудобно и требует участия программиста. Гораздо более гибким и масштабируемым решением является использование Регистра сведений, как было предложено в сообщении 18.
Давайте разберем по шагам, как можно настроить такую шкалу ставок:
Регистра сведений:
В конфигураторе создайте новый Регистр сведений, например, "ШкалаСтавокПоЧасам".
ПорогЧасов (тип: Число) - это будет количество часов, при превышении которого применяется следующая ставка.Разряд (тип: СправочникСсылка.Разряды или Число, если разряд выражен числом) - если у вас разные шкалы для разных разрядов.СтавкаЧаса (тип: Число, Точность: 2) - сама часовая ставка.Регистра сведений:
В пользовательском режиме вы заполняете этот регистр данными вашей шкалы. Например:
Если используется Разряд, то для каждого разряда будет своя группа записей.
В формуле начисления вместо жестко прописанных ставок мы будем обращаться к этому Регистру сведений. Это потребует создания небольшой вспомогательной функции в общем модуле или в модуле менеджера начисления, которая будет по заданному количеству часов и (опционально) разряду выбирать нужную ставку.
Принцип работы функции:
ЧасовОтработано и, возможно, Разряд.Регистру сведений "ШкалаСтавокПоЧасам".ПорогЧасов максимально близок, но не превышает ЧасовОтработано (то есть, ищет последний порог, который был достигнут или пройден).СтавкуЧаса.Пример формулы начисления с использованием такой функции:
СтавкаЧаса = ПолучитьСтавкуПоЧасам(ЧасовОтработано, Разряд);
Результат = ЧасовОтработано * СтавкаЧаса;
Здесь ПолучитьСтавкуПоЧасам – это пример функции, которую вы создадите. Она будет выполнять выборку из регистра. При этом менять ставки можно будет непосредственно в пользовательском режиме, не затрагивая конфигурацию.
В сообщении 5 упоминается возможность делать еще одно начисление на разницу ставок. Этот подход может быть полезен для более детального аналитического учета, но обычно усложняет логику расчетов.
Как это могло бы работать:
ЧасовОтработано * 270
ЧасовОтработано. Например, если текущая ставка из шкалы 300 руб/час, а базовая 270 руб/час, то доплата составит ЧасовОтработано * (300 - 270). Это начисление применялось бы только при достижении соответствующего порога.
Такой подход требует большего количества Видов расчета и более сложной настройки их взаимозависимостей, но дает возможность увидеть, сколько было начислено по базовой ставке и сколько в виде доплаты. Для нашей задачи с единой ставкой для всех часов после порога, прямой расчет через одну формулу (как в первом подходе или с использованием регистра сведений) является более простым и эффективным.
Выбор конкретного метода зависит от ваших требований к гибкости, аналитике и сложности конфигурации. Для большинства случаев динамического изменения ставок с пересчетом предыдущих часов, использование одной формулы в начислении, опирающейся на Регистр сведений для хранения шкалы ставок, является наиболее оптимальным решением.