При ведении управленческого учета в конфигурации 1С:Управление производственным предприятием 1.3 (УПП) пользователи часто сталкиваются с неочевидным поведением механизмов расчета остатков отпусков. Типичный сценарий: сотрудник увольняется, через некоторое время снова принимается на работу, но при попытке получить актуальные данные по остаткам отпусков прошлых лет программа его «не видит» или выдает пустые значения.
В этой статье мы подробно разберем, почему возникает эта проблема, проанализируем логику работы программного кода конфигурации и рассмотрим практические шаги по ее устранению.
Прежде чем переходить к программному коду, давайте вспомним базовые правила кадрового учета. Когда сотрудник увольняется, работодатель обязан выплатить ему денежную компенсацию за все неиспользованные дни отпуска. С этого момента все накопленные ранее дни отпуска аннулируются. Предыдущий рабочий год (или несколько лет) закрывается.
Когда это же физическое лицо принимается на работу повторно (даже если перерыв составил всего несколько дней или месяцев), для системы это абсолютно новый рабочий период. Накапливать дни отпуска сотрудник начинает заново с даты нового приема на работу. Никаких «остатков прошлых лет» от предыдущего периода работы у него физически остаться не может.
Тем не менее, в процессе работы у пользователя возникает необходимость видеть этого сотрудника в специализированных формах и отчетах по остаткам отпусков управленческого учета. Давайте разберемся, почему он там исчезает.
Рассмотрим ситуацию, описанную разработчиком при отладке запросов. При формировании остатков система последовательно выполняет несколько процедур сбора данных:
ПодготовитьТаблицуПериодов — здесь сотрудник присутствует, так как система находит его кадровые документы приема.ПолучитьДополнениеОстатков — в ее конечном результате поля Ссылка и ДатаОстатков для нашего физлица оказываются пустыми (NULL).ПодготовитьТаблицуАктуальныхОстатков физлицо полностью исчезает из результирующего набора данных.Выясним причину такого поведения. Для хранения сведений о стартовых остатках отпусков в управленческом учете УПП 1.3 используется справочник «Остатки отпусков прошлых лет» (для регламентированного учета используется аналогичный справочник «Остатки отпусков организаций прошлых лет»).
Этот справочник не заполняется системой автоматически при проведении документа приема на работу. Вся информация в него вносится либо вручную пользователем, либо специализированными обработками переноса данных.
В коде процедуры ПолучитьДополнениеОстатков() выполняется левое соединение кадровых данных физических лиц со справочником остатков отпусков прошлых лет. Пример упрощенного алгоритма этого соединения выглядит следующим образом:
ВЫБРАТЬ
ТаблицаПериодов.ФизЛицо КАК ФизЛицо,
ОстаткиОтпусков.Ссылка КАК Ссылка,
ОстаткиОтпусков.ДатаОстатков КАК ДатаОстатков,
ТаблицаПериодов.ДатаПриема КАК ДатаПриемаНаРаботу
ИЗ
ТаблицаПериодов КАК ТаблицаПериодов
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ОстаткиОтпусковПрошлыхЛет КАК ОстаткиОтпусков
ПО ТаблицаПериодов.ФизЛицо = ОстаткиОтпусков.Физлицо
Поскольку по новому рабочему периоду сотрудника запись в справочнике «Остатки отпусков прошлых лет» еще не создана, поля Ссылка и ДатаОстатков принимают значение НЕОПРЕДЕЛЕНО или NULL.
Далее, в процедуре ПодготовитьТаблицуАктуальныхОстатков при наложении фильтров или при соединении с другими таблицами (где критично наличие непустой даты остатков), строки с пустыми ссылками просто исключаются из финальной выборки. Система считает, что по данному сотруднику нет зарегистрированных начальных точек отсчета.
Иногда пользователи пытаются «очистить» историю сотрудника, помечая на удаление документы предоставления ежегодного отпуска за новый рабочий период, надеясь, что программа пересчитает данные и выведет сотрудника в список. Однако это не помогает.
Интерфейсное окно «Остатки отпусков» в управленческом учете (меню Кадровый учет -> Учет невыходов -> Остатки отпусков) представляет собой форму списка справочника «Остатки отпусков прошлых лет». Она отображает только те элементы, которые физически записаны в этот справочник. Если записи для конкретного сотрудника по новому трудовому договору там нет — он никогда не появится в этом списке, сколько бы документов отпуска вы ни удаляли или проводили.
Для того чтобы исправить ситуацию и вернуть сотрудника в контур расчета остатков управленческих отпусков, выполним следующие шаги.
Нам необходимо создать для физического лица опорную точку отсчета в справочнике остатков отпусков прошлых лет:
После этого у физлица появится заполненный реквизит Ссылка и актуальная ДатаОстатков. При очередном запуске процедур расчета остатков запросы отработают корректно и не будут исключать сотрудника из выборки.
Поскольку речь идет об управленческом учете, расчет периодов и остатков опирается исключительно на управленческие кадровые документы. Проверим, все ли документы оформлены верно:
ФактическиеОтпуска. Убедимся, что документы отпусков делают движения по этому регистру.Если вы не хотите вручную плодить пулевые записи в справочнике «Остатки отпусков прошлых лет», вы можете контролировать баланс дней отпуска сотрудника с помощью стандартных отчетов.
Для этого откройте карточку физического лица и сформируйте отчет «Справка по отпуску». Этот инструмент рассчитывает остатки динамически «на лету». Он берет дату приема из кадрового приказа, отсчитывает рабочие года и вычитает из них дни по проведенным документам отпусков, зарегистрированным в регистре ФактическиеОтпуска. Данный отчет будет работать корректно даже при отсутствии физической записи в справочнике остатков прошлых лет.