При работе в конфигурации 1С:Зарплата и Управление Персоналом (ЗУП) 3.1, особенно начиная с релизов ветки 3.1.7.х, специалисты часто сталкиваются с ситуацией, когда у сотрудников «расползаются» границы рабочих лет. Даже если у человека нет длительных отпусков за свой счет (более 14 дней в году) или периодов ухода за ребенком, рабочий год может сместиться на 1, 2 или 3 дня вперед. Это вызывает вопросы у кадровиков и аудиторов, так как нарушается привычная логика: дата приема + 1 год минус 1 день.
В этой статье мы разберем технические и методологические причины такого поведения программы, проанализируем изменения в коде и выясним, как найти «виновных» в сдвиге рабочего года.
Основная причина массовых изменений дат окончания рабочих лет кроется в смене алгоритма, который произошел в релизе 3.1.7. Разберем ситуацию подробнее. До этого момента программа использовала упрощенную логику, ориентированную на календарные месяцы. Однако из-за разного количества дней в месяцах (28, 29, 30, 31) возникали ситуации, когда право на отпуск могло начислиться дважды за календарный месяц или не начислиться вовсе.
Новая методика перешла на расчет «внутреннего стажа» в днях. Проанализируем, как это работает: теперь программа считает месяц не как календарный интервал, а как период, равный количеству дней в «рабочем месяце» сотрудника. Это привело к тому, что 1С стала более чувствительна к границам периодов и способам округления при расчете остатков.
Важный нюанс: Если сотрудник был принят 30-го или 31-го числа, а в следующем году февраль короткий или месяц окончания имеет меньше дней, программа может скорректировать дату окончания периода на 1 день, чтобы избежать «наползания» периодов друг на друга. Это техническая особенность реализации нового механизма формирования таблицы периодов стажа.
Рассмотрим ситуацию, когда организация переходила с версии ЗУП 2.5 на ЗУП 3.1. При выполнении «полного переноса» данных переносится вся история за последние три года. Если в старой базе были ручные корректировки остатков или периоды были закрыты нетиповым способом, новая программа пытается «переварить» эти данные по своим правилам.
Часто дата ввода остатков (например, 01.01.2018) не совпадает с датой окончания очередного рабочего года сотрудника. ЗУП 3.1 вынуждена «состыковать» перенесенные остатки с текущим стажем. В этот момент происходит математическое выравнивание, которое может дать погрешность в 1 день. Программа считает дату ввода остатков либо как последний день старого периода, либо как первый день нового, что и порождает сдвиг всей последующей цепочки лет.
Согласно статье 121 ТК РФ, из стажа, дающего право на ежегодный основной оплачиваемый отпуск, исключается время отсутствия работника на работе без уважительных причин. Посмотрим, как это реализовано в ЗУП 3.1.
Существует типовой алгоритм, который удивляет многих пользователей: документ Отсутствие (прогул, неявка) с видом «Отсутствие по невыясненным причинам» автоматически продлевает рабочий год на количество дней отсутствия сразу после проведения. В отличие от отпусков за свой счет, где действует лимит в 14 дней, прогулы и неясные неявки сдвигают год начиная с первого же дня.
Проанализируем цепочку событий:
Отсутствие (прогул, неявка).Больничный лист.Если по какой-то причине (ошибка в приоритетах начислений или ручные правки) вытеснение не сработало, или документ неявки не был помечен на удаление/исправлен, рабочий год останется сдвинутым навсегда.
Чтобы найти сотрудников с «поехавшими» датами, не обязательно открывать карточку каждого. Мы можем проанализировать данные регистра сведений ЗаработанныеПраваНаОтпуска. В этом регистре хранятся записи о периодах, за которые начислены права на отпуск.
Проанализируем пример запроса, который позволяет выявить сотрудников, у которых дата окончания рабочего года (день и месяц) меняется от периода к периоду при отсутствии документов-отклонений:
ВЫБРАТЬ
Т.Сотрудник КАК Сотрудник,
Т.ВидЕжегодногоОтпуска КАК ВидЕжегодногоОтпуска,
КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ДЕНЬ(ЕСТЬNULL(Т.ДатаОкончания, &ТекДата))) КАК ДЕНЬ,
КОЛИЧЕСТВО(РАЗЛИЧНЫЕ МЕСЯЦ(ЕСТЬNULL(Т.ДатаОкончания, &ТекДата))) КАК МЕСЯЦ
ПОМЕСТИТЬ ВТ
ИЗ
РегистрСведений.ЗаработанныеПраваНаОтпуска КАК Т
СГРУППИРОВАТЬ ПО
Т.Сотрудник,
Т.ВидЕжегодногоОтпуска
ИМЕЮЩИЕ
КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ДЕНЬ(ЕСТЬNULL(Т.ДатаОкончания, &ТекДата))) > 1
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ВТ.Сотрудник КАК Сотрудник,
ВТ.ВидЕжегодногоОтпуска КАК ВидЕжегодногоОтпуска,
Отп2.ДатаНачала КАК ДатаНачала,
Отп2.ДатаОкончания КАК ДатаОкончания,
Отп2.КоличествоДнейЗаПериод КАК КоличествоДнейЗаПериод
ИЗ
ВТ КАК ВТ
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЗаработанныеПраваНаОтпуска КАК Отп2
ПО (ВТ.Сотрудник = Отп2.Сотрудник)
И (ВТ.ВидЕжегодногоОтпуска = Отп2.ВидЕжегодногоОтпуска)
УПОРЯДОЧИТЬ ПО
ВТ.Сотрудник.Наименование
Этот запрос находит тех, у кого количество различных дней окончания рабочего года больше одного. Если у сотрудника без отклонений даты окончания всегда должны быть, например, 26.06.2019, 26.06.2020 и т.д., то наличие разных чисел месяца в этом регистре явно сигнализирует о проблеме.
Рассмотрим пошаговый алгоритм проверки, если вы обнаружили сдвиг:
Отсутствие (прогул, неявка), а также Приостановление трудовых договоров или Отстранение от работы.Ввод начальных остатков отпусков. Попробуйте временно изменить дату остатков на один день вперед или назад в копии базы и посмотрите, выровняется ли цепочка периодов в Справке об остатках.Подведем итоги нашего анализа. Сдвиг рабочего года в ЗУП 3.1 на 1-3 дня чаще всего не является «глюком» кода, а является следствием:
1. Новой математики расчета стажа: переход от календарных месяцев к расчету в днях (релиз 3.1.7+).
2. Особенностей переноса: стыковка старых периодов из 2.5 с новыми правилами 3.1.
3. Неявками: которые сдвигают год сразу, в отличие от отпусков за свой счет.
Для исправления ситуации рекомендуется использовать типовые средства исправления остатков или, если сдвиг признан допустимым с точки зрения методологии фирмы 1С (из-за разницы в длине месяцев), оставить его как есть, так как итоговое количество заработанных дней отпуска обычно остается корректным.