Почему не формируются движения в регистре «Фактические отпуска организаций» при проведении начисления отпуска в ЗУП 2.5

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

При работе с конфигурацией «Зарплата и Управление Персоналом», редакция 2.5, программисты часто сталкиваются с ситуацией, когда документ НачислениеОтпускаРаботникамОрганизаций проводится без ошибок, но при анализе движений через отладчик или в интерфейсе регистра накопления ФактическиеОтпускаОрганизаций записи отсутствуют. Проанализируем причины такого поведения системы и разберем алгоритмы, отвечающие за списание остатков отпусков.

Причина 1: Настройка параметров кадрового учета

Первым делом нам необходимо проверить ключевую настройку системы, которая определяет «ведущий» документ для учета остатков отпусков. В ЗУП 2.5 реализована гибкая логика: остатки может уменьшать либо кадровик (документом ОтпускаОрганизаций), либо расчетчик (документом НачислениеОтпускаРаботникамОрганизаций).

Рассмотрим, как найти эту настройку:

  1. Перейдем в меню «Сервис» — «Параметры учета».
  2. Откроем вкладку «Кадровый учет».
  3. Найдем флаг «Остатки отпусков уменьшаются при проведении кадровых документов».

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

Если флаг снят, то кадровые документы становятся чисто информативными (для печати приказов), а фактическое списание остатков происходит в момент расчета отпуска. В этом случае движения должен формировать именно расчетный документ.

Причина 2: Специфика формирования движений в коде (Общие модули)

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

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

Пример типичной логики вызова в модуле объекта документа:


// В процедуре ОбработкаПроведения может вызываться общий метод
ПроцедурыУправленияПерсоналом.СформироватьДвиженияПоФактическимОтпускам(Ссылка, СтруктураШапкиДокумента, ТаблицаПолучОтпусков);

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

Причина 3: Технические особенности отладки и записи наборов

Разберем ситуацию, на которую указывают опытные разработчики: в конце процедуры проведения в отладчике коллекция Движения.ФактическиеОтпускаОрганизаций выглядит пустой, хотя записи в базе после завершения транзакции появляются. Это происходит из-за использования метода Записать() для набора записей внутри кода.

Проанализируем пример кода, который может «обмануть» отладчик:


НаборЗаписей = РегистрыНакопления.ФактическиеОтпускаОрганизаций.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Регистратор.Установить(Ссылка);

// Заполнение набора данными из табличной части
НоваяЗапись = НаборЗаписей.Добавить();
НоваяЗапись.Сотрудник = СтрокаТЧ.Сотрудник;
НоваяЗапись.ВидЕжегодногоОтпуска = СтрокаТЧ.ВидОтпуска;
НоваяЗапись.Количество = СтрокаТЧ.КоличествоДней;
НоваяЗапись.Период = Дата;

// Важный момент: явная запись набора в базу данных
НаборЗаписей.Записать(Истина);

Если в коде используется такой подход, данные записываются напрямую в таблицу базы данных (в рамках текущей транзакции). Однако коллекция Движения, которая принадлежит объекту документа и которую вы просматриваете в отладчике через ЭтотОбъект.Движения, может оставаться пустой или несинхронизированной. В 1С v8 данные в коллекции Движения и фактические записи в БД — это не всегда одно и то же до момента завершения транзакции.

Причина 4: Использование обработки «Остатки отпусков» для диагностики

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

Выполним следующие шаги:

  1. Откроем интерфейс «Кадровый учет».
  2. Перейдем в меню «Кадровый учет» — «Учет отпусков» — «Остатки отпусков».
  3. Выберем интересующего сотрудника.
  4. Нажмем кнопку «Редактировать остатки отпуска» или сформируем справку по отпуску.

Этот инструмент наглядно показывает, какие записи по регистру ФактическиеОтпускаОрганизаций видит система и какими документами-регистраторами они были сделаны. Если в списке фигурируют только кадровые приказы, значит, ваша информационная база настроена на кадровое списание (см. Причину 1).

Рекомендации по поиску кода проведения

Если вам все же необходимо найти точное место в коде, где формируются записи, выполните следующие действия:

  1. Откройте конфигуратор и найдите регистр накопления ФактическиеОтпускаОрганизаций.
  2. Нажмите правую кнопку мыши на имени регистра и выберите пункт «Поиск ссылок в объектах».
  3. В списке найденных ссылок ищите модули, связанные с документом НачислениеОтпускаРаботникамОрганизаций или общие модули, в названии которых есть слова УправлениеПерсоналом, Проведение или Заполнение.
  4. Установите точку останова в найденных процедурах и обратите внимание на условия Если, которые проверяют константы настроек учета. Скорее всего, код формирования движений просто обходится стороной из-за установленного флага в параметрах учета.

Таким образом, отсутствие движений в расчетном документе чаще всего является не ошибкой, а следствием настройки бизнес-логики программы, где приоритет в списании дней отдан кадровой службе.

← На главную