При загрузке данных из внешних файлов (например, из формата DBF, Excel или XML) в конфигурации 1С на базе библиотеки зарплаты и кадров разработчики часто сталкиваются с нетипичным поведением формы справочника Сотрудники. На форме присутствует поле Должность, однако при попытке записать его непосредственно в объект справочника выясняется, что реквизит ТекущаяДолжность является исключительно реквизитом формы и отсутствует в самом справочнике.
В этой статье мы подробно разберем архитектуру хранения кадровых данных в 1С:Предприятие 8.3, выясним, почему стандартные кадровые документы не применяются при внешнем учете зарплаты, и научимся правильно записывать данные о должности программным путем.
Рассмотрим, как устроено хранение кадровых сведений в типовых решениях 1С. В системе разделены понятия физического лица (человека) и сотрудника (его элемента в справочнике). Сведения о назначении на должность, подразделении и организации зависят от режима ведения учета:
ПриемНаРаботу или КадровыйПеревод данные записываются в периодический регистр сведений КадроваяИсторияСотрудников. Из этого регистра система считывает актуальные кадровые данные на требуемую дату.Выясним причину: при отключенном кадровом учете форма элемента справочника Сотрудники считывает актуальные сведения из специализированного вспомогательного регистра сведений — ТекущиеКадровыеДанныеСотрудников.
Проанализируем задачу по шагам. Чтобы программно заполнить и сохранить должность сотрудника при загрузке из внешнего файла, необходимо выполнить два основных действия: найти или создать запись в справочнике Должности, а затем внести запись в регистр сведений ТекущиеКадровыеДанныеСотрудников.
Реквизит ТекущаяДолжность принимает значение типа СправочникСсылка.Должности. Поэтому перед заполнением регистра необходимо сначала найти существующую должность по наименованию или создать новую.
Рассмотрим пример кода для поиска и создания должности:
// Поиск должности по наименованию из внешнего файла
НаименованиеДолжности = СокрЛП(СтрокаФайла.Должность);
СсылкаДолжность = Справочники.Должности.НайтиПоНаименованию(НаименованиеДолжности);
// Если должность не найдена, создаем новый элемент
Если Не ЗначениеЗаполнено(СсылкаДолжность) Тогда
ОбъектДолжность = Справочники.Должности.СоздатьЭлемент();
ОбъектДолжность.Наименование = НаименованиеДолжности;
ОбъектДолжность.Записать();
СсылкаДолжность = ОбъектДолжность.Ссылка;
КонецЕсли;
После того как сотрудник создан или найден в информационной базе, сформируем набор записей для регистра сведений ТекущиеКадровыеДанныеСотрудников с установкой отбора по конкретному сотруднику.
Разберем пример кода для записи кадровых данных:
// Формируем набор записей регистра сведений
НаборЗаписей = РегистрыСведений.ТекущиеКадровыеДанныеСотрудников.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Сотрудник.Установить(СсылкаСотрудник);
// Создаем новую запись
Запись = НаборЗаписей.Добавить();
Запись.Сотрудник = СсылкаСотрудник;
Запись.ТекущаяДолжность = СсылкаДолжность;
// Заполняем сопутствующие кадровые реквизиты для корректной работы отчетов
Запись.ТекущаяОрганизация = СсылкаОрганизация;
Запись.ТекущееПодразделение = СсылкаПодразделение;
// Записываем набор данных в базу
НаборЗаписей.Записать();
При выполнении интеграции и массовой загрузки сотрудников обратите внимание на следующие моменты:
ТекущаяДолжность, но и ТекущаяОрганизация и ТекущееПодразделение. Это предотвратит ошибки при формировании печатных форм и аналитических отчетов.Сотрудники корректно заполнен реквизит ФизическоеЛицо. В противном случае сопоставление кадровых данных в некоторых механизмах конфигурации может работать некорректно.ОбновитьТекущиеКадровыеДанныеСотрудников), если стандартное отображение требует принудительного пересчета.Использование регистра сведений ТекущиеКадровыеДанныеСотрудников позволяет корректно передавать и отображать кадровые данные сотрудников в условиях, когда кадровый учет ведут во внешней программе.