При внедрении подсистемы кадрового учета в конфигурации 1С:Зарплата и Управление Персоналом (ЗУП 3) пользователи часто сталкиваются с ситуацией, когда документ «Отпуск» проводится кадровой службой, но не делает движений по регистру накопления «Фактические отпуска». В результате дни отпуска не списываются из остатков, хотя документ зафиксирован в системе. Проанализируем причину такого поведения и рассмотрим возможные варианты решения данной проблемы.
Выясним, как работает алгоритм проведения документа «Отпуск» в 1С:ЗУП 3. В конфигурации реализовано разделение труда между кадровой и расчетной службой. Кадровик регистрирует факт отсутствия сотрудника, а расчетчик выполняет расчет денежных сумм.
Однако на уровне программного кода проведения документа существует четкая привязка движений по регистру «Фактические отпуска» к табличной части Начисления. Если начисления в документе не рассчитаны и таблица остаётся пустой, процедура проведения пропускает формирование записей по остаткам отпусков.
Рассмотрим фрагмент кода из модуля документа, который отвечает за обход таблицы начислений при формировании движений:
Для Каждого СтрокаДанных Из Начисления Цикл
Если Не ЗначениеЗаполнено(СтрокаДанных.ВидЕжегодногоОтпуска) Тогда
Продолжить;
КонецЕсли;
Если НЕ СтрокаДанных.ИспользованиеПериода = ПредопределенноеЗначение("Перечисление.ВариантыИспользованияПериодаНачисления.НеИспользовать") Тогда
Продолжить;
КонецЕсли;
Если ДатыНачалаКомпенсаций.Получить(СтрокаДанных.Сотрудник) <> Неопределено Тогда
Продолжить;
КонецЕсли;
ДатыНачалаКомпенсаций.Вставить(СтрокаДанных.Сотрудник, СтрокаДанных.ДатаОкончания);
КонецЦикла;
Из приведенного алгоритма видно: если табличная часть Начисления пуста, то цикл не выполняет ни одной итерации. Программная установка признака Расчет утвердил сама по себе без строк начислений не приводит к формированию записей в регистре накопления ФактическиеОтпуска.
Разберем по шагам несколько способов решения возникшей задачи в зависимости от используемой схемы работы в вашей организации.
Если в вашей организации внедрен только кадровый учет или кадровики вносят документы до работы расчетчика, можно включить штатный механизм предварительного расчета:
При включении этой настройки система при проведении документа кадровиком автоматически выполняет фоновый расчет начислений. Кадровый специалист при этом не видит сумм расчета из-за ограничений прав доступа, но табличная часть Начисления заполняется технически, что позволяет документу сразу сформировать необходимые движения по регистру Фактические отпуска.
Если расчет зарплаты ведется в полном объеме, следует соблюдать стандартный порядок работы:
При попытке автоматизировать заполнение и проведение документов через внешние обработки разработчики иногда пытаются вызвать процедуру расчета из модуля формы документа. Проанализируем, почему этот подход ошибочен и как его правильно исправить.
Пример попытки вызова экспортной процедуры формы:
#Если ТолстыйКлиентУправляемоеПриложение Тогда
&НаКлиенте
Процедура ОбработатьОтпускаНаКлиенте()
ОтпускОб = Документы.Отпуск.НайтиПоНомеру("0000-000009", Дата(2017,01,30)).ПолучитьОбъект();
ФормаОб = ОтпускОб.ПолучитьФорму("ФормаДокумента");
ФормаОб.РассчитатьНачисления("");
КонецПроцедура
#КонецЕсли
В архитектуре управляемого приложения 1С вызывать контекстные методы формы (такие как РассчитатьНачисления) напрямую из внешних обработок на сервере или в регламентных заданиях нельзя. Бизнес-логику пересчета начислений и проведения документа необходимо выполнять на стороне сервера с использованием методов модуля объекта или специализированных общих модулей, передавая ссылку на документ или объект, а не манипулируя пользовательским интерфейсом формы.
Если подсистема расчета зарплаты вовсе не используется и вносить начисления не планируется, списывать остатки отпусков можно следующими альтернативными способами:
Фактические отпуска.