Как программно заполнить адрес физического лица в 1С 8.3?

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

При автоматизации загрузки данных из внешних файлов или сторонних систем часто возникает необходимость программно внести адресные данные физического лица в 1С. В современных типовых конфигурациях (например, 1С:Бухгалтерия предприятия 3.0) контактная информация хранится в специальном структурированном виде. Просто записать текстовую строку адреса в реквизит недостаточно — необходимо корректно сформировать внутреннее представление адреса для синхронизации с адресным классификатором (ФИАС / ГАР).

Рассмотрим подробнее, как устроена подсистема «Контактная информация» Библиотеки Стандартных Подсистем (БСП) и как с помощью штатных программных методов правильно записать адрес.

Особенности хранения адресов в типовых конфигурациях

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

  1. Представление: текстовая строка адреса, отображаемая пользователю на форме (например, «г. Москва, ул. Ленина, д. 10, кв. 5»).
  2. ЗначенияПолей (или Значение): служебная строка в формате XML или JSON, содержащая разобранные элементы адреса и их идентификаторы классификатора. Именно она позволяет 1С понимать, где регион, где город, а где номер дома.

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

Формирование структуры адреса с помощью подсистемы БСП

Разберем по шагам, как преобразовать текстовое представление адреса в структурированные данные. В подсистеме БСП предусмотрена функция КонтактнаяИнформацияXMLПоПредставлению (или ее аналог для JSON в более новых версиях).

Обратите внимание на требование к входной строке: чтобы алгоритм распознавания 1С смог сопоставить элементы с классификатором без сброса в свободную форму, строковое представление должно соответствовать правилам наименования объектов (например, «Москва г, Ленина ул, дом 10, кв 5»).

Посмотрим на пример кода, с помощью которого можно сформировать структурированную запись и сохранить ее в регистр сведений контактной информации:


&НаСервереБезКонтекста
Процедура ЗаписатьАдресФизЛица(ПациентИлиФизЛицо, ТекстовыйАдрес, ВидАдреса)
    
    // Получаем структурированную строку XML/JSON на основании текста и вида контактной информации
    ЗначенияПолей = УправлениеКонтактнойИнформацией.КонтактнаяИнформацияXMLПоПредставлению(ТекстовыйАдрес, ВидАдреса);
    
    // Создаем менеджер записи регистра сведений контактной информации
    МенеджерЗаписи = РегистрыСведений.КонтактнаяИнформация.СоздатьМенеджерЗаписи();
    МенеджерЗаписи.Объект = ПациентИлиФизЛицо;
    МенеджерЗаписи.Тип = Перечисления.ТипыКонтактнойИнформации.Адрес;
    МенеджерЗаписи.Вид = ВидАдреса;
    
    // Читаем существующую запись, если она есть
    МенеджерЗаписи.Прочитать();
    
    // Заполняем реквизиты адреса
    МенеджерЗаписи.Представление = ТекстовыйАдрес;
    МенеджерЗаписи.ЗначенияПолей = ЗначенияПолей;
    
    // Сохраняем данные в базе
    МенеджерЗаписи.Записать(Истина);
    
КонецПроцедуры

Преобразование списка адресов

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

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


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |	КИ.Объект КАК Объект,
    |	КИ.Тип КАК Тип,
    |	КИ.Вид КАК Вид,
    |	КИ.Представление КАК Представление,
    |	КИ.ЗначенияПолей КАК ЗначенияПолей
    |ИЗ
    |	РегистрСведений.КонтактнаяИнформация КАК КИ
    |ГДЕ
    |	КИ.Тип = ЗНАЧЕНИЕ(Перечисление.ТипыКонтактнойИнформации.Адрес)";

Выборка = Запрос.Выполнить().Выбрать();

Пока Выборка.Следующий() Цикл
    
    // Преобразуем текстовое представление в формат БСП
    СформированныеЗначения = УправлениеКонтактнойИнформацией.КонтактнаяИнформацияXMLПоПредставлению(Выборка.Представление, Выборка.Вид);
    
    // Записываем обновленные данные
    МенеджерЗаписи = РегистрыСведений.КонтактнаяИнформация.СоздатьМенеджерЗаписи();
    ЗаполнитьЗначенияСвойств(МенеджерЗаписи, Выборка);
    
    МенеджерЗаписи.Прочитать();
    Если МенеджерЗаписи.Выбран() Тогда
        МенеджерЗаписи.ЗначенияПолей = СформированныеЗначения;
        МенеджерЗаписи.Записать(Истина);
    КонецЕсли;
    
КонецЦикла;

Полезные советы при подготовке данных

  1. Проверяйте формат строки: Для точного распознавания классификатором передавайте адреса в виде «Регион, Город г, Улица ул, дом N». При нестандартном формате (например, «г. Город») около 20–30% адресов могут записаться как произвольный текст без привязки к ФИАС/ГАР.
  2. Используйте функции общего модуля: В зависимости от версии БСП изучите состав общих модулей УправлениеКонтактнойИнформацией и УправлениеКонтактнойИнформациейКлиентСервер. В них содержатся методы СформироватьЗаписьАдреса, СтруктураПолейАдреса и КонтактнаяИнформацияПоПредставлению, упрощающие работу со сложными объектами.
  3. Тестируйте на копии базы: Перед массовой загрузкой адресов из внешнего файла обязательно проверьте корректность заполнения полей на нескольких элементах через форму справочника ФизическиеЛица, нажав кнопку «Проверить заполнение».
← На главную