При расчете зарплаты в программе «1С:Зарплата и управление персоналом 3.1» (ЗУП 3.1) пользователи часто сталкиваются с неприятной ситуацией: окладная часть сотрудника рассчитывается исходя из корректного количества отработанных дней (например, 7 дней), а пользовательское начисление «Компенсация за питание» за тот же период берет в расчет ровно в два раза больше времени (например, 14 дней). При этом настройки вида времени, такие как «Явка» или «Рабочее время», а также использование показателей ОтработаноДней или ВремяВДнях не решают проблему в лоб.
В этой статье мы подробно разберем причины возникновения данной ошибки, проанализируем поведение расчетного механизма платформы 1С и рассмотрим несколько эффективных способов решения проблемы.
Одной из наиболее частых причин некорректного (в том числе двукратного) завышения отработанного времени является сбой или некорректное кэширование настроек на вкладке «Учет времени» в карточке начисления. Это часто происходит при переносе данных из старых версий программ (например, 1С:ЗУП 2.5) или при многократном изменении настроек начисления пользователем.
Программа визуально может показывать, что выбран только один вид времени (например, «Явка»), но на уровне базы данных в скрытой таблице дополнительных видов времени могут оставаться активными другие флажки. В результате при проведении расчета система суммирует эти показатели.
Как исправить эту ситуацию по шагам:
Явка (или иной необходимый вид времени), а дополнительные виды времени оставим незаполненными.Если для компенсации питания не настроен список вытесняющих начислений, программа не сможет корректно сопоставить периоды работы и периоды отсутствия сотрудника. Оклад вытесняется отпусками, больничными и командировками «из коробки», а для нового начисления эти правила нужно задать вручную.
Если сотрудник часть месяца болел или находился в отпуске, но эти начисления не указаны в приоритетах компенсации питания, система возьмет плановое время по графику, проигнорировав фактическое отсутствие.
Настроим вкладку «Приоритет» правильно:
Очередной отпуск, Больничный лист, Командировка, Отпуск без сохранения оплаты (все виды административных отпусков), Прогул и другие виды невыходов.В некоторых релизах ЗУП 3.1 оптимизатор запросов платформы группирует записи регистров расчета по дням не совсем корректно, если в формуле используются только дневные показатели (например, ОтработаноДней или ВремяВДнях), а само начисление выполняется как «Дополнительная оплата за уже оплаченное время». Программа «теряет» связь с детальными записями фактического времени и задваивает строки.
Для обхода этой особенности разработчики и аналитики используют проверенный технический прием — принудительное подключение часовых регистров учета времени в формулу расчета через умножение на ноль.
Рассмотрим, как выглядит стандартная формула расчета компенсации:
СтоимостьОбеда * ОтработаноДней
Для того чтобы заставить расчетный механизм программы обратиться к самым детальным таблицам учета времени и корректно сгруппировать дни, мы модифицируем формулу следующим образом:
СтоимостьОбеда * ОтработаноДней + ВремяВЧасах * 0 + ОтработаноЧасов * 0
Или, если вы используете показатель времени в днях:
СтоимостьОбеда * ВремяВДнях + ВремяВЧасах * 0
Почему это работает? Добавление показателей ВремяВЧасах или ОтработаноЧасов, даже помноженных на ноль (что никак не меняет конечную математическую сумму начисления), заставляет алгоритм компоновки запроса 1С подключить детальный регистр сведений о времени. В результате группировка по дням выстраивается идеально, и задвоение дней исчезает.
В версиях 1С:ЗУП начиная с релиза 3.1.9 разработчики внедрили фоновую оптимизацию расчетов (кэширование таблиц времени). К сожалению, в некоторых ранних сборках этот механизм кэшировал данные без учета индивидуальных отклонений текущего месяца, из-за чего дополнительные начисления рассчитывались некорректно.
Если вы столкнулись с этой проблемой, рекомендуется временно отключить оптимизацию для проверки результата:
Если сотрудники вашего предприятия работают по сложным сменным графикам (например, когда смена начинается в 20:00 одного дня и заканчивается в 08:00 следующего), показатель ОтработаноДней неизбежно будет сбоить, так как система будет делить одну ночную смену на два календарных дня в табеле.
В этом случае оптимальным решением будет отказ от автоматического расчета дней по графикам и переход на ввод фактических данных. Рассмотрим этот алгоритм:
КоличествоОбедов. Назначение показателя: «Для сотрудника», вводится «Только в месяце начисления» (документом ввода данных).
СтоимостьОбеда * КоличествоОбедов
КоличествоОбедов для списка сотрудников.Мы проанализировали основные причины сбоев при подсчете отработанных дней для дополнительных начислений в 1С:ЗУП 3.1. Использование описанных настроек приоритетов, очистка скрытых видов времени и применение маленьких хитростей в формулах помогут вам добиться абсолютно точного и предсказуемого результата расчета заработной платы.