Почему в процедуре ОбработкаЗаполнения не заполняются реквизиты сотрудника в 1С:ЗУП и как правильно передать данные?

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

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

Архитектурные особенности хранения кадровых данных в 1С:ЗУП

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

Данные, которые отображаются на форме элемента справочника (текущая должность, подразделение, ставка, график), извлекаются динамически при открытии формы из периодических регистров сведений и первичных кадровых документов (в частности, документа Прием на работу). Поэтому обращение к свойствам ссылки вида Основание.Должность или Основание.Подразделение возвращает пустые значения — этих реквизитов либо нет в структуре объекта, либо они не предназначены для прямого хранения текущего состояния.

Попытки принудительно записать кадровые реквизиты напрямую в справочник нарушают логику конфигурации. Кадровый учет в 1С всегда строится на проведении документов и формировании движений по регистрам.

Способ 1. Использование типового программного интерфейса (рекомендуемый для ЗУП 3.1)

Рассмотрим наиболее правильный подход для конфигураций ЗУП 3.1. Вместо попыток передать все поля формы через структуру в параметре Основание, достаточно передать ссылку на сотрудника и организацию, а затем получить кадровые данные на сервере с помощью типового API.

Для этого в модуле создаваемого документа в процедуре ОбработкаЗаполнения вызываем функции подсистемы кадрового учета:


Процедура ОбработкаЗаполнения(ДанныеЗаполнения, ТекстЗаполнения, СтандартнаяОбработка)
    
    Если ТипЗнч(ДанныеЗаполнения) = Тип("СправочникСсылка.Сотрудники") Тогда
        СсылкаНаСотрудника = ДанныеЗаполнения;
    ИначеЕсли ТипЗнч(ДанныеЗаполнения) = Тип("Структура") И ДанныеЗаполнения.Свойство("Сотрудник", СсылкаНаСотрудника) Тогда
        // Сотрудник получен из структуры
    Иначе
        Возврат;
    КонецЕсли;
    
    Если Не ЗначениеЗаполнено(СсылкаНаСотрудника) Тогда
        Возврат;
    КонецЕсли;
    
    ЭтотОбъект.Сотрудник = СсылкаНаСотрудника;
    ЭтотОбъект.ФизическоеЛицо = СсылкаНаСотрудника.ФизическоеЛицо;
    
    // Определяем дату, на которую требуются кадровые данные
    ДатаСреза = ?(ЗначениеЗаполнено(ЭтотОбъект.Дата), ЭтотОбъект.Дата, ТекущаяДатаСеанса());
    
    // Получаем кадровые данные сотрудника через типовой механизм
    КадровыеДанные = КадровыйУчет.КадровыеДанныеСотрудников(
        Истина,
        СсылкаНаСотрудника,
        "Организация, Подразделение, Должность, ГрафикРаботы, ТарифнаяСтавка",
        ДатаСреза
    );
    
    Если КадровыеДанные.Количество() > 0 Тогда
        СтрокаДанных = КадровыеДанные[0];
        ЭтотОбъект.Организация   = СтрокаДанных.Организация;
        ЭтотОбъект.Подразделение = СтрокаДанных.Подразделение;
        ЭтотОбъект.Должность     = СтрокаДанных.Должность;
    КонецЕсли;
    
КонецПроцедуры

Если для заполнения договора требуются паспортные данные или адрес физического лица, используем соответствующую функцию КадровыйУчет.КадровыеДанныеФизическихЛиц.

Способ 2. Получение данных прямым запросом к кадровым регистрам

Разберем вариант для случаев, когда типовой API недоступен или разработка ведется в конфигурациях предыдущих поколений (ЗУП 2.5, УПП) либо требуется нестандартная выборка данных.

Посмотрим на пример запроса к регистру сведений ТекущиеКадровыеДанныеСотрудников (для ЗУП 3.1) или к срезу последних регистра РаботникиОрганизаций (для ЗУП 2.5):


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

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

Если Не РезультатЗапроса.Пустой() Тогда
    Выборка = РезультатЗапроса.Выбрать();
    Выборка.Следующий();
    ЭтотОбъект.Организация   = Выборка.Организация;
    ЭтотОбъект.Подразделение = Выборка.Подразделение;
    ЭтотОбъект.Должность     = Выборка.Должность;
КонецЕсли;

Способ 3. Заполнение на основании кадрового документа

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

Рекомендации и частые ошибки

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