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

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

При переходе на конфигурацию 1С:Зарплата и управление персоналом 3.1 (ЗУП 3.1) из более старых систем (например, ЗУП 2.5) разработчики и кадровые специалисты часто сталкиваются со странным поведением программы. Личная карточка сотрудника по форме Т-2 (Раздел VIII) формируется абсолютно корректно и содержит всю историю отпусков начиная с даты приема (например, с 2012 года). При этом специализированные отчеты по остаткам отпусков или кастомные программные выборки упрямо отказываются «видеть» исторические рабочие периоды, начиная отсчет только с момента ввода начальных остатков.

В рамках этой статьи мы подробно разберем, почему возникает такое расхождение, проанализируем внутреннее устройство регистров ЗУП 3.1, изучим работу программного интерфейса общего модуля и рассмотрим эффективные варианты решения этой проблемы.

Выясняем причину: разница механизмов карточки Т-2 и расчета остатков

Для того чтобы понять суть проблемы, нам необходимо заглянуть «под капот» системы и проанализировать, откуда именно алгоритмы 1С:ЗУП 3.1 получают информацию. Оказывается, для вывода данных в Т-2 и для расчета остатков отпусков используются принципиально разные источники данных.

Рассмотрим эти источники подробнее:

  1. Источник данных для карточки Т-2 (Раздел VIII «Отпуск»):

    Программа обращается к периодическому регистру сведений Реестр отпусков (в более ранних релизах ЗУП 3 — Периоды отпусков). При осуществлении переноса данных из старой базы (даже в режиме «краткого» или рекомендованного переноса) в этот регистр переносится вся детальная текстовая и хронологическая информация о фактически использованных сотрудником отпусках за весь период его работы. Это сделано специально для того, чтобы регламентированная форма Т-2 могла быть распечатана со всей историей кадровых событий.

  2. Источник данных для расчета остатков отпусков:

    Механизм расчета остатков работает динамически и опирается на балансовый метод. Он использует три ключевых регистра:

    • Регистр накопления Фактические отпуска (в нем отражаются реальные списания дней отпуска кадровыми документами).
    • Регистр сведений Начальные остатки отпусков (данные, которые вносятся документами «Ввод остатков отпусков» или «Начальная штатная расстановка»).
    • Регистр сведений Положенные виды ежегодных отпусков (права сотрудников на определенное количество дней отпуска).

При выполнении стандартного (рекомендованного) переноса данных детальная история начислений и списаний отпусков за прошлые годы в регистр накопления Фактические отпуска не переносится. Программа фиксирует лишь «точку старта» — остаток неиспользованных дней на дату начала эксплуатации новой базы (например, на 01.01.2018) с помощью документа ввода остатков.

С точки зрения математического движка расчета остатков, история работы сотрудника «начинается заново» с этой начальной даты. Программа не рассчитывает и не хранит рабочие годы за периоды до ввода остатков, поскольку считает, что на эту дату все права и списания уже взаимно погашены («схлопнуты») и зафиксированы в начальном балансе.

Программный интерфейс модуля «ОстаткиОтпусков»

Если перед вами стоит задача разработать кастомный отчет или получить остатки отпусков сотрудников программным путем, крайне не рекомендуется писать собственные сложные запросы к регистрам. В ЗУП 3.1 реализован мощный программный интерфейс. Все вычисления инкапсулированы в общем модуле ОстаткиОтпусков.

Проанализируем пример кода, с помощью которого можно быстро и корректно получить таблицу остатков отпусков на определенную дату:


// Инициализируем структуру параметров для расчета
СтруктураПараметров = ОстаткиОтпусков.ОписаниеПараметровДляОстаткиОтпусков();

// Заполняем параметры необходимыми данными
СтруктураПараметров.Сотрудники     = Сотрудники; // Массив или СписокЗначений с сотрудниками
СтруктураПараметров.ДатаОстатков = НачалоДня(ДатаОстатков); // Дата, на которую рассчитываем остаток
СтруктураПараметров.ВидыОтпусков = ВидыОтпусков; // Ссылка или массив видов отпусков (например, Основной)

// Вызываем основной расчетный метод модуля
Результат = ОстаткиОтпусков.ОстаткиОтпусков(СтруктураПараметров);

// Декодируем и раскладываем полученную таблицу для дальнейшего вывода в отчет
СтруктураОстатковОтпусков = РазложитьТаблицуОстатковОтпусков(Результат);

Посмотрим, что происходит внутри этого алгоритма. Метод ОстаткиОтпусков.ОстаткиОтпусков() возвращает таблицу значений. Однако рабочие периоды (колонки РабочийГодНачало и РабочийГодОкончание) в этой таблице будут рассчитаны только начиная с даты последнего закрытого периода, указанного в документах ввода начальных остатков. Вся предыстория с 2012 года в этот расчет не попадет, так как в регистре накопления Фактические отпуска за те периоды физически отсутствуют записи движений.

Варианты решения проблемы для разработчика и кадровика

В зависимости от того, какая конечная цель стоит перед вами, выберите один из следующих вариантов решения проблемы.

Вариант А. Создание кастомного отчета на основе регистра «Реестр отпусков»

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

Разберем этот подход по шагам:

  1. Спроектируйте запрос напрямую к регистру сведений Реестр отпусков.
  2. Свяжите данные регистра со справочником Сотрудники и физическими лицами для получения кадровых данных.
  3. Сгруппируйте данные по рабочим годам, которые хранятся непосредственно в записях этого регистра.

Преимущества: Отчет покажет абсолютно достоверную историческую картину, которая будет на 100% совпадать с печатной формой карточки Т-2.

Недостатки: Из этого регистра невозможно получить актуальный математический остаток отпуска «на текущий день», так как он хранит только свершившиеся факты отпусков, но не хранит информацию о правах на отпуск и накоплении дней.

Вариант Б. Корректировка документов ввода начальных остатков

Часто при автоматическом переносе данных рабочие годы в документах Начальная штатная расстановка или Ввод остатков отпусков заполняются некорректно (с разрывами, наложениями периодов или без учета реального стажа сотрудников).

Чтобы исправить это административным путем, выполним следующие действия:

  1. Перейдем в раздел «Главное» и откроем документы «Данные на начало эксплуатации» (или найдем документы Ввод начальных остатков отпусков через все функции).
  2. Откроем документ по конкретному сотруднику и перейдем на вкладку «Отпуска».
  3. Внимательно проанализируем таблицу остатков. Каждая строка должна представлять собой конкретный рабочий год сотрудника, за который у него остались неиспользованные дни (или, наоборот, образовался перерасход).
  4. Убедимся, что рабочий год, за который вводятся остатки, является непрерывным продолжением реального стажа сотрудника. Если ввести остатки детализированно по годам (например, отдельно строку за период с 2012 по 2013 год, отдельно за 2013-2014 и т.д.), то программные механизмы расчета остатков автоматически увидят эти исторические периоды и начнут выводить их в отчеты.

Преимущества: Данные в базе становятся чистыми и методически верными. Программные методы расчета остатков начинают работать без дополнительных доработок кода.

Недостатки: Требует кропотливой ручной работы кадровой службы, особенно если штат предприятия велик.

Вариант В. Восстановление детальной истории через «Перенос данных»

Некоторые разработчики пытаются решить проблему радикально — программно перенести все документы списания отпусков из старой базы 1С:ЗУП 2.5 в регистр накопления Фактические отпуска за все прошлые годы (начиная с 2012 года) через технический документ Перенос данных.

Мы настоятельно не рекомендуем этот вариант! Рассмотрим, почему этот путь опасен:

Резюме

Для того чтобы решить проблему отображения периодов отпусков до переноса данных, всегда четко разделяйте цели. Если вам нужен исторический архив — стройте отчет по регистру Реестр отпусков. Если вам нужны математически точные остатки для оперативной работы — тщательно выверяйте и детализируйте документы ввода начальных остатков по рабочим годам сотрудников.

← На главную