Как программно заполнить начисления в документе «Кадровый перевод» в 1С:ЗУП 8.3?

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

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

Метод 1: Использование стандартной обработки заполнения

Самый простой и надежный способ — использовать встроенный механизм ОбработкаЗаполнения, который заложен в модуле объекта документа. Этот метод имитирует выбор сотрудника пользователем в интерфейсе. Рассмотрим, как это реализовать правильно. Чтобы система подтянула актуальные данные, нам необходимо предварительно установить дату документа и сотрудника.

Проанализируем пример кода для реализации этого подхода:


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

// Важный нюанс: вызываем заполнение на основании сотрудника
НовыйДокумент.Заполнить(СсылкаНаСотрудника);

// После этого табличные части Начисления и Показатели должны заполниться автоматически
НовыйДокумент.Записать(РежимЗаписиДокумента.Запись);

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

Почему таблица начислений может быть пустой или содержать нули?

Выясним причину, по которой прямое чтение регистров (например, ПлановыеНачисления) часто выдает нулевые суммы. В архитектуре ЗУП 3.1 данные разделены на две составляющие:

  1. Вид начисления: хранится в регистре ПлановыеНачисления. Он определяет, что именно начисляется сотруднику (Оклад, Надбавка и т.д.).
  2. Денежные показатели: суммы (размеры оклада, проценты) хранятся в регистре ЗначенияПериодическихПоказателейРасчетаЗарплатыСотрудников.

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

Метод 2: Использование программного интерфейса общих модулей

Если метод Заполнить() вам не подходит (например, при сложной логике трансформации данных), рассмотрим использование функций из общих модулей. Посмотрим на функцию ЗарплатаКадрыРасширенный.ДействующиеНачисленияСотрудников. Она возвращает структуру с данными о начислениях на определенную дату.

Однако для прямого заполнения документа лучше использовать процедуры из модуля ЗарплатаКадрыСоставДокументов. Разберем по шагам алгоритм использования специализированных процедур:

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

Пример кода с использованием типовых механизмов:


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

// Заполняем таблицы Начисления и Показатели
ЗарплатаКадрыСоставДокументов.ЗаполнитьНачисленияПоСотруднику(ОбъектДокумента, ПараметрыЗаполнения);

// Не забываем обновить ФОТ и совокупную ставку, чтобы документ был корректным
ЗарплатаКадрыСоставДокументов.ОбновитьПоказателиСовокупнойТарифнойСтавкиОбъекта(ОбъектДокумента);

Проблема использования экранных форм на сервере

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

Рекомендация: избегайте копирования кода из процедур типа ПриИзмененииСотрудникаНаКлиенте. Всегда ищите аналогичные методы в модулях с суффиксом ...СоставДокументов или ...Пересчет, которые работают напрямую с ОбъектДокумента без привязки к контексту формы.

Работа с интервальными регистрами

Для получения информации о текущих начислениях «вручную» рекомендуется использовать РегистрСведений.ПлановыеНачисленияИнтервальный. ЗУП редко отдает корректные данные простыми запросами, поэтому разработчики часто используют универсальные отчеты, учитывающие сложную бизнес-логику. Рассмотрим пример запроса, который можно отладить, используя консоль запросов ЗУП с поддержкой программного интерфейса:


Запрос = Новый Запрос;
Запрос.Текст = 
"ВЫБРАТЬ
|	ПлановыеНачисления.Начисление,
|	ПлановыеНачисления.ДокументОснование,
|	ПлановыеНачисления.ДатаОкончания
|ИЗ
|	РегистрСведений.ПлановыеНачисленияИнтервальный КАК ПлановыеНачисления
|ГДЕ
|	ПлановыеНачисления.Сотрудник = &Сотрудник
|	И &ДатаСреза МЕЖДУ ПлановыеНачисления.ДатаНачала И ПлановыеНачисления.ДатаОкончания";

Запрос.УстановитьПараметр("Сотрудник", ВыбранныйСотрудник);
Запрос.УстановитьПараметр("ДатаСреза", ДатаПеревода);
Результат = Запрос.Выполнить().Выгрузить();

Подведем итог: для успешного программного заполнения кадрового перевода необходимо обеспечить синхронное заполнение двух таблиц — Начисления и Показатели. Использование метода Объект.Заполнить(Сотрудник) является наиболее предпочтительным, так как он автоматически учитывает все нюансы типовой конфигурации и гарантирует корректный расчет ФОТ.

← На главную