При переходе на конфигурацию 1С:Зарплата и управление персоналом 3.1 (ЗУП 3.1) из более старых систем (например, ЗУП 2.5) разработчики и кадровые специалисты часто сталкиваются со странным поведением программы. Личная карточка сотрудника по форме Т-2 (Раздел VIII) формируется абсолютно корректно и содержит всю историю отпусков начиная с даты приема (например, с 2012 года). При этом специализированные отчеты по остаткам отпусков или кастомные программные выборки упрямо отказываются «видеть» исторические рабочие периоды, начиная отсчет только с момента ввода начальных остатков.
В рамках этой статьи мы подробно разберем, почему возникает такое расхождение, проанализируем внутреннее устройство регистров ЗУП 3.1, изучим работу программного интерфейса общего модуля и рассмотрим эффективные варианты решения этой проблемы.
Для того чтобы понять суть проблемы, нам необходимо заглянуть «под капот» системы и проанализировать, откуда именно алгоритмы 1С:ЗУП 3.1 получают информацию. Оказывается, для вывода данных в Т-2 и для расчета остатков отпусков используются принципиально разные источники данных.
Рассмотрим эти источники подробнее:
Программа обращается к периодическому регистру сведений Реестр отпусков (в более ранних релизах ЗУП 3 — Периоды отпусков). При осуществлении переноса данных из старой базы (даже в режиме «краткого» или рекомендованного переноса) в этот регистр переносится вся детальная текстовая и хронологическая информация о фактически использованных сотрудником отпусках за весь период его работы. Это сделано специально для того, чтобы регламентированная форма Т-2 могла быть распечатана со всей историей кадровых событий.
Механизм расчета остатков работает динамически и опирается на балансовый метод. Он использует три ключевых регистра:
Фактические отпуска (в нем отражаются реальные списания дней отпуска кадровыми документами).Начальные остатки отпусков (данные, которые вносятся документами «Ввод остатков отпусков» или «Начальная штатная расстановка»).Положенные виды ежегодных отпусков (права сотрудников на определенное количество дней отпуска).При выполнении стандартного (рекомендованного) переноса данных детальная история начислений и списаний отпусков за прошлые годы в регистр накопления Фактические отпуска не переносится. Программа фиксирует лишь «точку старта» — остаток неиспользованных дней на дату начала эксплуатации новой базы (например, на 01.01.2018) с помощью документа ввода остатков.
С точки зрения математического движка расчета остатков, история работы сотрудника «начинается заново» с этой начальной даты. Программа не рассчитывает и не хранит рабочие годы за периоды до ввода остатков, поскольку считает, что на эту дату все права и списания уже взаимно погашены («схлопнуты») и зафиксированы в начальном балансе.
Если перед вами стоит задача разработать кастомный отчет или получить остатки отпусков сотрудников программным путем, крайне не рекомендуется писать собственные сложные запросы к регистрам. В ЗУП 3.1 реализован мощный программный интерфейс. Все вычисления инкапсулированы в общем модуле ОстаткиОтпусков.
Проанализируем пример кода, с помощью которого можно быстро и корректно получить таблицу остатков отпусков на определенную дату:
// Инициализируем структуру параметров для расчета
СтруктураПараметров = ОстаткиОтпусков.ОписаниеПараметровДляОстаткиОтпусков();
// Заполняем параметры необходимыми данными
СтруктураПараметров.Сотрудники = Сотрудники; // Массив или СписокЗначений с сотрудниками
СтруктураПараметров.ДатаОстатков = НачалоДня(ДатаОстатков); // Дата, на которую рассчитываем остаток
СтруктураПараметров.ВидыОтпусков = ВидыОтпусков; // Ссылка или массив видов отпусков (например, Основной)
// Вызываем основной расчетный метод модуля
Результат = ОстаткиОтпусков.ОстаткиОтпусков(СтруктураПараметров);
// Декодируем и раскладываем полученную таблицу для дальнейшего вывода в отчет
СтруктураОстатковОтпусков = РазложитьТаблицуОстатковОтпусков(Результат);
Посмотрим, что происходит внутри этого алгоритма. Метод ОстаткиОтпусков.ОстаткиОтпусков() возвращает таблицу значений. Однако рабочие периоды (колонки РабочийГодНачало и РабочийГодОкончание) в этой таблице будут рассчитаны только начиная с даты последнего закрытого периода, указанного в документах ввода начальных остатков. Вся предыстория с 2012 года в этот расчет не попадет, так как в регистре накопления Фактические отпуска за те периоды физически отсутствуют записи движений.
В зависимости от того, какая конечная цель стоит перед вами, выберите один из следующих вариантов решения проблемы.
Если вам требуется отчет, который должен носить исключительно справочно-информационный характер (например, показать руководителю или кадровику детальную историю: в какие именно рабочие годы с 2012 года сотрудник реально ходил в отпуска), строить схему компоновки данных (СКД) нужно в обход механизма расчета остатков.
Разберем этот подход по шагам:
Реестр отпусков.Сотрудники и физическими лицами для получения кадровых данных.Преимущества: Отчет покажет абсолютно достоверную историческую картину, которая будет на 100% совпадать с печатной формой карточки Т-2.
Недостатки: Из этого регистра невозможно получить актуальный математический остаток отпуска «на текущий день», так как он хранит только свершившиеся факты отпусков, но не хранит информацию о правах на отпуск и накоплении дней.
Часто при автоматическом переносе данных рабочие годы в документах Начальная штатная расстановка или Ввод остатков отпусков заполняются некорректно (с разрывами, наложениями периодов или без учета реального стажа сотрудников).
Чтобы исправить это административным путем, выполним следующие действия:
Ввод начальных остатков отпусков через все функции).Преимущества: Данные в базе становятся чистыми и методически верными. Программные методы расчета остатков начинают работать без дополнительных доработок кода.
Недостатки: Требует кропотливой ручной работы кадровой службы, особенно если штат предприятия велик.
Некоторые разработчики пытаются решить проблему радикально — программно перенести все документы списания отпусков из старой базы 1С:ЗУП 2.5 в регистр накопления Фактические отпуска за все прошлые годы (начиная с 2012 года) через технический документ Перенос данных.
Мы настоятельно не рекомендуем этот вариант! Рассмотрим, почему этот путь опасен:
Для того чтобы решить проблему отображения периодов отпусков до переноса данных, всегда четко разделяйте цели. Если вам нужен исторический архив — стройте отчет по регистру Реестр отпусков. Если вам нужны математически точные остатки для оперативной работы — тщательно выверяйте и детализируйте документы ввода начальных остатков по рабочим годам сотрудников.