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

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

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

Почему возникают сложности при заполнении начислений

Проанализируем архитектуру документа Прием на работу. В отличие от старых редакций ЗУП, в версии 3.0 данные о начислениях разделены на несколько взаимосвязанных табличных частей. Основная проблема заключается в том, что колонки, которые мы видим в пользовательском интерфейсе (например, «Оклад» или «Надбавка»), на самом деле не являются физическими реквизитами табличной части Начисления. Это так называемые «виртуальные» или динамические колонки данных формы.

Рассмотрим ключевые причины неудач при простом заполнении:

  1. Связь через идентификатор: Каждая строка в таблице Начисления должна быть жестко связана со строками в таблице Показатели. Эта связь осуществляется через скрытый реквизит ИдентификаторСтрокиВидаРасчета. Если вы просто добавили начисление, но не создали связанные записи в показателях с тем же идентификатором, сумма не появится.
  2. Виртуальные поля Значение1...Значение6: Попытка обратиться к НоваяСтрока.Значение1 напрямую через объект документа приведет к ошибке «Поле не найдено». Эти поля существуют только на форме для удобства ввода, а в базе данных значения хранятся в отдельной таблице показателей.
  3. Необходимость пересчета ФОТ: Фонд оплаты труда (ФОТ) в ЗУП 3.0 — это сложный расчетный показатель. Простого присвоения значения в колонку Размер недостаточно для того, чтобы система пересчитала ФОТ и корректно записала его в регистры.

Решение 1: Ручное заполнение связанных табличных частей

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


// Находим нужный документ
ДокОбъект = Документы.ПриемНаРаботу.НайтиПоНомеру("ХХХХХХ").ПолучитьОбъект();

// 1. Добавляем строку в начисления
НоваяСтрокаНачисления = ДокОбъект.Начисления.Добавить();
НоваяСтрокаНачисления.Начисление = ПланыВидовРасчета.Начисления.НайтиПоКоду("ОКЛ");
// Устанавливаем уникальный идентификатор для связи
ИдентификаторСвязи = ДокОбъект.Начисления.Количество(); 
НоваяСтрокаНачисления.ИдентификаторСтрокиВидаРасчета = ИдентификаторСвязи;

// 2. Добавляем строку в показатели, где и хранится сама сумма (оклад)
НоваяСтрокаПоказатель = ДокОбъект.Показатели.Добавить();
НоваяСтрокаПоказатель.ИдентификаторСтрокиВидаРасчета = ИдентификаторСвязи;
НоваяСтрокаПоказатель.Показатель = Справочники.ПоказателиРасчетаЗарплаты.НайтиПоНаименованию("Оклад");
НоваяСтрокаПоказатель.Значение = 50000; // Наш оклад

// Записываем документ
ДокОбъект.Записать(РежимЗаписиДокумента.Запись);

В данном примере мы используем ИдентификаторСтрокиВидаРасчета для «склейки» вида расчета и его числового значения. Без этого механизма документ останется некорректно заполненным.

Решение 2: Заполнение на основании штатного расписания

Если в вашей информационной базе ведется штатное расписание, то наиболее правильным и безопасным способом будет использование типовых механизмов ЗУП 3.0. Вместо того чтобы вручную перечислять начисления, мы можем указать позицию штатного расписания, а программа сама подтянет все положенные сотруднику надбавки и оклады.

Разберем, как это реализовать. Для этого нам потребуется вызвать серверную процедуру, которая имитирует выбор позиции пользователем. В коде это выглядит примерно так:


// Указываем позицию штатного расписания
ДокОбъект.ПозицияШтатногоРасписания = Справочники.ШтатноеРасписание.НайтиПоНаименованию("Менеджер");

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

// После заполнения важно обновить ФОТ
ДокОбъект.ПриИзмененииПоказателейНачислений(); // Если доступно в модуле объекта
ДокОбъект.Записать(РежимЗаписиДокумента.Проведение);

Этот метод гарантирует, что все скрытые реквизиты и расчетные данные (ФОТ, районный коэффициент и др.) будут заполнены в строгом соответствии с логикой конфигурации.

Решение 3: Постобработка через форму документа (Клиентский метод)

Иногда возникает ситуация, когда документ уже создан, начисления добавлены, но визуально в форме они не отображаются или ФОТ не рассчитан. В таком случае можно воспользоваться методом программного открытия формы и вызова экспортных процедур, которые отвечают за обновление интерфейса. При комплексной миграции кадрового учёта из других конфигураций избежать таких сложностей поможет раздел готовых решений для переноса данных ЗУП, где эти нюансы уже учтены.

Рассмотрим последовательность действий:

  1. Получаем форму существующего документа.
  2. Вызываем встроенную процедуру заполнения начислений по позиции.
  3. Программно инициируем сохранение формы.

// Получаем форму
ПараметрыФормы = Новый Структура("Ключ", СсылкаНаДокумент);
ФормаДок = ПолучитьФорму("Документ.ПриемНаРаботу.Форма.ФормаДокумента", ПараметрыФормы);

// Вызываем экспортную процедуру пересчета (если заполнена позиция)
ДопПараметры = Новый Структура;
ФормаДок.ЗаполнитьНачисленияПоПозицииЗавершение(Ложь, ДопПараметры);

// Записываем изменения
ПараметрыЗаписи = Новый Структура("РежимЗаписи", РежимЗаписиДокумента.Запись);
ДополнительныеПараметры = Новый Структура("ПараметрыЗаписи", ПараметрыЗаписи);
ФормаДок.ЗаписатьНаКлиентеЗавершение(КодВозвратаДиалога.Да, ДополнительныеПараметры);

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

Советы по отладке

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

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

← На главную