При разработке отчетов или внешних обработок в 1С:Зарплата и управление персоналом (ЗУП 3.1) часто возникает задача разделить полное строковое представление адреса на составляющие: индекс, регион, город, улицу, дом и квартиру. В современных конфигурациях на базе БСП (Библиотека стандартных подсистем) адрес хранится не просто строкой, а в виде структурированных данных (XML или JSON) в табличных частях. Разберем подробно, какие инструменты предоставляет платформа для решения этой задачи.
Прежде чем приступать к коду, проанализируем, где именно лежат данные. В справочнике ФизическиеЛица (или Организации) есть табличная часть КонтактнаяИнформация. В ней нас интересуют два ключевых реквизита:
Для корректного разложения адреса мы будем использовать именно реквизит ЗначенияПолей, так как парсинг обычной строки «через запятую» крайне ненадежен из-за вариативности ввода.
Самый правильный и универсальный способ — использование функций общего модуля УправлениеКонтактнойИнформацией. Рассмотрим пример получения структуры адреса для физического лица. Выясним, как получить данные напрямую из объекта.
// Получаем контактную информацию объекта (например, Юридический адрес)
ВидИнформации = Справочники.ВидыКонтактнойИнформации.ЮрАдресОрганизации;
Информация = УправлениеКонтактнойИнформацией.КонтактнаяИнформацияОбъекта(ОбъектСсылка, ВидИнформации);
// Проверяем наличие данных
Если Информация.Количество() > 0 Тогда
// В современных версиях данные хранятся в формате JSON
ЗначениеПолей = Информация[0].Значение;
ТипАдреса = Перечисления.ТипыКонтактнойИнформации.Адрес;
// Преобразуем JSON в структуру
СтруктураАдреса = УправлениеКонтактнойИнформациейСлужебный.JSONВКонтактнуюИнформациюПоПолям(ЗначениеПолей, ТипАдреса);
КонецЕсли;
В результате мы получим соответствие или структуру, где ключами будут являться английские или русские наименования элементов (например, city, street, houseNumber). Проанализируем ситуацию: если в базе данных все еще хранятся старые записи в формате XML, этот метод может потребовать уточнения.
Если ваша база прошла долгий путь обновлений, часть адресов может храниться в формате XML. Для таких случаев в ЗУП 3.1 предусмотрена функция ПредыдущаяСтруктураКонтактнойИнформацииXML. Посмотрим на пример кода, который преобразует XML в понятную структуру:
// Данные - это значение реквизита "ЗначенияПолей" из табличной части
Функция ПолучитьСтруктуруИзXML(ДанныеXML, ВидАдреса)
// Функция возвращает структуру со всеми полями: Регион, Город, Улица и т.д.
Структура = УправлениеКонтактнойИнформацией.ПредыдущаяСтруктураКонтактнойИнформацииXML(ДанныеXML, ВидАдреса);
Возврат Структура;
КонецФункции
Важный момент: состав полей в такой структуре будет включать Регион, Город, Район, НаселенныйПункт, Улица, Дом, Корпус, Квартира. Это позволяет легко обращаться к ним через точку, например: Структура.Город.
В актуальных версиях ЗУП (3.1.10 и выше) 1С активно использует формат JSON. Чтобы не писать разные обработчики для XML и JSON, рекомендуется использовать «обертки» БСП. Разберем по шагам, как универсально получить данные:
КонтактнаяИнформация, получая поле ЗначенияПолей.КонтактнаяИнформацияВФорматеJSON для приведения данных к единому стандарту.Рассмотрим пример реализации в цикле при обработке списка сотрудников:
Для Каждого СтрокаТЧ Из ФизЛицо.КонтактнаяИнформация Цикл
Если СтрокаТЧ.Вид = НужныйВидАдреса Тогда
// Используем современный парсер
АдресОбъект = УправлениеКонтактнойИнформациейСлужебный.JSONВКонтактнуюИнформациюПоПолям(СтрокаТЧ.Значение, Перечисления.ТипыКонтактнойИнформации.Адрес);
// Обратите внимание, ключи в JSON могут отличаться от XML
Индекс = АдресОбъект["ZIPcode"];
Регион = АдресОбъект["area"];
Город = АдресОбъект["city"];
Улица = АдресОбъект["street"];
НомерДома = АдресОбъект["houseNumber"];
// Для квартир и строений часто используются вложенные коллекции
Если АдресОбъект.Property("apartments") Тогда
Квартира = АдресОбъект["apartments"][0]["number"];
КонецЕсли;
КонецЕсли;
КонецЦикла;
Существует еще более простой способ, который скрывает в себе всю сложность форматов. Это функция УправлениеКонтактнойИнформацией.СведенияОбАдресе. Она самостоятельно определяет формат данных и возвращает структуру, адаптированную под требования российского законодательства (с учетом ФИАС).
Проанализируем её преимущества:
// Значение - это содержимое колонки "ЗначенияПолей" или "Значение" (JSON)
Сведения = УправлениеКонтактнойИнформацией.СведенияОбАдресе(СтрокаТЧ.Значение);
Сообщить("Город: " + Сведения.Город);
Сообщить("Улица: " + Сведения.Улица);
Сообщить("Дом: " + Сведения.Дом);
Рассмотрим несколько нюансов, которые помогут избежать ошибок при разложении адреса:
1. Проверка на адрес РФ. Прежде чем разбирать адрес по полям «Регион», «Город», убедитесь, что это адрес внутри России. Для этого используйте УправлениеКонтактнойИнформациейКлиентСервер.ЭтоАдресРФ(СтрокаДанных). Если адрес иностранный, структура будет совершенно иной.
2. Использование идентификаторов ФИАС. В современных системах текстовое название улицы или города может измениться. В структуре, полученной через функции БСП, всегда присутствуют GUID (идентификаторы) объектов. Для сдачи отчетности или интеграции с внешними системами лучше опираться на них, а не на текст.
3. Обратное преобразование. Если вам нужно не только разложить адрес, но и собрать его обратно (например, после программного изменения индекса), используйте функцию УправлениеКонтактнойИнформацией.СформироватьПредставлениеАдреса(СтруктураАдреса). Она автоматически расставит запятые, сокращения (г., ул., д.) и сформирует корректную строку для вывода на печать.
4. Работа со "свободным вводом". Иногда пользователи вводят адрес текстом, не выбирая его из классификатора. В этом случае поле ЗначенияПолей может быть пустым или содержать только общую строку. Рекомендуем всегда предусматривать проверку: если структурированные данные получить не удалось, придется работать с реквизитом Представление как с обычной строкой, хотя это и снижает точность обработки.
Таким образом, мы выяснили, что для разложения адреса в структуру в ЗУП 3.1 наиболее эффективно использовать методы модуля УправлениеКонтактнойИнформацией. Это гарантирует корректную работу кода даже после обновлений конфигурации и перехода на новые стандарты хранения данных. Для быстрого поиска готовых примеров программного кода можно использовать справочник по методам БСП с примерами использования.