Как программно создать нового сотрудника в 1С:Бухгалтерии и избежать ошибки недоступности поля для записи

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

При программном добавлении работников в конфигурациях платформы 1С:Предприятие 8.3 начинающие разработчики часто сталкиваются с ошибкой «поле объекта недоступно для записи», а также с трудностями при попытке указать должность и подразделение непосредственно в карточке сотрудника. Рассмотрим подробнее архитектуру кадрового учета типовых конфигураций, выясним причины возникающих ошибок и разберем по шагам правильный алгоритм создания сотрудника с приемом на работу.

Почему возникает ошибка «поле объекта недоступно для записи»

Проанализируем исходный код, который часто приводит к ошибке:


&НаСервере
Процедура НовыйСотрудник(ФИО)
    Сотрудник = Справочники.Сотрудники.СоздатьЭлемент();
    Сотрудник.ФизическоеЛицо.ФИО = ФИО; // Ошибка: Поле объекта недоступно для записи
    Сотрудник.Записать();
КонецПроцедуры

Выясним причину такого поведения платформы. В объектной модели 1С обращение через точку к реквизитам ссылочного типа (в данном случае Сотрудник.ФизическоеЛицо) возвращает ссылку на элемент справочника ФизическиеЛица. Ссылки в 1С предназначены исключительно для чтения. Чтобы изменить данные связанного объекта, необходимо явно получить его объектную сущность с помощью метода ПолучитьОбъект() или предварительно создать и записать физическое лицо отдельно.

Кроме того, в типовых конфигурациях (таких как 1С:Бухгалтерия предприятия 3.0 и 1С:ЗУП) справочники ФизическиеЛица и Сотрудники разделены концептуально:

  1. Справочник «ФизическиеЛица» — описывает человека как гражданина. Здесь хранятся паспортные данные, дата рождения, ИНН, СНИЛС и история изменения ФИО. Один и тот же человек может повторно приниматься на работу, быть совместителем или работать по договору ГПХ.
  2. Справочник «Сотрудники» — отражает трудовые отношения конкретного человека с организацией в рамках конкретного трудового договора. Одному физическому лицу может соответствовать несколько элементов в справочнике сотрудников.

Почему не удается записать организацию, подразделение и должность напрямую

При попытке записать в справочник Сотрудники должность или подразделение разработчики обнаруживают, что таких реквизитов в справочнике попросту нет. Реквизит организации обычно называется ГоловнаяОрганизация, а реквизиты Подразделение и Должность, отображаемые на форме элемента, являются вычисляемыми.

Кадровая информация в типовых конфигурациях привязана ко времени: человек может переводиться из одного отдела в другой, менять должность и оклад. Поэтому данные о должности, подразделении, графике работы и ставке хранятся не в самом сотруднике, а в периодических регистрах сведений (таких как КадроваяИсторияСотрудников и ТекущиеКадровыеДанныеСотрудников).

Попытка записать движения напрямую в регистр сведений без документа-регистратора приведет к ошибкам: большинство кадровых регистров являются подчиненными регистратору. Правильный путь — оформление и проведение документа ПриемНаРаботу.

Пошаговый алгоритм программного создания сотрудника

Разберем полный цикл создания сотрудника, состоящий из трех последовательных шагов: поиск или создание физлица, создание элемента сотрудника и проведение кадрового приказа.

Шаг 1. Поиск или создание физического лица с фиксацией ФИО

При поиске физического лица ориентироваться только на ФИО рискованно из-за возможных полных тезок. Наиболее надежным первичным ключом для поиска выступает СтраховойНомерПФР (СНИЛС), а вторичным — сочетание ИНН, ФИО и даты рождения.

Также важно помнить, что в типовых базах ФИО хранится не только в наименовании элемента, но и в периодическом регистре сведений ФИОФизическихЛиц. Если не сделать запись в этот регистр, ФИО не будет склоняться по падежам в приказах и не попадет корректно в регламентированную отчетность.


&НаСервере
Функция ПолучитьИлиСоздатьФизЛицо(Фамилия, Имя, Отчество, ДатаРождения, СНИЛС)
    
    // Ищем физлицо по СНИЛС, если он передан
    ФизЛицоСсылка = Справочники.ФизическиеЛица.ПустаяСсылка();
    Если ЗначениеЗаполнено(СНИЛС) Тогда
        ФизЛицоСсылка = Справочники.ФизическиеЛица.НайтиПоРеквизиту("СтраховойНомерПФР", СНИЛС);
    КонецЕсли;
    
    Если Не ЗначениеЗаполнено(ФизЛицоСсылка) Тогда
        // Создаем новый элемент справочника
        НовоеФЛ = Справочники.ФизическиеЛица.СоздатьЭлемент();
        НовоеФЛ.Наименование = СтрШаблон("%1 %2 %3", Фамилия, Имя, Отчество);
        НовоеФЛ.ДатаРождения = ДатаРождения;
        НовоеФЛ.СтраховойНомерПФР = СНИЛС;
        НовоеФЛ.Записать();
        
        ФизЛицоСсылка = НовоеФЛ.Ссылка;
        
        // Записываем структурированное ФИО в регистр сведений
        МенеджерЗаписи = РегистрыСведений.ФИОФизическихЛиц.СоздатьМенеджерЗаписи();
        МенеджерЗаписи.ФизическоеЛицо = ФизЛицоСсылка;
        МенеджерЗаписи.Период = '19000101';
        МенеджерЗаписи.Фамилия = Фамилия;
        МенеджерЗаписи.Имя = Имя;
        МенеджерЗаписи.Отчество = Отчество;
        МенеджерЗаписи.Записать();
    КонецЕсли;
    
    Возврат ФизЛицоСсылка;

КонецФункции

Шаг 2. Создание элемента в справочнике «Сотрудники»

Посмотрим, как правильно создать элемент справочника Сотрудники и связать его с созданным ранее физическим лицом и организацией:


&НаСервере
Функция СоздатьЭлементСотрудника(ФизЛицоСсылка, ОрганизацияСсылка)

    НовыйСотрудник = Справочники.Сотрудники.СоздатьЭлемент();
    НовыйСотрудник.ФизическоеЛицо = ФизЛицоСсылка;
    НовыйСотрудник.ГоловнаяОрганизация = ОрганизацияСсылка;
    НовыйСотрудник.Наименование = ФизЛицоСсылка.Наименование;
    
    НовыйСотрудник.Записать();
    
    Возврат НовыйСотрудник.Ссылка;

КонецФункции

Шаг 3. Формирование и проведение документа «Прием на работу»

Для того чтобы у сотрудника появились организация, подразделение, должность и плановые начисления, необходимо создать и провести кадровый документ:


&НаСервере
Процедура ОформитьПриемНаРаботу(СотрудникСсылка, ОрганизацияСсылка, ПодразделениеСсылка, ДолжностьСсылка, ДатаПриема, Оклад)

    ДокументПриема = Документы.ПриемНаРаботу.СоздатьДокумент();
    ДокументПриема.Дата = ТекущаяДата();
    ДокументПриема.Организация = ОрганизацияСсылка;
    ДокументПриема.Сотрудник = СотрудникСсылка;
    ДокументПриема.ФизическоеЛицо = СотрудникСсылка.ФизическоеЛицо;
    ДокументПриема.ДатаПриема = ДатаПриема;
    ДокументПриема.Подразделение = ПодразделениеСсылка;
    ДокументПриема.Должность = ДолжностьСсылка;
    ДокументПриема.КоличествоСтавок = 1;
    
    // Заполнение плановых начислений (например, оплата по окладу)
    СтрокаНачислений = ДокументПриема.Начисления.Добавить();
    СтрокаНачислений.Начисление = ПланыВидовРасчета.Начисления.НайтиПоНаименованию("Оплата по окладу");
    СтрокаНачислений.Размер = Оклад;
    
    ДокументПриема.Записать(РежимЗаписиДокумента.Проведение);

КонецПроцедуры

Сборка общего процесса

Объединим все шаги в единую процедуру, которая принимает параметры и корректно инициализирует нового сотрудника в системе:


&НаСервере
Процедура ПринятьНовогоСотрудника()

    Организация = Справочники.Организации.НайтиПоНаименованию("Основная организация");
    Подразделение = Справочники.ПодразделенияОрганизаций.НайтиПоНаименованию("Бухгалтерия");
    Должность = Справочники.Должности.НайтиПоНаименованию("Бухгалтер");
    
    ФизЛицо = ПолучитьИлиСоздатьФизЛицо("Иванов", "Иван", "Иванович", '19900515', "123-456-789 00");
    Сотрудник = СоздатьЭлементСотрудника(ФизЛицо, Организация);
    
    ОформитьПриемНаРаботу(Сотрудник, Организация, Подразделение, Должность, ТекущаяДата(), 50000);

КонецПроцедуры

При таком подходе данные регистров КадроваяИсторияСотрудников, ТекущиеКадровыеДанныеСотрудников и регистров плановых начислений формируются стандартными механизмами конфигурации. Это гарантирует корректное отображение реквизитов в карточке сотрудника, исключает ошибки при формировании расчетных листков и обеспечивает правильную выгрузку регламентированной отчетности.

← На главную