Почему документ «Отпуск» в 1С:ЗУП 3 не формирует движения по регистру «Фактические отпуска» и как это исправить?

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

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

Причина отсутствия движений по регистру «Фактические отпуска»

Выясним, как работает алгоритм проведения документа «Отпуск» в 1С:ЗУП 3. В конфигурации реализовано разделение труда между кадровой и расчетной службой. Кадровик регистрирует факт отсутствия сотрудника, а расчетчик выполняет расчет денежных сумм.

Однако на уровне программного кода проведения документа существует четкая привязка движений по регистру «Фактические отпуска» к табличной части Начисления. Если начисления в документе не рассчитаны и таблица остаётся пустой, процедура проведения пропускает формирование записей по остаткам отпусков.

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


Для Каждого СтрокаДанных Из Начисления Цикл
    Если Не ЗначениеЗаполнено(СтрокаДанных.ВидЕжегодногоОтпуска) Тогда
        Продолжить;
    КонецЕсли;
    Если НЕ СтрокаДанных.ИспользованиеПериода = ПредопределенноеЗначение("Перечисление.ВариантыИспользованияПериодаНачисления.НеИспользовать") Тогда
        Продолжить;
    КонецЕсли;
    Если ДатыНачалаКомпенсаций.Получить(СтрокаДанных.Сотрудник) <> Неопределено Тогда
        Продолжить;
    КонецЕсли;
    ДатыНачалаКомпенсаций.Вставить(СтрокаДанных.Сотрудник, СтрокаДанных.ДатаОкончания);
КонецЦикла;

Из приведенного алгоритма видно: если табличная часть Начисления пуста, то цикл не выполняет ни одной итерации. Программная установка признака Расчет утвердил сама по себе без строк начислений не приводит к формированию записей в регистре накопления ФактическиеОтпуска.

Варианты решения проблемы

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

1. Настройка предварительного расчета кадровыми документами

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

  1. Перейдем в раздел Настройка — Расчет зарплаты.
  2. Установим флажок Выполнять предварительный расчет документов.

При включении этой настройки система при проведении документа кадровиком автоматически выполняет фоновый расчет начислений. Кадровый специалист при этом не видит сумм расчета из-за ограничений прав доступа, но табличная часть Начисления заполняется технически, что позволяет документу сразу сформировать необходимые движения по регистру Фактические отпуска.

2. Соблюдение стандартного двухэтапного регламента

Если расчет зарплаты ведется в полном объеме, следует соблюдать стандартный порядок работы:

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

3. Пакетная обработка документов и нюансы вызова процедур формы

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

Пример попытки вызова экспортной процедуры формы:


#Если ТолстыйКлиентУправляемоеПриложение Тогда
&НаКлиенте
Процедура ОбработатьОтпускаНаКлиенте()
    ОтпускОб = Документы.Отпуск.НайтиПоНомеру("0000-000009", Дата(2017,01,30)).ПолучитьОбъект();
    ФормаОб = ОтпускОб.ПолучитьФорму("ФормаДокумента");
    ФормаОб.РассчитатьНачисления("");
КонецПроцедура
#КонецЕсли

В архитектуре управляемого приложения 1С вызывать контекстные методы формы (такие как РассчитатьНачисления) напрямую из внешних обработок на сервере или в регламентных заданиях нельзя. Бизнес-логику пересчета начислений и проведения документа необходимо выполнять на стороне сервера с использованием методов модуля объекта или специализированных общих модулей, передавая ссылку на документ или объект, а не манипулируя пользовательским интерфейсом формы.

4. Ввод данных без блока расчета зарплаты

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

  1. Использовать документ Перенос данных для прямой записи данных о фактических отпусках в регистр накопления Фактические отпуска.
  2. Для неоплачиваемых отпусков использовать документ Отпуск без сохранения оплаты, который списывает дни из остатков без необходимости расчета среднего заработка и создания строк начислений.
← На главную