Как настроить расчет оплаты труда в 1С:ЗУП, если часовая ставка меняется в зависимости от отработанных часов с пересчетом предыдущих?

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

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

Понимание задачи: динамическая ставка и пересчет

Прежде чем перейти к формулам и настройкам, давайте четко сформулируем нашу задачу. Нам нужно, чтобы:

  1. Существовала шкала ставок: до 40 часов – одна ставка, от 40 до 60 часов – другая (повышенная), от 60 до 80 часов – третья и так далее.
  2. При достижении определенного порога (например, 40 часов), все отработанные часы (например, 39 или 40 часов) пересчитывались по новой, повышенной ставке. Это ключевое отличие от начисления "сверх" нормы, где по новой ставке оплачивается только превышение.

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

Первый подход: прямая формула с условными операторами

Один из самых простых способов реализовать динамическую ставку – это использовать условные операторы непосредственно в формуле начисления. В 1С для этого применяется тернарный оператор ?(Условие, ЗначениеЕслиИстина, ЗначениеЕслиЛожь). Мы построим вложенную структуру, которая последовательно проверяет количество отработанных часов.

Рассмотрим примерную формулу, которая может быть использована в Виде расчета (начислении) для оплаты по часовой ставке:


ЧасовОтработано * ?(ЧасовОтработано < 40, 270,
                     ?(ЧасовОтработано < 60, 300,
                       ?(ЧасовОтработано < 80, 330,
                         ?(ЧасовОтработано < 100, 360, 400))))

Давайте разберем эту формулу по частям:

  1. ЧасовОтработано: Это основной показатель, который хранит общее количество часов, отработанных сотрудником за расчетный период. К нему будет применяться итоговая ставка.
  2. ?(ЧасовОтработано < 40, 270, ...): Первая проверка. Если количество отработанных часов меньше 40, то ставка устанавливается в 270 рублей. Если нет (то есть 40 часов и более), система переходит к следующему условию.
  3. ?(ЧасовОтработано < 60, 300, ...): Это условие выполняется только если ЧасовОтработано больше или равно 40. Здесь проверяется, если часов меньше 60 (т.е. от 40 до 59.99), ставка становится 300 рублей. И так далее, по цепочке.
  4. 400: Это значение будет применено, если все предыдущие условия не выполнены, то есть, если ЧасовОтработано равно или более 100.

Таким образом, эта формула берет общее количество отработанных часов и применяет к ним единую ставку, которая определяется порогом, достигнутым сотрудником. Например, если сотрудник отработал 45 часов, формула определит ставку в 300 рублей и умножит 45 на 300, а не 40 на 270 и 5 на 300.

Настройка показателей для формулы

Для корректной работы формулы нам необходимо правильно настроить используемые Показатели в 1С:ЗУП.

  1. Показатель ЧасовОтработано: Этот показатель является ключевым. Он должен содержать фактическое количество отработанных часов сотрудником за месяц. В 1С:ЗУП существуют предопределенные показатели для времени, такие как ОтработаноЧасов, которые обычно заполняются на основании Табеля учета рабочего времени.
  2. Дополнительные показатели (например, Разряд): Если у вас есть разные разряды, и для каждого разряда может быть своя шкала ставок, то показатель Разряд может быть создан как Постоянный для сотрудника и меняться документом Кадровый перевод. В этом случае, формула может стать еще более сложной или, что предпочтительнее, использовать регистры сведений (об этом чуть позже).

Важный момент из обсуждения: в формулу начисления необходимо включать только те компоненты, которые относятся к расчету часовой ставки. Если у вас окладная часть рассчитывается отдельно, то не включайте в эту формулу компоненты типа Оклад / ВремяВЧасах. Формула, предложенная в сообщении 17, очищена от лишних компонентов: *(?(Разряд = 1,ПорогЧасов1Разряд,?(Разряд = 2,ПорогЧасов2Разряд,0))) * ВремяВЧасах, где ВремяВЧасах - это наш ЧасовОтработано, а остальное – логика определения ставки. Убедитесь, что ваш Вид расчета (начисление) настроен только на расчет по часам без смешивания с окладом, если оклад является отдельным видом расчета.

Ввод исходных данных: как указать отработанные часы

Сама формула не решит проблему, если система не будет "знать" фактическое количество отработанных часов. Если вы заметите, что "формула выглядит так, будто сотрудники отработали максимальное количество часов", это означает, что показатель ЧасовОтработано либо не заполняется, либо заполняется некорректно.

Для ввода фактического количества отработанных часов за месяц используются различные механизмы в 1С:ЗУП:

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

Крайне важно обеспечить, чтобы показатель ЧасовОтработано (или его аналог в вашей конфигурации) корректно заполнялся перед расчетом начисления. В противном случае, расчет будет неверным.

Решение для гибкости: использование регистра сведений "Шкала ставок"

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

Давайте разберем по шагам, как можно настроить такую шкалу ставок:

  1. Создание Регистра сведений:

    В конфигураторе создайте новый Регистр сведений, например, "ШкалаСтавокПоЧасам".

    • Измерения:
      • ПорогЧасов (тип: Число) - это будет количество часов, при превышении которого применяется следующая ставка.
      • Разряд (тип: СправочникСсылка.Разряды или Число, если разряд выражен числом) - если у вас разные шкалы для разных разрядов.
    • Ресурсы:
      • СтавкаЧаса (тип: Число, Точность: 2) - сама часовая ставка.
    • Периодичность: можно установить "В пределах месяца", "В пределах дня" или "Непериодический", в зависимости от того, как часто могут меняться ставки. Если ставки могут меняться в течение месяца, выбираем "В пределах дня".
  2. Заполнение Регистра сведений:

    В пользовательском режиме вы заполняете этот регистр данными вашей шкалы. Например:

    • ПорогЧасов: 0, СтавкаЧаса: 270 (это будет базовая ставка до первого порога)
    • ПорогЧасов: 40, СтавкаЧаса: 300
    • ПорогЧасов: 60, СтавкаЧаса: 330
    • ПорогЧасов: 80, СтавкаЧаса: 360
    • ПорогЧасов: 100, СтавкаЧаса: 400

    Если используется Разряд, то для каждого разряда будет своя группа записей.

  3. Как формула обращается к регистру:

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

    Принцип работы функции:

    1. Функция получает на вход ЧасовОтработано и, возможно, Разряд.
    2. Выполняет запрос к Регистру сведений "ШкалаСтавокПоЧасам".
    3. Ищет запись, где ПорогЧасов максимально близок, но не превышает ЧасовОтработано (то есть, ищет последний порог, который был достигнут или пройден).
    4. Возвращает соответствующую СтавкуЧаса.

    Пример формулы начисления с использованием такой функции:

    
    СтавкаЧаса = ПолучитьСтавкуПоЧасам(ЧасовОтработано, Разряд);
    Результат = ЧасовОтработано * СтавкаЧаса;
    

    Здесь ПолучитьСтавкуПоЧасам – это пример функции, которую вы создадите. Она будет выполнять выборку из регистра. При этом менять ставки можно будет непосредственно в пользовательском режиме, не затрагивая конфигурацию.

Альтернативный подход: начисление разницы ставок

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

Как это могло бы работать:

  1. Основное начисление: Создается начисление "Оплата по часам (базовая)", которое всегда рассчитывается по минимальной базовой ставке, например: ЧасовОтработано * 270
  2. Дополнительное начисление (доплата): Создается начисление "Доплата до повышенной ставки", которое рассчитывает разницу. Формула для этого начисления была бы сложнее, поскольку ей нужно было бы определить текущую ставку из шкалы, вычесть базовую и умножить на ЧасовОтработано. Например, если текущая ставка из шкалы 300 руб/час, а базовая 270 руб/час, то доплата составит ЧасовОтработано * (300 - 270). Это начисление применялось бы только при достижении соответствующего порога.

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

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

← На главную