В практике автоматизации учета заработной платы часто возникают задачи, которые кажутся простыми на первый взгляд, но требуют глубокого понимания механизмов платформы 1С:Предприятие 8.3. Одной из таких задач является расчет фиксированной доплаты за выход на смену, где сумма зависит от того, была ли смена дневной или ночной. При этом обязательным условием часто выступает использование строго одного вида расчета. Рассмотрим, как реализовать этот алгоритм в программе 1С:Зарплата и Управление Персоналом 3.1, используя стандартный функционал и логические формулы.
Представим ситуацию: охранники работают по графику «сутки через двое». Руководство вводит доплату за контроль территории. Если в смене были ночные часы (условно назовем такую смену «ночной»), сотрудник получает 80 рублей. Если смена была полностью дневной — 60 рублей. Нам необходимо создать универсальное начисление, которое будет автоматически определять тип смены и подставлять нужную сумму, не требуя от расчетчика ручного ввода количества смен.
Главная сложность здесь заключается в том, что в типовом функционале ЗУП начисления обычно привязаны либо к общему количеству отработанного времени за месяц, либо к конкретным видам времени. Нам же нужно заставить систему анализировать каждый день в отдельности.
Прежде чем приступать к написанию формулы, разберем ключевой параметр, который определяет поведение начисления. Создадим новый вид расчета в справочнике Начисления. Чтобы программа могла анализировать состав часов внутри каждого дня, нам необходимо правильно настроить вкладку «Учет времени».
Выполним следующие действия:
Явка, Ночные часы, Вечерние часы.Почему это важно? Когда мы выбираем «Дополнительная оплата», программа при расчете документа Начисление зарплаты и взносов начинает «просматривать» график или табель сотрудника посуточно. Если бы мы выбрали «За работу полную смену», система могла бы просто суммировать часы за месяц, что не позволило бы нам применить разную логику к разным дням.
Проанализируем инструменты, которые предоставляет редактор формул 1С. Для решения нашей задачи идеально подходит тернарный оператор или функция ?. Синтаксис этой функции выглядит так: ?(Условие, Значение_Если_Истина, Значение_Если_Ложь).
Рассмотрим вариант формулы, который будет работать в нашем случае:
?(НочныеЧасы > 0, 80, 60) * (ВремяВЧасах > 0)
Разберем подробно, как работает эта конструкция:
НочныеЧасы > 0 — система проверяет, зафиксированы ли в конкретном расчетном дне часы по виду времени Ночные.(ВремяВЧасах > 0) — это логический фильтр. В языке выражений 1С логическое значение «Истина» преобразуется в 1, а «Ложь» в 0. Это необходимо, чтобы в выходные дни по графику, когда ВремяВЧасах равно нулю, результат всего выражения обнулялся. Без этого множителя система могла бы начислять по 60 рублей даже за выходные дни, так как условие НочныеЧасы > 0 там формально не выполняется (Ложь), и выбирается второе значение.Проанализируем ситуацию с суточными сменами. В ЗУП 3.1 время в графике жестко привязано к календарным суткам. Смена «сутки через двое» (с 08:00 одного дня до 08:00 другого) в программе разбивается на две части:
Если мы используем формулу ?(НочныеЧасы > 0, 80, 60), то возникнет проблема: и в первый, и во второй календарный день присутствуют ночные часы. В итоге за одну суточную смену сотрудник получит 80 + 80 = 160 рублей, что не соответствует условию (нужно 80 за всю смену целиком).
Рассмотрим «профессиональный» способ решения этой коллизии без программирования. Нам нужно сделать так, чтобы начисление срабатывало только один раз за смену, желательно в день ее начала. Для этого можно использовать дополнительный Вид времени, назовем его Выход на контроль.
Алгоритм настройки будет следующим:
Выход на контроль (через справочник Виды использования рабочего времени). Укажем, что это рабочее время.ВремяВЧасах на проверку этого специфического вида времени.Если же менять график нельзя, и нужно опираться только на Явку и Ночные, можно использовать более сложную проверку в формуле, анализируя количество часов, чтобы отсечь «хвосты» смен, но это менее надежный метод.
Для корректного расчета любого начисления в ЗУП важно настроить вкладку «Приоритет». Выясним причину, почему это необходимо. Если сотрудник во время своей смены заболел или ушел в отпуск, автоматическая доплата за контроль не должна начисляться.
Проверим, чтобы в правой колонке («Начисления, приоритет которых выше») были указаны все виды отсутствий:
БольничныйОтпуск основнойОтпуск без сохранения оплатыКомандировкаБлагодаря тому, что мы настроили начисление как «Дополнительную оплату за уже оплаченное время», оно будет автоматически вытесняться вместе с основными часами явки.
Мы проанализировали механизм работы ежедневных начислений в ЗУП 3.1. Подведем итоги:
? позволяет реализовать ветвление логики внутри одного вида расчета.Дополнительная оплата за уже оплаченное время превращает начисление в «посуточный» калькулятор.Подобный подход демонстрирует гибкость системы и позволяет решать задачи уровня «Профессионал» без привлечения разработчиков и изменения кода конфигурации, что значительно упрощает дальнейшую поддержку и обновление программы.