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