В практической работе расчетчика или разработчика 1С часто возникает задача настройки сложных надбавок, зависящих от определенных условий работы сотрудника. Типичный пример — надбавка за работу в особых условиях (например, «Надбавка за работу не дома» или «Вахтовая надбавка»). Логика её расчета проста: надбавка должна начисляться только в том случае, если в табеле зарегистрирован специализированный вид времени (например, Не дома). При этом расчет должен охватывать не только обычные рабочие дни по этому профилю, но и работу в праздничные дни.
Посмотрим, с какой проблемой сталкиваются пользователи при стандартной настройке такого начисления, разберем причины такого поведения системы и найдем красивое обходное решение, не требующее программирования и изменения конфигурации.
При создании подобного начисления на вкладке Основное мы обычно выбираем вариант: «Начисление выполняется: Только если введен вид учета времени» и указываем наш основной вид времени — Не дома. Чтобы праздничные дни также учитывались в расчете надбавки, мы переходим на вкладку Учет времени и добавляем праздничные дни в список Дополнительные виды времени.
Однако здесь нас ожидает неприятный сюрприз. Алгоритм программы 1С:ЗУП 3.1 устроен так, что при использовании настройки «Только если введен вид учета времени» в качестве триггера (условия) для запуска начисления выступает любой из видов времени, указанных в карточке начисления — как основной, так и все дополнительные.
В результате, если сотрудник в течение месяца вообще не работал в условиях Не дома, но при этом у него была обычная работа в праздничные дни, программа автоматически создаст и рассчитает эту надбавку, что является грубой ошибкой. Расчетчику приходится вручную анализировать каждый табель, сводя на нет всю автоматизацию.
Проанализируем логику работы механизма учета времени в 1С:ЗУП 3.1. Когда программа формирует документ НачислениеЗарплатыИВзносов, она выполняет предварительный анализ зарегистрированного времени сотрудников за месяц.
Если для начисления задано условие запуска по виду времени, система собирает массив всех допустимых кодов времени из карточки начисления (и основное, и дополнительные). Если в табеле сотрудника обнаруживается хотя бы один код из этого массива, начисление признается активным для данного сотрудника в текущем месяце. Разработчики фирмы 1С подтверждают, что такое поведение системы заложено архитектурно и напрямую перенастроить этот триггер в рамках одной карточки начисления невозможно.
Чтобы обойти это системное ограничение и полностью автоматизировать расчет без ручного вмешательства, мы применим метод разделения одного начисления на два самостоятельных элемента. Мы настроим их таким образом, чтобы они взаимно контролировали условия запуска друг друга.
Разберем этот процесс по шагам.
Создадим начисление, которое будет отвечать за расчет надбавки в обычные (не праздничные) дни.
Назовем его, например, «Надбавка за работу не дома (в обычные дни)» и настроим следующие вкладки:
Только если введен вид учета времени.Не дома.
Результат = ВремяВДнях * ТарифНадбавки
(где ТарифНадбавки — это созданный вами показатель для ввода фиксированной суммы тарифа).
Не дома.Теперь создадим второе начисление, которое будет рассчитывать надбавку за работу в праздники, но запускаться только при наличии работы в особых условиях.
Назовем его «Надбавка за работу не дома (в праздничные дни)» и выполним настройки:
Только если введен вид учета времени.Не дома. Это ключевая деталь: начисление по праздникам будет проверяться на запуск именно по триггеру основного начисления!
Результат = ВремяВДнях * ТарифНадбавки
Праздники (или Работа в выходные и праздничные, в зависимости от того, какими кодами вы отражаете этот период в табеле).Выясним, как поведет себя программа в различных ситуациях при начислении заработной платы.
Сценарий А: Сотрудник работал в условиях «Не дома» и захватил праздничные дни.
В табеле сотрудника зафиксированы дни по коду Не дома и по коду Праздники.
При расчете зарплаты программа видит, что триггерный вид времени Не дома присутствует. Соответственно, запускаются оба начисления:
- Первое начисление рассчитывает дни работы по коду Не дома.
- Второе начисление (поскольку триггер сработал) успешно запускается и берет для расчета дни по своему основному коду учета времени — то есть Праздники.
Сотрудник получает корректную сумму за все дни.
Сценарий Б: Сотрудник НЕ работал в особых условиях, но работал в праздники.
В табеле сотрудника зафиксированы только обычные Праздники, а код Не дома отсутствует.
Система анализирует условия запуска:
- Для первого начисления триггер Не дома не найден — начисление не создается.
- Для второго начисления триггером также назначен код Не дома. Поскольку его нет в табеле, это начисление тоже игнорируется программой.
В результате сотруднику будет начислена обычная оплата за работу в праздничный день по законодательству, а «Надбавка за работу не дома» вообще не попадет в документ расчета. Цель достигнута!
Используя этот обходной путь, мы получаем сразу несколько преимуществ: