Как программно разложить адрес в структуру в 1С:ЗУП 3.0 и 3.1

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

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

Понимание структуры хранения адреса

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

  1. Представление — это готовая строка адреса, которую видит пользователь.
  2. ЗначенияПолей — это техническая строка (ранее в формате XML, сейчас чаще в JSON), в которой «зашиты» все составляющие адреса с кодами ФИАС/ГАР.

Для корректного разложения адреса мы будем использовать именно реквизит ЗначенияПолей, так как парсинг обычной строки «через запятую» крайне ненадежен из-за вариативности ввода.

Решение 1: Использование модуля УправлениеКонтактнойИнформацией

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


// Получаем контактную информацию объекта (например, Юридический адрес)
ВидИнформации = Справочники.ВидыКонтактнойИнформации.ЮрАдресОрганизации;
Информация = УправлениеКонтактнойИнформацией.КонтактнаяИнформацияОбъекта(ОбъектСсылка, ВидИнформации);

// Проверяем наличие данных
Если Информация.Количество() > 0 Тогда
    // В современных версиях данные хранятся в формате JSON
    ЗначениеПолей = Информация[0].Значение;
    ТипАдреса = Перечисления.ТипыКонтактнойИнформации.Адрес;
    
    // Преобразуем JSON в структуру
    СтруктураАдреса = УправлениеКонтактнойИнформациейСлужебный.JSONВКонтактнуюИнформациюПоПолям(ЗначениеПолей, ТипАдреса);
КонецЕсли;

В результате мы получим соответствие или структуру, где ключами будут являться английские или русские наименования элементов (например, city, street, houseNumber). Проанализируем ситуацию: если в базе данных все еще хранятся старые записи в формате XML, этот метод может потребовать уточнения.

Решение 2: Разбор XML-формата (универсальный метод)

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


// Данные - это значение реквизита "ЗначенияПолей" из табличной части
Функция ПолучитьСтруктуруИзXML(ДанныеXML, ВидАдреса)
    // Функция возвращает структуру со всеми полями: Регион, Город, Улица и т.д.
    Структура = УправлениеКонтактнойИнформацией.ПредыдущаяСтруктураКонтактнойИнформацииXML(ДанныеXML, ВидАдреса);
    Возврат Структура;
КонецФункции

Важный момент: состав полей в такой структуре будет включать Регион, Город, Район, НаселенныйПункт, Улица, Дом, Корпус, Квартира. Это позволяет легко обращаться к ним через точку, например: Структура.Город.

Решение 3: Работа с современным форматом JSON в актуальных релизах

В актуальных версиях ЗУП (3.1.10 и выше) 1С активно использует формат JSON. Чтобы не писать разные обработчики для XML и JSON, рекомендуется использовать «обертки» БСП. Разберем по шагам, как универсально получить данные:

  1. Выполняем запрос к табличной части КонтактнаяИнформация, получая поле ЗначенияПолей.
  2. Используем функцию КонтактнаяИнформацияВФорматеJSON для приведения данных к единому стандарту.
  3. Разбираем полученную строку.

Рассмотрим пример реализации в цикле при обработке списка сотрудников:


Для Каждого СтрокаТЧ Из ФизЛицо.КонтактнаяИнформация Цикл
    Если СтрокаТЧ.Вид = НужныйВидАдреса Тогда
        // Используем современный парсер
        АдресОбъект = УправлениеКонтактнойИнформациейСлужебный.JSONВКонтактнуюИнформациюПоПолям(СтрокаТЧ.Значение, Перечисления.ТипыКонтактнойИнформации.Адрес);
        
        // Обратите внимание, ключи в JSON могут отличаться от XML
        Индекс   = АдресОбъект["ZIPcode"];
        Регион   = АдресОбъект["area"];
        Город    = АдресОбъект["city"];
        Улица    = АдресОбъект["street"];
        НомерДома = АдресОбъект["houseNumber"];
        
        // Для квартир и строений часто используются вложенные коллекции
        Если АдресОбъект.Property("apartments") Тогда
            Квартира = АдресОбъект["apartments"][0]["number"];
        КонецЕсли;
    КонецЕсли;
КонецЦикла;

Решение 4: Высокоуровневая функция СведенияОбАдресе

Существует еще более простой способ, который скрывает в себе всю сложность форматов. Это функция УправлениеКонтактнойИнформацией.СведенияОбАдресе. Она самостоятельно определяет формат данных и возвращает структуру, адаптированную под требования российского законодательства (с учетом ФИАС).

Проанализируем её преимущества:


// Значение - это содержимое колонки "ЗначенияПолей" или "Значение" (JSON)
Сведения = УправлениеКонтактнойИнформацией.СведенияОбАдресе(СтрокаТЧ.Значение);

Сообщить("Город: " + Сведения.Город);
Сообщить("Улица: " + Сведения.Улица);
Сообщить("Дом: " + Сведения.Дом);

Полезные советы при работе с адресами

Рассмотрим несколько нюансов, которые помогут избежать ошибок при разложении адреса:

1. Проверка на адрес РФ. Прежде чем разбирать адрес по полям «Регион», «Город», убедитесь, что это адрес внутри России. Для этого используйте УправлениеКонтактнойИнформациейКлиентСервер.ЭтоАдресРФ(СтрокаДанных). Если адрес иностранный, структура будет совершенно иной.

2. Использование идентификаторов ФИАС. В современных системах текстовое название улицы или города может измениться. В структуре, полученной через функции БСП, всегда присутствуют GUID (идентификаторы) объектов. Для сдачи отчетности или интеграции с внешними системами лучше опираться на них, а не на текст.

3. Обратное преобразование. Если вам нужно не только разложить адрес, но и собрать его обратно (например, после программного изменения индекса), используйте функцию УправлениеКонтактнойИнформацией.СформироватьПредставлениеАдреса(СтруктураАдреса). Она автоматически расставит запятые, сокращения (г., ул., д.) и сформирует корректную строку для вывода на печать.

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

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

← На главную