Как программно заполнить реквизиты и место рождения в справочнике Физические лица

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

При автоматизации загрузки данных из внешних систем (через HTTP-запросы, файлы JSON или Excel), например, при загрузке сведений из Камин в ЗУП, разработчики часто сталкиваются с ситуацией, когда данные, видимые на форме элемента справочника (в том числе при получении данных по API), не получается просто присвоить одноименному реквизиту объекта. Особенно часто это происходит при работе со справочником ФизическиеЛица в типовых конфигурациях 1С. В данной статье мы подробно разберем, как правильно заполнять данные программно, почему не стоит пытаться обращаться к форме на сервере и в каком формате хранятся специфические данные, такие как место рождения.

Проблема обращения к реквизитам формы на сервере

Рассмотрим ситуацию: вы создаете элемент справочника в общем модуле (на сервере) или в рамках регламентного задания. Попытка вызвать метод ПолучитьФорму() приведет к ошибке "Интерактивные операции недоступны". Это происходит потому, что на сервере отсутствует контекст отображения, и формы как таковой не существует в памяти в интерактивном виде.

Многие начинающие разработчики пытаются использовать функции РеквизитФормыВЗначение или ЗначениеВРеквизитФормы вне модуля формы. Важно помнить: эти методы являются методами объекта УправляемаяФорма и доступны только внутри программного кода самой формы. Если ваша задача — создать и записать элемент справочника в фоновом режиме, забудьте про форму. Вам нужно работать исключительно с объектом СправочникОбъект.ФизическиеЛица и связанными с ним регистрами сведений.

Разбор заполнения реквизита Место рождения

Реквизит МестоРождения в справочнике ФизическиеЛица имеет строковый тип, но он не предназначен для записи произвольного текста. В типовых решениях 1С (БП 3.0, ЗУП 3.1, ERP) используется жестко заданный формат хранения этой строки, чтобы программа могла корректно разобрать ее на составляющие при печати отчетности или выгрузке в государственные органы (СФР, налоговую).

Проанализируем структуру этой строки. Она должна состоять из пяти полей, разделенных запятыми:

"ФлагОсобогоМеста, Город, Район, Область, Страна"

Где:

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


// Предположим, МассивМестоРождения содержит [Город, Район, Область, Страна]
НовоеФизЛицо = Справочники.ФизическиеЛица.СоздатьЭлемент();
// Формируем строку по шаблону: Тип, Город, Район, Область, Страна
СтрокаМестаРождения = "0," // Обычное место рождения
    + СокрЛП(МассивМестоРождения[0]) + "," // Город
    + СокрЛП(МассивМестоРождения[1]) + "," // Район
    + СокрЛП(МассивМестоРождения[2]) + "," // Область
    + СокрЛП(МассивМестоРождения[3]);       // Страна

НовоеФизЛицо.МестоРождения = СтрокаМестаРождения;

Обратите внимание, что запятые должны присутствовать всегда, даже если какое-то из полей (например, район или страна) не заполнено. Пустое поле просто обозначается отсутствием текста между запятыми.

Работа с ФИО и историческими данными

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

Выясним причину: если вы просто заполните реквизиты объекта и вызовете Записать(), система может автоматически создать запись в периодическом регистре сведений ФИОФизическихЛиц. Но если вы загружаете данные "прошлым числом", автоматика может сработать некорректно. Проанализируем правильный подход:

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

Контактная информация: Адреса и Телефоны

Часто разработчики ищут реквизит "Адрес" в справочнике и не находят его. В 1С данные о контактах хранятся в табличной части КонтактнаяИнформация (или в отдельном регистре, в зависимости от версии БСП). Просто добавить строку в табличную часть недостаточно, так как адрес должен храниться в формате JSON или XML для корректной работы с ФИАС.

Рассмотрим, как правильно добавить контактную информацию:


// Используем механизмы БСП для работы с контактной информацией
ВидАдреса = Справочники.ВидыКонтактнойИнформации.ФактАдресФизЛица;
ТипКонтактнойИнформации = Перечисления.ТипыКонтактнойИнформации.Адрес;

// В типовых конфигурациях рекомендуется использовать общие модули:
УправлениеКонтактнойИнформацией.ЗаписатьКонтактнуюИнформацию(НовоеФизЛицо.Ссылка, ДанныеАдресаСтрокой, ВидАдреса, ТипКонтактнойИнформации);

Использование методов общего модуля УправлениеКонтактнойИнформацией гарантирует, что данные попадут во все нужные таблицы и будут корректно проиндексированы системой.

Итоговый пример программного создания физического лица

Соберем все вышесказанное в единый алгоритм. Предположим, мы получаем данные из внешнего источника в виде соответствия (Map).


Функция СоздатьФизЛицоИзВнешнихДанных(ДанныеJSON) Экспорт
    
    // 1. Создаем объект
    НовоеФизЛицо = Справочники.ФизическиеЛица.СоздатьЭлемент();
    
    // 2. Заполняем основные реквизиты
    НовоеФизЛицо.Фамилия  = ДанныеJSON["LastName"];
    НовоеФизЛицо.Имя      = ДанныеJSON["FirstName"];
    НовоеФизЛицо.Отчество = ДанныеJSON["MiddleName"];
    НовоеФизЛицо.ИНН      = ДанныеJSON["INN"];
    НовоеФизЛицо.ДатаРождения = ДанныеJSON["BirthDate"];
    
    // Формируем наименование для списка
    НовоеФизЛицо.Наименование = НовоеФизЛицо.Фамилия + " " + НовоеФизЛицо.Имя + " " + НовоеФизЛицо.Отчество;
    
    // 3. Формируем строку места рождения (0 - обычное, далее компоненты через запятую)
    // Город, Район, Область, Страна
    НовоеФизЛицо.МестоРождения = "0," + ДанныеJSON["City"] + ",," + ДанныеJSON["Region"] + "," + ДанныеJSON["Country"];
    
    // 4. Записываем объект, чтобы получить ссылку
    Попытка
        НовоеФизЛицо.Записать();
    Исключение
        ЗаписьЖурналаРегистрации("ЗагрузкаДанных", УровеньЖурналаРегистрации.Ошибка,,, ОписаниеОшибки());
        Возврат Справочники.ФизическиеЛица.ПустаяСсылка();
    КонецПопытки;
    
    // 5. Здесь можно вызвать дополнительные процедуры для заполнения паспортных данных или адресов
    // через соответствующие регистры сведений (ПаспортныеДанныеФизЛиц и т.д.)
    
    Возврат НовоеФизЛицо.Ссылка;
    
КонецФункции

Важный совет: Перед созданием нового физического лица всегда выполняйте поиск по ИНН или комбинации ФИО + ДатаРождения. Это поможет избежать дублирования записей в базе данных при повторном получении тех же самых данных из внешней системы.

Таким образом, для успешного программного заполнения данных необходимо разделять понятия "данные на форме" и "данные в базе". Работайте напрямую с объектами и регистрами, соблюдайте форматные строки для системных реквизитов, и тогда ваши данные будут корректно отображаться во всех формах и отчетах системы 1С.

← На главную