Почему в 1С:ЗУП 3.1 показатель «ОтработаноДней» считается неправильно и как это исправить?

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

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

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

Анализируем архитектуру платформы: почему возникает ошибка?

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

Механизм регистров расчета платформы «1С:Предприятие» устроен таким образом, что период действия любой записи определяется правилами вытеснения. Если для конкретного вида расчета (в нашем случае — компенсации молока) на вкладке Приоритет не настроены вытесняющие виды начислений, система считает фактический период действия равным всему периоду регистрации (то есть полному календарному месяцу). Для программы эта запись остается «цельной», она не «разрезается» документами отклонений. Как результат — показатели времени рассчитываются по полному графику работы сотрудника за месяц.

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

Решение 1: Настройка механизма вытеснения (Приоритетов)

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

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

Важно: в этот список необходимо добавить абсолютно все возможные отклонения, которые могут встретиться у сотрудников организации:

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

Тонкости настройки вкладки «Учет времени»

При использовании автоматического расчета времени на основе показателей регистра расчета следует обратить внимание на настройки вкладки Учет времени в карточке начисления:

Решение 2: Альтернативный (наиболее надежный) способ расчета компенсации

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

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

Шаг 1. Создание показателя «Тариф молока»

  1. Перейдем в меню Настройки — Показатели расчета зарплаты и создадим новый показатель.
  2. Зададим наименование: Тариф молока.
  3. Назначение показателя: Для организации.
  4. Тип показателя: Денежный.
  5. Установим переключатель использования в положение: Постоянное использование (значение вводится единожды при настройке или изменении тарифа).

Шаг 2. Создание показателя «Количество смен во вредных условиях»

  1. Создадим еще один показатель расчета зарплаты.
  2. Наименование: Количество смен во вредных условиях.
  3. Назначение показателя: Для сотрудника.
  4. Тип показателя: Числовой.
  5. Использование: Только в месяце, в котором вводится значение (разовое использование).

Шаг 3. Настройка вида начисления

  1. В карточке начисления компенсации укажем назначение: Повременная оплата труда или надбавка.
  2. Начисление выполняется: Только если введено значение показателя (выбираем созданный показатель Количество смен во вредных условиях).
  3. Формула расчета: ТарифМолока * КоличествоСменВоВредныхУсловиях

Шаг 4. Настройка ввода данных

Для удобного ввода отработанных вредных смен перейдем в меню Настройки — Шаблоны ввода исходных данных. Создадим новый шаблон, в котором на вкладке Показатели зарплаты отметим флажком показатель Количество смен во вредных условиях. На вкладке Дополнительно можно настроить заполнение документа списком сотрудников для ускорения работы пользователей.

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

Инструкция для разработчиков: как отлаживать расчет показателей

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

Расчет показателей времени происходит в модуле объекта обработки МенеджерРасчетаЗарплаты. Основная логика по сбору отработанного времени сосредоточена в процедурах:

Поскольку расчетные механизмы используют менеджер временных таблиц, данные физически находятся во временных таблицах СУБД, и прочесть их обычным просмотром локальных переменных невозможно. Рассмотрим эффективный прием просмотра временных таблиц в режиме отладки на платформе «1С:Предприятие 8.3»:

  1. Установим точку останова в коде процедуры РассчитатьЗначенияПоказателейОтработаноВсего() сразу после строки Запрос.Выполнить();.
  2. В момент остановки откроем окно Вычислить выражение (сочетание клавиш Shift+F9).
  3. Чтобы быстро проанализировать содержимое конкретной временной таблицы (например, таблицы с данными времени), выполним подмену текста запроса «на лету» прямо в окне вычисления выражений, выполнив следующую конструкцию:

Запрос.Текст = "ВЫБРАТЬ * ИЗ ВТДанныеВремени"; 
Запрос.Выполнить().Выгрузить()

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

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


// Типовой код: МесяцНачисления = МесяцыРасчета[0];
Если НЕ РасчетОдногоМесяца И ТипЗнч(ИсключаемыйРегистратор) = Тип("ДокументСсылка.Увольнение") Тогда
    МесяцНачисления = МесяцыРасчета[1];
Иначе
    МесяцНачисления = МесяцыРасчета[0];
КонецЕсли;

Этот код позволяет программе корректно переключаться на актуальный месяц расчета и правильно подтягивать все действующие на этот момент отсутствия и отклонения сотрудника.

← На главную