Почему в 1С:ЗУП 3.1 компенсация за питание рассчитывает в два раза больше дней, и как это исправить?

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

При расчете зарплаты в программе «1С:Зарплата и управление персоналом 3.1» (ЗУП 3.1) пользователи часто сталкиваются с неприятной ситуацией: окладная часть сотрудника рассчитывается исходя из корректного количества отработанных дней (например, 7 дней), а пользовательское начисление «Компенсация за питание» за тот же период берет в расчет ровно в два раза больше времени (например, 14 дней). При этом настройки вида времени, такие как «Явка» или «Рабочее время», а также использование показателей ОтработаноДней или ВремяВДнях не решают проблему в лоб.

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

Причина 1. Проблема скрытых настроек учета времени

Одной из наиболее частых причин некорректного (в том числе двукратного) завышения отработанного времени является сбой или некорректное кэширование настроек на вкладке «Учет времени» в карточке начисления. Это часто происходит при переносе данных из старых версий программ (например, 1С:ЗУП 2.5) или при многократном изменении настроек начисления пользователем.

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

Как исправить эту ситуацию по шагам:

  1. Перейдем в раздел «Настройка», откроем справочник «Начисления» и найдем наше начисление «Компенсация за питание».
  2. Перейдем на вкладку «Учет времени».
  3. Полностью очистим поле «Вид времени» (сделаем его абсолютно пустым). Это действие принудительно сбросит все скрытые и системные флажки в базе данных.
  4. Запишем документ (нажмем кнопку «Записать»).
  5. После этого заново выберем в поле «Вид времени» значение Явка (или иной необходимый вид времени), а дополнительные виды времени оставим незаполненными.
  6. Запишем и закроем начисление, после чего проведем перерасчет сотрудника.

Причина 2. Ошибки вытеснения на вкладке «Приоритет»

Если для компенсации питания не настроен список вытесняющих начислений, программа не сможет корректно сопоставить периоды работы и периоды отсутствия сотрудника. Оклад вытесняется отпусками, больничными и командировками «из коробки», а для нового начисления эти правила нужно задать вручную.

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

Настроим вкладку «Приоритет» правильно:

  1. В карточке начисления «Компенсация за питание» перейдем на вкладку «Приоритет».
  2. В левую таблицу («Начисления, приоритет которых выше») нам необходимо добавить все возможные виды отклонений, которые могут пересекаться с рабочим временем сотрудника.
  3. Обязательно добавим туда следующие начисления: Очередной отпуск, Больничный лист, Командировка, Отпуск без сохранения оплаты (все виды административных отпусков), Прогул и другие виды невыходов.
  4. Сохраним настройки. Теперь при расчете компенсации программа будет четко вычитать дни отсутствия из общего пула рабочих дней.

Причина 3. Особенности работы расчетного движка и технический «лайфхак» с формулой

В некоторых релизах ЗУП 3.1 оптимизатор запросов платформы группирует записи регистров расчета по дням не совсем корректно, если в формуле используются только дневные показатели (например, ОтработаноДней или ВремяВДнях), а само начисление выполняется как «Дополнительная оплата за уже оплаченное время». Программа «теряет» связь с детальными записями фактического времени и задваивает строки.

Для обхода этой особенности разработчики и аналитики используют проверенный технический прием — принудительное подключение часовых регистров учета времени в формулу расчета через умножение на ноль.

Рассмотрим, как выглядит стандартная формула расчета компенсации:

СтоимостьОбеда * ОтработаноДней

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

СтоимостьОбеда * ОтработаноДней + ВремяВЧасах * 0 + ОтработаноЧасов * 0

Или, если вы используете показатель времени в днях:

СтоимостьОбеда * ВремяВДнях + ВремяВЧасах * 0

Почему это работает? Добавление показателей ВремяВЧасах или ОтработаноЧасов, даже помноженных на ноль (что никак не меняет конечную математическую сумму начисления), заставляет алгоритм компоновки запроса 1С подключить детальный регистр сведений о времени. В результате группировка по дням выстраивается идеально, и задвоение дней исчезает.

Причина 4. Влияние механизма фоновой оптимизации расчетов

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

Если вы столкнулись с этой проблемой, рекомендуется временно отключить оптимизацию для проверки результата:

  1. Перейдем в меню «Администрирование» — «Обслуживание».
  2. Найдем раздел регламентных операций или констант (в зависимости от релиза это может быть также в настройках состава начислений и удержаний).
  3. Отключим опцию фоновой оптимизации расчета зарплаты, после чего перезапустим сеанс и полностью пересчитаем документ «Начисление зарплаты и взносов».

Альтернативное решение: Ввод данных через документ «Данные для расчета зарплаты»

Если сотрудники вашего предприятия работают по сложным сменным графикам (например, когда смена начинается в 20:00 одного дня и заканчивается в 08:00 следующего), показатель ОтработаноДней неизбежно будет сбоить, так как система будет делить одну ночную смену на два календарных дня в табеле.

В этом случае оптимальным решением будет отказ от автоматического расчета дней по графикам и переход на ввод фактических данных. Рассмотрим этот алгоритм:

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

Мы проанализировали основные причины сбоев при подсчете отработанных дней для дополнительных начислений в 1С:ЗУП 3.1. Использование описанных настроек приоритетов, очистка скрытых видов времени и применение маленьких хитростей в формулах помогут вам добиться абсолютно точного и предсказуемого результата расчета заработной платы.

← На главную