Как программно рассчитать документ «Прогул, неявка» в ЗУП 3.1 без открытия формы?

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

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

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

Почему обычное проведение не создает движений?

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

Если мы просто создаем объект в коде, эти таблицы остаются пустыми. Следовательно, при проведении системе «нечего» записывать в регистр расчета. Чтобы решить задачу, нам нужно программно инициировать процедуру расчета зарплаты для конкретного документа.

Способ 1. Использование универсального метода ЗаполнитьИРассчитать

Наиболее корректным способом в актуальных версиях ЗУП 3.1 является использование экспортных методов программного интерфейса подсистемы «Зарплата и Кадры». Рассмотрим алгоритм работы с модулем ЗарплатаКадрыСоставДокументов. Этот метод позволяет заполнить состав документа и рассчитать его показатели без привязки к форме.

Разберем пример кода для создания и расчета документа:


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

// Устанавливаем признаки, чтобы система понимала статус расчета
НовыйДокумент.Рассчитал = ПараметрыСеанса.ТекущийПользователь;
НовыйДокумент.ПерерасчетВыполнен = Истина;

// Вызываем процедуру автоматического заполнения и расчета
// Важно: Этот метод заполнит ТЧ "Начисления" и "Данные о времени"
ЗарплатаКадрыСоставДокументов.ЗаполнитьИРассчитать(НовыйДокумент);

// Теперь можно проводить
НовыйДокумент.Записать(РежимЗаписиДокумента.Проведение);

Способ 2. Использование специализированного модуля ПроведениеРасчета

Если универсальный метод по каким-то причинам не подходит или требуются дополнительные настройки, мы можем обратиться к низкоуровневым процедурам расчета. В ЗУП за это отвечает модуль ПроведениеРасчета. Выясним причину, почему это может понадобиться: например, если в вашей версии КОРП используются дополнительные аналитики (территории, условия труда), которые нужно передать в расчет.

Рассмотрим шаги реализации:

  1. Подготовим объект документа и заполним обязательные поля.
  2. Сформируем структуру дополнительных параметров расчета.
  3. Вызовем метод ПроведениеРасчета.Рассчитать(ДокументОбъект, ДополнительныеПараметры).

Пример реализации на сервере:


ДокОбъект = Документы.ПрогулНеявка.СоздатьДокумент();
// ... заполнение реквизитов ...

ПараметрыРасчета = Новый Структура;
ПараметрыРасчета.Вставить("ПересчитатьДокумент", Истина;
ПараметрыРасчета.Вставить("РассчитатьЗарплату", Истина);

// Инициализируем расчет расчетных механизмов
ПроведениеРасчета.Рассчитать(ДокОбъект, ПараметрыРасчета);

// Проверяем, заполнились ли ТЧ Начисления
Если ДокОбъект.Начисления.Количество() > 0 Тогда
    ДокОбъект.Записать(РежимЗаписиДокумента.Проведение);
КонецЕсли;

Способ 3. Имитация данных формы (Data Structure)

Этот метод часто упоминается опытными разработчиками (сообщение 4 форума). Он заключается в создании структуры, которая по составу полей полностью повторяет реквизиты формы. Многие типовые процедуры расчета принимают на вход не ДокументОбъект, а именно структуру или ДанныеФормыСтруктура.

Проанализируем ситуацию: если процедура в модуле менеджера или объекта требует контекста формы, мы можем создать структуру, заполнить её данными из нашего объекта, вызвать процедуру расчета, а затем с помощью метода Загрузить() вернуть рассчитанные строки обратно в ТЧ объекта.

Посмотрим на пример логики:

  1. Создаем структуру ПараметрыФормы, содержащую поля Объект (наш документ) и технические флаги.
  2. Вызываем серверную процедуру модуля менеджера (например, РассчитатьОбъект).
  3. После выполнения процедуры данные в ТЧ структуры будут обновлены.

Важные нюансы для версии КОРП

Проанализируем особенности версии КОРП, которые могут блокировать появление движений:

1. Настройки Вида Расчета: Проверьте, что используемый вид расчета (например, «Прогул») в своих настройках на вкладке «Налоги, взносы, бухучет» или «Основное» настроен так, чтобы фиксироваться в регистрах. Если это просто информационное отсутствие без регистрации времени в регистре расчета, то записей не будет по определению.

2. Режим учета времени: Если документ работает в режиме «только учет времени», он может не создавать записей в Основные начисления. Убедитесь, что программно заполнен ВидДохода и корректно указаны даты, попадающие в график работы сотрудника.

3. Графики работы: При программном расчете крайне важно, чтобы у сотрудника был назначен актуальный график. Механизм расчета вызывает функции получения нормы времени. Если график не найден, расчет вернет пустой результат, и ТЧ Начисления останется пустой.

Рекомендация по отладке

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

  1. Создайте аналогичный документ вручную в интерфейсе.
  2. Нажмите кнопку «Рассчитать» (если она есть) или добейтесь появления строк в ТЧ Начисления.
  3. Сравните через консоль запросов или обработку «Редактирование реквизитов» состав всех табличных частей ручного документа и вашего программного.
  4. Особое внимание уделите реквизиту ИдентификаторСтрокиВидаРасчета. Часто расчет не срабатывает, если связи между строками ТЧ нарушены или не проинициализированы.

Использование метода ЗарплатаКадрыСоставДокументов.ЗаполнитьИРассчитать() обычно снимает 90% проблем, так как он инкапсулирует в себе всю сложную логику ЗУП по инициализации расчетных механизмов. Это позволяет автоматизировать ввод неявок через внешние обработки или регламентные задания, сохраняя целостность данных в регистрах расчета.

← На главную