Вопрос расчета остатков отпусков в программе 1С:Зарплата и управление персоналом 8 (редакция 3.1) традиционно является одним из самых сложных для понимания как бухгалтерами, так и кадровыми специалистами. С выходом обновлений (начиная с версии 3.1.7.61) алгоритм был существенно переработан. Рассмотрим подробнее, почему разработчики отошли от старой схемы и как теперь работает логика, которую в профессиональной среде прозвали системой «обрезков».
Проанализируем причины изменений. В старых релизах 1С «половина месяца» считалась динамически. Программа брала продолжительность конкретного рабочего месяца (периода в 30 или 31 день) и делила его пополам. Из-за разного количества дней в календарных месяцах возникали ситуации, когда право на отпуск (те самые 2.33 дня) могло начислиться в одном календарном месяце дважды или не начислиться вовсе. Это вызывало путаницу в отчетах и претензии со стороны контролирующих органов.
Новый алгоритм призван привести расчет в соответствие с «Правилами об очередных и дополнительных отпусках» (утв. НКТ СССР 30.04.1930 № 169). Согласно пункту 35 этих правил, излишки менее половины месяца исключаются, а излишки не менее половины месяца округляются до полного месяца. В современной интерпретации 1С «половина месяца» теперь жестко привязана к числу 15 (или 16 в исключительных случаях), что позволяет зафиксировать дату начисления прав внутри каждого месяца.
Разберем ситуацию, когда сотрудник принят в первой половине календарного месяца. Например, рабочий год начинается 15.02.2017. В феврале 28 дней, половина — 14. Следовательно, условие «отработана половина месяца» выполняется сразу в месяце приема.
В этом случае мы определяем дату начисления прав следующим образом: Дата начала рабочего месяца + половина продолжительности календарного месяца. Но при этом дата ограничивается концом месяца. Посмотрим на пример:
Таким образом, право на отпуск «тикает» стабильно в конце каждого календарного месяца, что делает учет прозрачным.
Теперь выясним причину негодования многих пользователей — расчет при приеме в конце месяца. Рассмотрим пример: рабочий год начинается 20.02.2017. В феврале отработано всего 9 дней (с 20 по 28 число). Это меньше половины (15 дней).
Проанализируем, как система собирает «обрезки». Чтобы сотрудник получил право на первые 2.33 дня отпуска, сумма дней в неполных месяцах должна составить 15. Программа берет «обрезок» из февраля (9 дней) и ищет, сколько дней нужно добавить из марта, чтобы получить 15. Математика проста: 15 - 9 = 6.
Следовательно, даты начисления прав будут следующими:
Важный нюанс: Обратите внимание, что программа каждый раз «виртуально» возвращается к первому неполному месяцу (февралю) и добирает из текущего месяца ровно столько дней, сколько не хватило тогда. Это сделано для того, чтобы зафиксировать единую дату начисления (в нашем примере — 6-е число) на весь рабочий год. Если бы мы каждый раз считали 15 дней от предыдущей даты, день начисления постоянно смещался бы вперед, что противоречит логике ежемесячного начисления.
Посмотрим на ситуацию, которая кажется ошибкой, но на самом деле является математически обоснованной. Если рабочий год начинается 17 числа в месяце, где 31 день (например, январь), то в первом месяце отработано ровно 15 дней (с 17 по 31 число включительно). Однако половина от 31 дня — это 15.5. Согласно правилам, 15 дней — это все еще меньше половины. Поэтому начисление прав происходит, когда сумма «обрезков» станет равна 16 дням.
Пример для начала года 17.01.2017:
Для понимания того, как это реализовано внутри системы, можно представить упрощенную логику функции расчета. Программа анализирует регистр ЗаработанныеПраваНаОтпуска и сопоставляет текущую дату с «точкой фиксации» права.
// Псевдокод логики определения даты права
Если ОтработаноВПервомМесяце >= 15 Тогда
ДатаНачисления = КонецТекущегоКалендарногоМесяца();
Иначе
ДнейДоПоловины = 15 - ОтработаноВПервомМесяце;
ДатаНачисления = НачалоМесяца(ТекущаяДата) + ДнейДоПоловины - 1;
КонецЕсли;
Важно понимать: Если сотрудник увольняется 5-го числа, а право по графику «обрезков» возникает 6-го, то за последний месяц он не получит 2.33 дня компенсации, так как излишек стажа за этот месяц составит менее 15 дней.
Рассмотрим практические последствия данного алгоритма:
Проанализируем ситуацию с отпусками без сохранения оплаты (за свой счет). Если сотрудник берет такой отпуск более чем на 14 дней в году, дата окончания его рабочего года сдвигается. Следовательно, сдвигается и дата начала следующего рабочего года, и вся цепочка «обрезков» будет пересчитана относительно новой даты начала. Будьте внимательны: при формировании отчета «Остатки отпусков» на промежуточную дату (например, на середину месяца), вы можете увидеть «старый» остаток, если дата права в этом месяце еще не наступила.
Таким образом, несмотря на кажущуюся сложность фразы про «сумму обрезков», алгоритм ЗУП 3.1 направлен на математическую стабильность и исключение «плавающих» дат, которые ранее приводили к ошибкам в расчете компенсаций при увольнении.