При автоматизации кадрового учета в 1С:Зарплата и управление персоналом 8.3 (редакция 3.1) разработчики часто сталкиваются с задачей программного создания документа КадровыйПеревод. Одной из самой трудоемких частей является корректное заполнение таблицы начислений. Простого добавления строк в табличную часть Начисления недостаточно, так как в ЗУП 3.1 суммы (показатели) хранятся отдельно, а расчет ФОТ требует вызова специализированных механизмов. Чтобы лучше ориентироваться в доступном инструментарии, полезно иметь под рукой справочник методов конфигурации Зарплата и кадры 3.1. В этой статье мы подробно разберем, как правильно получить текущие начисления сотрудника и загрузить их в документ.
Самый простой и надежный способ — использовать встроенный механизм ОбработкаЗаполнения, который заложен в модуле объекта документа. Этот метод имитирует выбор сотрудника пользователем в интерфейсе. Рассмотрим, как это реализовать правильно. Чтобы система подтянула актуальные данные, нам необходимо предварительно установить дату документа и сотрудника.
Проанализируем пример кода для реализации этого подхода:
НовыйДокумент = Документы.КадровыйПеревод.СоздатьДокумент();
НовыйДокумент.Дата = ТекущаяДата(); // Дата регистрации документа
НовыйДокумент.ДатаНачала = ДатаПеревода; // Дата, с которой вступают в силу изменения
НовыйДокумент.Сотрудник = СсылкаНаСотрудника;
НовыйДокумент.Организация = СсылкаНаОрганизацию;
// Важный нюанс: вызываем заполнение на основании сотрудника
НовыйДокумент.Заполнить(СсылкаНаСотрудника);
// После этого табличные части Начисления и Показатели должны заполниться автоматически
НовыйДокумент.Записать(РежимЗаписиДокумента.Запись);
Важный момент: если метод Заполнить() не отрабатывает ожидаемым образом, убедитесь, что в документе установлены ДатаНачала и Организация до вызова метода, так как алгоритмы поиска действующих начислений опираются на эти данные.
Выясним причину, по которой прямое чтение регистров (например, ПлановыеНачисления) часто выдает нулевые суммы. В архитектуре ЗУП 3.1 данные разделены на две составляющие:
ПлановыеНачисления. Он определяет, что именно начисляется сотруднику (Оклад, Надбавка и т.д.).ЗначенияПериодическихПоказателейРасчетаЗарплатыСотрудников.В документе КадровыйПеревод это разделение сохраняется: существуют две связанные табличные части — Начисления и Показатели. Если вы программно заполните только первую, суммы в документе будут нулевыми, а ФОТ не рассчитается. Если вам необходимо массово обновить данные из внешнего источника, стоит рассмотреть загрузку показателей сотрудников из файла в документы.
Если метод Заполнить() вам не подходит (например, при сложной логике трансформации данных), рассмотрим использование функций из общих модулей. Посмотрим на функцию ЗарплатаКадрыРасширенный.ДействующиеНачисленияСотрудников. Она возвращает структуру с данными о начислениях на определенную дату.
Однако для прямого заполнения документа лучше использовать процедуры из модуля ЗарплатаКадрыСоставДокументов. Разберем по шагам алгоритм использования специализированных процедур:
Пример кода с использованием типовых механизмов:
// Предположим, ОбъектДокумента уже создан и Сотрудник заполнен
ПараметрыЗаполнения = ЗарплатаКадрыСоставДокументов.ПараметрыЗаполненияНачисленийПоСотруднику();
ПараметрыЗаполнения.Сотрудник = ОбъектДокумента.Сотрудник;
ПараметрыЗаполнения.ДатаСобытия = ОбъектДокумента.ДатаНачала;
// Заполняем таблицы Начисления и Показатели
ЗарплатаКадрыСоставДокументов.ЗаполнитьНачисленияПоСотруднику(ОбъектДокумента, ПараметрыЗаполнения);
// Не забываем обновить ФОТ и совокупную ставку, чтобы документ был корректным
ЗарплатаКадрыСоставДокументов.ОбновитьПоказателиСовокупнойТарифнойСтавкиОбъекта(ОбъектДокумента);
В процессе анализа кода типовой конфигурации вы можете встретить вызовы процедур, требующих передачу параметра ЭтаФорма. Проанализируем ситуацию: работа с формой напрямую в серверном коде невозможна.
Рекомендация: избегайте копирования кода из процедур типа ПриИзмененииСотрудникаНаКлиенте. Всегда ищите аналогичные методы в модулях с суффиксом ...СоставДокументов или ...Пересчет, которые работают напрямую с ОбъектДокумента без привязки к контексту формы.
Для получения информации о текущих начислениях «вручную» рекомендуется использовать РегистрСведений.ПлановыеНачисленияИнтервальный. ЗУП редко отдает корректные данные простыми запросами, поэтому разработчики часто используют универсальные отчеты, учитывающие сложную бизнес-логику. Рассмотрим пример запроса, который можно отладить, используя консоль запросов ЗУП с поддержкой программного интерфейса:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ПлановыеНачисления.Начисление,
| ПлановыеНачисления.ДокументОснование,
| ПлановыеНачисления.ДатаОкончания
|ИЗ
| РегистрСведений.ПлановыеНачисленияИнтервальный КАК ПлановыеНачисления
|ГДЕ
| ПлановыеНачисления.Сотрудник = &Сотрудник
| И &ДатаСреза МЕЖДУ ПлановыеНачисления.ДатаНачала И ПлановыеНачисления.ДатаОкончания";
Запрос.УстановитьПараметр("Сотрудник", ВыбранныйСотрудник);
Запрос.УстановитьПараметр("ДатаСреза", ДатаПеревода);
Результат = Запрос.Выполнить().Выгрузить();
Подведем итог: для успешного программного заполнения кадрового перевода необходимо обеспечить синхронное заполнение двух таблиц — Начисления и Показатели. Использование метода Объект.Заполнить(Сотрудник) является наиболее предпочтительным, так как он автоматически учитывает все нюансы типовой конфигурации и гарантирует корректный расчет ФОТ.