К статье
Практический материал

Разработка и Конфигурация · 12 мин

Как разбить адрес в 1С на составные части

Как разбить адрес в 1С на части: регион, город, улица, дом. Разбор методов КонтактнаяИнформацияСлужебный, JSON-структуры адреса и готовые примеры кода.

Задача разбить адрес в 1С возникает регулярно: нужно вывести город в отчёт, сгруппировать контрагентов по регионам, заполнить отдельные поля печатной формы или выгрузить данные во внешнюю систему, где адрес хранится по частям. Проблема в том, что в карточке контрагента или физического лица адрес обычно выглядит как единая строка вида «450000, Республика Башкортостан, г. Уфа, ул. Ленина, д. 5, кв. 12».

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

Ниже разобраны оба сценария: работа со структурированным адресом через штатные механизмы БСП и ручной разбор строки, когда типовые средства недоступны. Также приведены готовые фрагменты кода, проверка результата и типичные ошибки.

Как адрес хранится в типовых конфигурациях 1С

В конфигурациях на базе Библиотеки стандартных подсистем контактная информация (адреса, телефоны, email) хранится в табличной части «КонтактнаяИнформация» справочников — контрагентов, физических лиц, организаций, партнёров. У каждой строки есть поля «Значение» (структурированное представление в JSON или XML) и «ЗначенияПолей» (старый формат XML), а также «Представление» — та самая строка, которую видит пользователь.

Ключевой момент: «Представление» — это производная строка, собранная из структурированного значения. Разбирать её обратно по запятым — плохая идея, потому что формат представления зависит от настроек и может меняться. Правильный путь — работать с полем «Значение», где адрес уже разложен по элементам: субъект РФ, район, город, населённый пункт, улица, дом, корпус, квартира.

Способ 1: разбор адреса через РаботаСАдресами (БСП)

Штатный способ получить части адреса — обратиться к общему модулю РаботаСАдресами (в старых версиях БСП — УправлениеКонтактнойИнформацией или КонтактнаяИнформацияСлужебный). Модуль содержит функции преобразования значения контактной информации в структуру, из которой читаются отдельные поля.

Типовой алгоритм: получить строку контактной информации нужного вида (например, «Юридический адрес»), взять её поле «Значение», преобразовать в структуру и прочитать нужные свойства. Пример кода:

// Получаем контактную информацию контрагента

Для Каждого СтрокаКИ Из Контрагент.КонтактнаяИнформация Цикл

Если СтрокаКИ.Вид = Справочники.ВидыКонтактнойИнформации.ЮрАдресКонтрагента Тогда

// Преобразуем JSON в структуру адреса

АдресСтруктурой = РаботаСАдресами.СведенияОбАдресе(СтрокаКИ.Значение);

Регион = АдресСтруктурой.СубъектРФ;

Город = АдресСтруктурой.Город;

Улица = АдресСтруктурой.Улица;

Индекс = АдресСтруктурой.Индекс;

// Дом, корпус, квартира лежат во вложенной коллекции

Для Каждого Строение Из АдресСтруктурой.Здания Цикл

НомерДома = Строение.Номер;

КонецЦикла;

КонецЕсли;

КонецЦикла;

Точный состав свойств структуры зависит от версии БСП: в одних релизах есть «Здания» и «Помещения» как коллекции, в других поля называются иначе. Чтобы увидеть реальный состав, достаточно в отладчике посмотреть значение, возвращаемое функцией СведенияОбАдресе, на конкретной базе.

Способ 2: чтение JSON-значения напрямую

Если функции БСП по какой-то причине недоступны (например, доработка внешней обработки без привязки к конкретной версии), JSON-значение адреса можно прочитать стандартными средствами платформы — объектом ЧтениеJSON. Это универсальный подход, работающий на любой современной платформе 8.3.

Функция РазобратьАдресJSON(ЗначениеКИ)

Результат = Новый Структура("Регион, Город, Улица, Индекс", "", "", "", "");

ЧтениеJSON = Новый ЧтениеJSON;

ЧтениеJSON.УстановитьСтроку(ЗначениеКИ);

ДанныеАдреса = ПрочитатьJSON(ЧтениеJSON); // структура/соответствие

ЧтениеJSON.Закрыть();

// Поля зависят от формата; типичные имена:

// area — регион, city — город, street — улица, zipCode — индекс

Если ТипЗнч(ДанныеАдреса) = Тип("Соответствие") Тогда

Результат.Регион = ДанныеАдреса.Получить("area");

Результат.Город = ДанныеАдреса.Получить("city");

Результат.Улица = ДанныеАдреса.Получить("street");

Результат.Индекс = ДанныеАдреса.Получить("zipCode");

КонецЕсли;

Возврат Результат;

КонецФункции

Имена полей в JSON соответствуют формату XDTO-пакета контактной информации и могут отличаться: например, населённый пункт передаётся в поле locality, район — district, дом — houseNumber. Надёжнее всего один раз вывести JSON конкретного адреса в сообщение и посмотреть фактические имена полей.

1c
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(СтрокаКИ.Значение);
ДанныеАдреса = ПрочитатьJSON(ЧтениеJSON);
ЧтениеJSON.Закрыть();
Регион = ДанныеАдреса.Получить("area");

Способ 3: разбор адреса-строки через СтрРазделить

Когда адрес хранится простой строкой (самописная конфигурация, импорт из Excel, старые данные), остаётся разбор по разделителю. В современной платформе для этого есть функция СтрРазделить(), в старых режимах совместимости — цикл по СтрПолучитьСтроку после замены запятых на символ перевода строки.

Функция РазбитьАдресСтроку(АдресСтрокой)

Части = СтрРазделить(АдресСтрокой, ",");

Результат = Новый Массив;

Для Каждого Часть Из Части Цикл

Результат.Добавить(СокрЛП(Часть));

КонецЦикла;

Возврат Результат; // [0] — индекс, [1] — регион, [2] — город и т.д.

КонецФункции

Главная проблема этого способа — непредсказуемость порядка и количества частей. В одном адресе может быть район, в другом — нет; индекс может отсутствовать; внутри названия города запятых нет, но встречаются сокращения «г.», «ул.», «д.», которые приходится отдельно вырезать функциями СтрЗаменить или регулярными выражениями. Поэтому разбор строки стоит считать запасным вариантом и всегда сопровождать проверкой количества полученных частей.

Типичные ошибки
01
Разбор поля «Представление» по запятым в типовой конфигурации — формат представления меняется между релизами, и код ломается после обновления
02
Отсутствие проверки количества частей после СтрРазделить — при адресе без района или индекса обращение по индексу вызывает ошибку
03
Игнорирование пустого поля «Значение»: у части адресов, введённых до перехода на ФИАС, заполнено только «ЗначенияПолей» в старом XML-формате
04
Сравнение вида контактной информации по наименованию строкой вместо ссылки на предопределённый элемент справочника

Как получить дом, корпус и квартиру

Мелкие элементы адреса — самая неоднородная часть. В структурированном формате номер дома хранится в коллекции «Здания» (тип здания: дом, владение, строение), корпус и литера могут быть отдельными элементами, а квартира — в коллекции «Помещения» (квартира, офис, комната). Обходить их нужно циклом, суммируя или выбирая по типу.

При разборе строки номера дома и квартиры обычно находятся в последних частях массива и содержат префиксы «д.», «к.», «кв.», «оф.». Практичный приём — идти по массиву с конца и забирать части, пока встречаются эти маркеры, а всё остальное считать улицей и населённым пунктом. Это устойчивее, чем жёсткая привязка к позициям.

Если адреса нужно разбить массово — например, для миграции или отчёта по всем контрагентам — обрабатывайте их пакетно через запрос к табличной части КонтактнаяИнформация, а не перебором объектов справочника. Это существенно быстрее и не блокирует базу на больших объёмах.
ПЗ
Практическое замечание

Проверка результата и обработка нестандартных адресов

После разбора обязательно проверяйте результат на реальных данных. Минимальный набор проверок: все ли части заполнены, не попал ли индекс в поле города (это происходит при отсутствии запятой после индекса), не осталось ли в полях служебных сокращений «г.», «ул.». Для массовой обработки полезно собирать статистику: сколько адресов разобрано полностью, сколько — с пропусками, сколько — не удалось разобрать.

Отдельная категория — адреса, введённые вручную в свободной форме или загруженные из внешних источников. У них поле «Значение» может быть пустым, а «Представление» — произвольным текстом. Такие записи разумно выводить в отдельный список для ручной обработки, а не пытаться разобрать автоматически любой ценой: ошибочно разбитый адрес хуже, чем помеченный как нестандартный.

Контрольные точки

Как проверить результат

Состав частей адреса
Норма

Регион, город, улица, дом попали в свои поля без посторонних символов

Тревожный признак

Индекс или номер дома оказались в поле города или улицы

Пустые значения
Норма

Отсутствующие элементы (например, район) остаются пустыми строками

Тревожный признак

Программа падает с ошибкой обращения по индексу или подставляет соседнее поле

Массовая обработка
Норма

Доля неразобранных адресов мала, все они собраны в отдельный список

Тревожный признак

Ошибки разбора замалчиваются, неверные данные попадают в отчёт или выгрузку

Что выбрать в разных ситуациях

Выбор способа определяется источником данных и задачей. Для типовой конфигурации всегда начинайте со штатных функций БСП — это самый устойчивый к обновлениям вариант. Для внешних обработок, которые должны работать на разных базах, надёжнее чтение JSON платформенными средствами. Разбор строки оставьте для импорта устаревших и внешних данных.

Маршрут решения

Как выбрать действие

Типовая конфигурация на БСП, адрес введён через форму контактной информацииИспользуйте РаботаСАдресами.СведенияОбАдресе() по полю Значение
Внешняя обработка, версия БСП неизвестнаЧитайте поле Значение через ЧтениеJSON и извлекайте поля по именам
Адрес — обычная строка из Excel, CSV или старой базыРазбирайте через СтрРазделить по запятой с проверкой числа частей
Поле Значение пустое, заполнено только ПредставлениеВыносите запись в список на ручную обработку, не разбирайте автоматически
Итог

Что важно запомнить

В типовых 1С адрес уже хранится разбитым по полям в JSON/XML — разбирать строку-представление не нужно. Используйте функции БСП или ЧтениеJSON, а разбор по запятым применяйте только для внешних данных, обязательно проверяя результат.

Частые вопросы

Можно ли разбить адрес без программирования, типовыми средствами?

Частично. В отчётах на СКД можно вывести отдельные поля контактной информации, если конфигурация предоставляет соответствующие реквизиты. Но произвольный разбор на регион, город и улицу без кода доступен не везде — обычно требуется либо доработка отчёта, либо обработка.

Чем отличаются поля «Значение» и «ЗначенияПолей» в табличной части контактной информации?

«Значение» — актуальный формат хранения в JSON, используемый современными версиями БСП. «ЗначенияПолей» — устаревший XML-формат, который сохраняется для совместимости. При разборе ориентируйтесь на «Значение», а XML используйте как запасной источник для старых записей.

Почему после обновления конфигурации перестал работать код разбора адреса?

Чаще всего потому, что код разбирал строку-представление по запятым, а формат представления изменился, либо переименовали общий модуль БСП. Разбор через структурированное значение устойчивее, но имена функций тоже стоит проверять после крупных обновлений.

Как разбить адрес, если он введён иностранный, не по ФИАС?

Иностранные адреса в БСП хранятся с произвольной структурой — поля зависят от страны. В JSON такого адреса заполнены не все стандартные поля. Обрабатывайте их отдельной веткой логики: проверяйте код страны и забирайте доступные поля, не рассчитывая на наличие «СубъектРФ» или «Город».

Можно ли разбить адреса массово для всех контрагентов сразу?

Да. Напишите запрос к табличной части КонтактнаяИнформация с отбором по виду адреса, выгрузите результат и в цикле применяйте функцию разбора к полю Значение каждой строки. Такой подход не требует открытия карточек и выполняется быстро даже на больших справочниках.

Что делать, если часть адресов введена в свободной форме без структуры?

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