Почему сдвигается рабочий год в ЗУП 3.1 при отсутствии видимых отклонений?

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

При работе в конфигурации 1С:Зарплата и Управление Персоналом (ЗУП) 3.1, особенно начиная с релизов ветки 3.1.7.х, специалисты часто сталкиваются с ситуацией, когда у сотрудников «расползаются» границы рабочих лет. Даже если у человека нет длительных отпусков за свой счет (более 14 дней в году) или периодов ухода за ребенком, рабочий год может сместиться на 1, 2 или 3 дня вперед. Это вызывает вопросы у кадровиков и аудиторов, так как нарушается привычная логика: дата приема + 1 год минус 1 день.

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

Изменение методики расчета в версии 3.1.7

Основная причина массовых изменений дат окончания рабочих лет кроется в смене алгоритма, который произошел в релизе 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 дней, прогулы и неясные неявки сдвигают год начиная с первого же дня.

Проанализируем цепочку событий:

  1. Сотрудник не вышел на работу 1 февраля.
  2. Кадровик ввел документ Отсутствие (прогул, неявка).
  3. Программа тут же сдвинула окончание рабочего года на +1 день.
  4. Позже выяснилось, что сотрудник болел, и был введен Больничный лист.
  5. Документ больничного должен вытеснить неявку, и сдвиг года должен аннулироваться.

Если по какой-то причине (ошибка в приоритетах начислений или ручные правки) вытеснение не сработало, или документ неявки не был помечен на удаление/исправлен, рабочий год останется сдвинутым навсегда.

Анализ данных через регистры и запросы

Чтобы найти сотрудников с «поехавшими» датами, не обязательно открывать карточку каждого. Мы можем проанализировать данные регистра сведений ЗаработанныеПраваНаОтпуска. В этом регистре хранятся записи о периодах, за которые начислены права на отпуск.

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


ВЫБРАТЬ
    Т.Сотрудник КАК Сотрудник,
    Т.ВидЕжегодногоОтпуска КАК ВидЕжегодногоОтпуска,
    КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ДЕНЬ(ЕСТЬNULL(Т.ДатаОкончания, &ТекДата))) КАК ДЕНЬ,
    КОЛИЧЕСТВО(РАЗЛИЧНЫЕ МЕСЯЦ(ЕСТЬNULL(Т.ДатаОкончания, &ТекДата))) КАК МЕСЯЦ
ПОМЕСТИТЬ ВТ
ИЗ
    РегистрСведений.ЗаработанныеПраваНаОтпуска КАК Т
СГРУППИРОВАТЬ ПО
    Т.Сотрудник,
    Т.ВидЕжегодногоОтпуска
ИМЕЮЩИЕ
    КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ДЕНЬ(ЕСТЬNULL(Т.ДатаОкончания, &ТекДата))) > 1
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ 
    ВТ.Сотрудник КАК Сотрудник,
    ВТ.ВидЕжегодногоОтпуска КАК ВидЕжегодногоОтпуска,
    Отп2.ДатаНачала КАК ДатаНачала,
    Отп2.ДатаОкончания КАК ДатаОкончания,
    Отп2.КоличествоДнейЗаПериод КАК КоличествоДнейЗаПериод
ИЗ
    ВТ КАК ВТ
    ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЗаработанныеПраваНаОтпуска КАК Отп2
    ПО (ВТ.Сотрудник = Отп2.Сотрудник)
    И (ВТ.ВидЕжегодногоОтпуска = Отп2.ВидЕжегодногоОтпуска)
УПОРЯДОЧИТЬ ПО
    ВТ.Сотрудник.Наименование

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

Как проверить причины сдвига для конкретного человека?

Рассмотрим пошаговый алгоритм проверки, если вы обнаружили сдвиг:

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

Технический итог

Подведем итоги нашего анализа. Сдвиг рабочего года в ЗУП 3.1 на 1-3 дня чаще всего не является «глюком» кода, а является следствием:

1. Новой математики расчета стажа: переход от календарных месяцев к расчету в днях (релиз 3.1.7+).

2. Особенностей переноса: стыковка старых периодов из 2.5 с новыми правилами 3.1.

3. Неявками: которые сдвигают год сразу, в отличие от отпусков за свой счет.

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

← На главную