При переходе с версии 1С:ЗУП 2.5 на 3.1 (особенно начиная с релизов 3.1.7 и выше) пользователи часто сталкиваются с аномалией: рабочий год сотрудника, в течение которого ему полагается ежегодный отпуск, начинает «плыть». Например, если сотрудник принят 30.01.2017, мы ожидаем увидеть границы периодов 30.01.2017–29.01.2018 и 30.01.2018–29.01.2019. Однако программа может самопроизвольно сдвинуть дату окончания второго года, например, на 01.02.2019.
Рассмотрим подробнее, почему это происходит, как диагностировать проблему и какими методами можно вернуть расчеты в корректное русло.
Разберем ситуацию с точки зрения методологии программы. В версии 1С:ЗУП 3.1.7 был существенно переработан механизм учета прав на отпуска. Теперь система не просто хранит конечное число дней, а пытается восстановить историю заработанных прав в разрезе рабочих лет в специальном вспомогательном регистре сведений Заработанные права на отпуска.
Основная проблема кроется в несоответствии даты переноса данных (даты среза) и фактического окончания рабочего года сотрудника. Когда мы вводим начальные остатки на фиксированную дату (например, на 01.01 или 01.02), программа сталкивается с необходимостью интерпретировать остаток дней через стаж работы. Согласно законодательству, при расчете отпускного стажа излишки менее половины месяца (14 дней включительно) отбрасываются, а 15 и более дней округляются до полного месяца.
Если дата ввода остатка попадает на середину рабочего месяца сотрудника, система может «округлить» стаж не в ту сторону, которую ожидает пользователь. Пытаясь математически оправдать введенное количество дней остатка (особенно если они содержат дробную часть, перенесенную из версии 2.5), программа «растягивает» или «сжимает» текущий рабочий год, чтобы выйти на нужную цифру накопленных прав.
Если в базе сотни или тысячи сотрудников, проверять каждого вручную невозможно. Для диагностики можно воспользоваться запросом к регистру Заработанные права на отпуска. Нам нужно найти записи, где даты начала или окончания рабочих лет не кратны дате приема (с учетом естественных сдвигов из-за отпусков за свой счет, но в данном случае мы ищем именно системные ошибки переноса).
Проанализируем пример запроса, который позволяет выловить «подозрительные» записи по сотрудникам, у которых даты начала или окончания рабочих лет имеют разные дни месяца:
ВЫБРАТЬ
Т.Сотрудник.Код КАК ТабНомер,
Т.Сотрудник КАК Сотрудник,
Т.ВидЕжегодногоОтпуска КАК ВидЕжегодногоОтпуска,
КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ДЕНЬ(ЕСТЬNULL(Т.ДатаНачала, &ТекДата))) КАК ДЕНЬНАЧ,
КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ДЕНЬ(ЕСТЬNULL(Т.ДатаОкончания, &ТекДата))) КАК ДЕНЬОК
ИЗ
РегистрСведений.ЗаработанныеПраваНаОтпуска КАК Т
ГДЕ
НЕ Т.Сотрудник В (
ВЫБРАТЬ ВлЗап.Сотрудник
ИЗ РегистрСведений.СостоянияСотрудников.СрезПоследних(&ТекДата, Состояние = ЗНАЧЕНИЕ(Перечисление.СостоянияСотрудника.Увольнение)) КАК ВлЗап
)
СГРУППИРОВАТЬ ПО
Т.Сотрудник,
Т.ВидЕжегодногоОтпуска,
Т.Сотрудник.Код
ИМЕЮЩИЕ
(КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ДЕНЬ(ЕСТЬNULL(Т.ДатаНачала, &ТекДата))) > 1
ИЛИ КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ДЕНЬ(ЕСТЬNULL(Т.ДатаОкончания, &ТекДата))) > 1)
УПОРЯДОЧИТЬ ПО
Т.Сотрудник.Наименование
Этот запрос покажет сотрудников, у которых в истории прав на отпуск встречаются разные числа месяца в датах периодов. Если у сотрудника не было периодов, прерывающих стаж (например, отпусков без сохранения оплаты более 14 дней в году), то число месяца всегда должно быть одинаковым.
Выясним, как правильно вводить данные, чтобы исключить сдвиги. Ошибка часто возникает, когда остатки вводятся документом Начальная штатная расстановка на общую дату для всей организации.
Рассмотрим правильный алгоритм действий:
Начальную штатную расстановку, лучше очистить в ней раздел с отпусками и создать отдельный документ Ввод остатков отпусков.Разберем по шагам, как скорректировать данные для «проблемного» сотрудника:
Ввод остатков отпусков устанавливаем Дата остатка = 29.01.2018 (это дата приема минус один день в годовом цикле).Проанализируем еще один нюанс — дробные значения дней (например, 11.67 или 2.33). В ЗУП 2.5 такие остатки были нормой. В ЗУП 3.1 алгоритм пытается сопоставить эти цифры со стажем в месяцах. Поскольку 2.33 дня — это ровно 1 месяц работы (при норме 28 дней), любое минимальное отклонение (например, 2.34 дня) заставляет систему думать, что сотрудник отработал 1 месяц и еще несколько дней. В результате программа «подвинет» дату окончания периода, чтобы математически оправдать эти лишние сотые доли дня.
Совет: При вводе остатков на дату окончания рабочего года старайтесь использовать целые числа дней, если это возможно, или значения, строго кратные ежемесячному накоплению (2.33, 4.67 и т.д.), чтобы не провоцировать систему на корректировку границ периодов.
Таким образом, соблюдение принципа соответствия даты остатка и фактического рабочего цикла сотрудника позволяет полностью устранить проблему «плывущих» дат и обеспечить корректный расчет прав на отпуск в 1С:ЗУП 3.1.