При программном добавлении работников в конфигурациях платформы 1С:Предприятие 8.3 начинающие разработчики часто сталкиваются с ошибкой «поле объекта недоступно для записи», а также с трудностями при попытке указать должность и подразделение непосредственно в карточке сотрудника. Рассмотрим подробнее архитектуру кадрового учета типовых конфигураций, выясним причины возникающих ошибок и разберем по шагам правильный алгоритм создания сотрудника с приемом на работу.
Проанализируем исходный код, который часто приводит к ошибке:
&НаСервере
Процедура НовыйСотрудник(ФИО)
Сотрудник = Справочники.Сотрудники.СоздатьЭлемент();
Сотрудник.ФизическоеЛицо.ФИО = ФИО; // Ошибка: Поле объекта недоступно для записи
Сотрудник.Записать();
КонецПроцедуры
Выясним причину такого поведения платформы. В объектной модели 1С обращение через точку к реквизитам ссылочного типа (в данном случае Сотрудник.ФизическоеЛицо) возвращает ссылку на элемент справочника ФизическиеЛица. Ссылки в 1С предназначены исключительно для чтения. Чтобы изменить данные связанного объекта, необходимо явно получить его объектную сущность с помощью метода ПолучитьОбъект() или предварительно создать и записать физическое лицо отдельно.
Кроме того, в типовых конфигурациях (таких как 1С:Бухгалтерия предприятия 3.0 и 1С:ЗУП) справочники ФизическиеЛица и Сотрудники разделены концептуально:
При попытке записать в справочник Сотрудники должность или подразделение разработчики обнаруживают, что таких реквизитов в справочнике попросту нет. Реквизит организации обычно называется ГоловнаяОрганизация, а реквизиты Подразделение и Должность, отображаемые на форме элемента, являются вычисляемыми.
Кадровая информация в типовых конфигурациях привязана ко времени: человек может переводиться из одного отдела в другой, менять должность и оклад. Поэтому данные о должности, подразделении, графике работы и ставке хранятся не в самом сотруднике, а в периодических регистрах сведений (таких как КадроваяИсторияСотрудников и ТекущиеКадровыеДанныеСотрудников).
Попытка записать движения напрямую в регистр сведений без документа-регистратора приведет к ошибкам: большинство кадровых регистров являются подчиненными регистратору. Правильный путь — оформление и проведение документа ПриемНаРаботу.
Разберем полный цикл создания сотрудника, состоящий из трех последовательных шагов: поиск или создание физлица, создание элемента сотрудника и проведение кадрового приказа.
При поиске физического лица ориентироваться только на ФИО рискованно из-за возможных полных тезок. Наиболее надежным первичным ключом для поиска выступает СтраховойНомерПФР (СНИЛС), а вторичным — сочетание ИНН, ФИО и даты рождения.
Также важно помнить, что в типовых базах ФИО хранится не только в наименовании элемента, но и в периодическом регистре сведений ФИОФизическихЛиц. Если не сделать запись в этот регистр, ФИО не будет склоняться по падежам в приказах и не попадет корректно в регламентированную отчетность.
&НаСервере
Функция ПолучитьИлиСоздатьФизЛицо(Фамилия, Имя, Отчество, ДатаРождения, СНИЛС)
// Ищем физлицо по СНИЛС, если он передан
ФизЛицоСсылка = Справочники.ФизическиеЛица.ПустаяСсылка();
Если ЗначениеЗаполнено(СНИЛС) Тогда
ФизЛицоСсылка = Справочники.ФизическиеЛица.НайтиПоРеквизиту("СтраховойНомерПФР", СНИЛС);
КонецЕсли;
Если Не ЗначениеЗаполнено(ФизЛицоСсылка) Тогда
// Создаем новый элемент справочника
НовоеФЛ = Справочники.ФизическиеЛица.СоздатьЭлемент();
НовоеФЛ.Наименование = СтрШаблон("%1 %2 %3", Фамилия, Имя, Отчество);
НовоеФЛ.ДатаРождения = ДатаРождения;
НовоеФЛ.СтраховойНомерПФР = СНИЛС;
НовоеФЛ.Записать();
ФизЛицоСсылка = НовоеФЛ.Ссылка;
// Записываем структурированное ФИО в регистр сведений
МенеджерЗаписи = РегистрыСведений.ФИОФизическихЛиц.СоздатьМенеджерЗаписи();
МенеджерЗаписи.ФизическоеЛицо = ФизЛицоСсылка;
МенеджерЗаписи.Период = '19000101';
МенеджерЗаписи.Фамилия = Фамилия;
МенеджерЗаписи.Имя = Имя;
МенеджерЗаписи.Отчество = Отчество;
МенеджерЗаписи.Записать();
КонецЕсли;
Возврат ФизЛицоСсылка;
КонецФункции
Посмотрим, как правильно создать элемент справочника Сотрудники и связать его с созданным ранее физическим лицом и организацией:
&НаСервере
Функция СоздатьЭлементСотрудника(ФизЛицоСсылка, ОрганизацияСсылка)
НовыйСотрудник = Справочники.Сотрудники.СоздатьЭлемент();
НовыйСотрудник.ФизическоеЛицо = ФизЛицоСсылка;
НовыйСотрудник.ГоловнаяОрганизация = ОрганизацияСсылка;
НовыйСотрудник.Наименование = ФизЛицоСсылка.Наименование;
НовыйСотрудник.Записать();
Возврат НовыйСотрудник.Ссылка;
КонецФункции
Для того чтобы у сотрудника появились организация, подразделение, должность и плановые начисления, необходимо создать и провести кадровый документ:
&НаСервере
Процедура ОформитьПриемНаРаботу(СотрудникСсылка, ОрганизацияСсылка, ПодразделениеСсылка, ДолжностьСсылка, ДатаПриема, Оклад)
ДокументПриема = Документы.ПриемНаРаботу.СоздатьДокумент();
ДокументПриема.Дата = ТекущаяДата();
ДокументПриема.Организация = ОрганизацияСсылка;
ДокументПриема.Сотрудник = СотрудникСсылка;
ДокументПриема.ФизическоеЛицо = СотрудникСсылка.ФизическоеЛицо;
ДокументПриема.ДатаПриема = ДатаПриема;
ДокументПриема.Подразделение = ПодразделениеСсылка;
ДокументПриема.Должность = ДолжностьСсылка;
ДокументПриема.КоличествоСтавок = 1;
// Заполнение плановых начислений (например, оплата по окладу)
СтрокаНачислений = ДокументПриема.Начисления.Добавить();
СтрокаНачислений.Начисление = ПланыВидовРасчета.Начисления.НайтиПоНаименованию("Оплата по окладу");
СтрокаНачислений.Размер = Оклад;
ДокументПриема.Записать(РежимЗаписиДокумента.Проведение);
КонецПроцедуры
Объединим все шаги в единую процедуру, которая принимает параметры и корректно инициализирует нового сотрудника в системе:
&НаСервере
Процедура ПринятьНовогоСотрудника()
Организация = Справочники.Организации.НайтиПоНаименованию("Основная организация");
Подразделение = Справочники.ПодразделенияОрганизаций.НайтиПоНаименованию("Бухгалтерия");
Должность = Справочники.Должности.НайтиПоНаименованию("Бухгалтер");
ФизЛицо = ПолучитьИлиСоздатьФизЛицо("Иванов", "Иван", "Иванович", '19900515', "123-456-789 00");
Сотрудник = СоздатьЭлементСотрудника(ФизЛицо, Организация);
ОформитьПриемНаРаботу(Сотрудник, Организация, Подразделение, Должность, ТекущаяДата(), 50000);
КонецПроцедуры
При таком подходе данные регистров КадроваяИсторияСотрудников, ТекущиеКадровыеДанныеСотрудников и регистров плановых начислений формируются стандартными механизмами конфигурации. Это гарантирует корректное отображение реквизитов в карточке сотрудника, исключает ошибки при формировании расчетных листков и обеспечивает правильную выгрузку регламентированной отчетности.