При настройке дополнительных начислений (например, компенсации молока за вредность, надбавок за особые условия труда или различных доплат, зависящих от времени) пользователи часто сталкиваются со следующей проблемой. В формуле начисления используется показатель ОтработаноДней или ВремяВДнях, однако при расчете зарплаты сотрудникам, у которых в течение месяца были отклонения (отпуск, больничный, командировка), программа рассчитывает показатель по полному графику сотрудника, игнорируя дни отсутствия. При этом в табеле учета рабочего времени и в расчете основного оклада всё отображается корректно.
В этой статье мы подробно разберем, почему возникает такое поведение системы, как правильно настроить механизм приоритетов (вытеснения) и какие альтернативные, более надежные способы настройки начислений рекомендуют использовать методисты фирмы 1С.
Для начала выясним причину, по которой замена показателя ОтработаноДней на ВремяВДнях с указанием конкретного вида времени (например, Явка) не приносит желаемого результата. Оба этих показателя в формулах начислений с назначением «Дополнительная оплата за уже оплаченное время» рассчитываются на основании фактического периода действия записи в регистре расчета Начисления.
Механизм регистров расчета платформы «1С:Предприятие» устроен таким образом, что период действия любой записи определяется правилами вытеснения. Если для конкретного вида расчета (в нашем случае — компенсации молока) на вкладке Приоритет не настроены вытесняющие виды начислений, система считает фактический период действия равным всему периоду регистрации (то есть полному календарному месяцу). Для программы эта запись остается «цельной», она не «разрезается» документами отклонений. Как результат — показатели времени рассчитываются по полному графику работы сотрудника за месяц.
Системе абсолютно неважно, как пользователь классифицирует данное начисление в своей голове. Существует жесткий алгоритм работы регистра расчета: нет вытеснения — фактический период равен плановому периоду по графику.
Если необходимо использовать автоматический расчет дней непосредственно через формулу начисления, нам придется вручную настроить правила вытеснения для компенсации. Проанализируем, как правильно заполнить вкладку Приоритет:
Важно: в этот список необходимо добавить абсолютно все возможные отклонения, которые могут встретиться у сотрудников организации:
После настройки этой таблицы документы-отклонения начнут физически «вытеснять» периоды компенсации в регистре расчета, «разрезая» запись начисления. В результате показатель ВремяВДнях (или ОтработаноДней) начнет рассчитываться строго по фактически отработанному времени.
При использовании автоматического расчета времени на основе показателей регистра расчета следует обратить внимание на настройки вкладки Учет времени в карточке начисления:
Явка рекомендуется указывать предопределенный вид времени Рабочее время. Это собирательное понятие, в которое платформа автоматически включает явку, ночные часы, работу в выходные дни и другие аналогичные виды деятельности.Праздники без повышенной оплаты (или Праздники с повышенной оплатой, если такие дни также должны компенсироваться молоком).Использование встроенных показателей времени часто порождает методологические сложности. Например, если сотрудник работает во вредных условиях не все свои смены, а только часть из них, показатель ВремяВДнях все равно рассчитает абсолютно все рабочие дни по графику (при условии, что не было официальных отклонений). Платформа не умеет автоматически разделять рабочие смены на «вредные» и «обычные» без ведения сложных раздельных графиков или табелей.
Для обхода этой проблемы методисты фирмы 1С рекомендуют использовать расчет через показатели, вводимые вручную. Разберем этот процесс по шагам:
Тариф молока.Количество смен во вредных условиях.Количество смен во вредных условиях).ТарифМолока * КоличествоСменВоВредныхУсловиях
Для удобного ввода отработанных вредных смен перейдем в меню Настройки — Шаблоны ввода исходных данных. Создадим новый шаблон, в котором на вкладке Показатели зарплаты отметим флажком показатель Количество смен во вредных условиях. На вкладке Дополнительно можно настроить заполнение документа списком сотрудников для ускорения работы пользователей.
Теперь расчетчики будут раз в месяц вносить реальное количество отработанных вредных смен через документ Данные для расчета зарплаты. Этот способ полностью подконтролен пользователю, не зависит от сложных запросов платформы по фактическому периоду действия и полностью исключает ошибки, связанные с забытыми или ненастроенными вытеснениями на вкладке Приоритет.
Если вы хотите детально разобраться, из каких таблиц программа берет неверные данные до настройки вытеснения, вам потребуется отладчик. Проанализируем алгоритм отладки шагов расчета времени:
Расчет показателей времени происходит в модуле объекта обработки МенеджерРасчетаЗарплаты. Основная логика по сбору отработанного времени сосредоточена в процедурах:
РассчитатьЗначенияПоказателейНачислений()РассчитатьЗначенияПоказателейОтработаноВсего()Поскольку расчетные механизмы используют менеджер временных таблиц, данные физически находятся во временных таблицах СУБД, и прочесть их обычным просмотром локальных переменных невозможно. Рассмотрим эффективный прием просмотра временных таблиц в режиме отладки на платформе «1С:Предприятие 8.3»:
РассчитатьЗначенияПоказателейОтработаноВсего() сразу после строки Запрос.Выполнить();.
Запрос.Текст = "ВЫБРАТЬ * ИЗ ВТДанныеВремени";
Запрос.Выполнить().Выгрузить()
После вычисления этого выражения платформа вернет стандартную таблицу значений, которую можно открыть для детального визуального просмотра. Так вы сможете увидеть, какие именно записи регистра расчета не были «разрезаны» вытеснением.
Также обратим внимание на важный нюанс при расчете зарплаты увольняемого сотрудника. В некоторых версиях конфигурации при расчете последнего начисления при увольнении (когда между датой последнего начисления и фактическим увольнением пропущен целый месяц) программа может не учитывать отклонения последнего месяца. Для решения этой специфической проблемы в процедуре РассчитатьЗарплатуСлужебный() обработки МенеджерРасчетаЗарплаты применяется следующая корректировка кода:
// Типовой код: МесяцНачисления = МесяцыРасчета[0];
Если НЕ РасчетОдногоМесяца И ТипЗнч(ИсключаемыйРегистратор) = Тип("ДокументСсылка.Увольнение") Тогда
МесяцНачисления = МесяцыРасчета[1];
Иначе
МесяцНачисления = МесяцыРасчета[0];
КонецЕсли;
Этот код позволяет программе корректно переключаться на актуальный месяц расчета и правильно подтягивать все действующие на этот момент отсутствия и отклонения сотрудника.