Как в 1С программно преобразовать адрес из строки в структуру (по полям ФИАС/ГАР)

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

При разработке в среде 1С часто возникает задача преобразования «сырой» строки адреса (например, «г. Москва, ул. Ленина, д. 1») в структурированный вид, где отдельно выделены город, улица, номер дома и индекс. Это необходимо для правильного хранения контактной информации в базе данных и корректного обмена с государственными информационными системами. В библиотеке стандартных подсистем (БСП) для этого предусмотрены специальные механизмы, однако их работа имеет свои нюансы, которые мы подробно разберем ниже.

Использование метода СформироватьАдресПоПредставлению

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

Проанализируем пример вызова функции:


// Пример использования в конфигурациях на базе БСП
ПредставлениеАдреса = "г. Королев мкр Болшево, пер. 2-ой Гражданский, 12";
Результат = УправлениеКонтактнойИнформациейСлужебный.СформироватьАдресПоПредставлению(ПредставлениеАдреса);

Эта функция пытается сопоставить переданный текст с данными, имеющимися в адресном классификаторе. Однако стоит учитывать важный момент: если в системе не подключена подсистема «Адресный классификатор» или не загружены данные по конкретному региону, функция может вернуть результат в типе addressType = ВСвободнойФорме. Это означает, что система не смогла однозначно сопоставить части строки с объектами ФИАС/ГАР.

Разбор адреса без использования классификатора

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

Рассмотрим, как это работает программно:


// Метод позволяет попытаться выделить части адреса даже без актуальной базы ФИАС
ТекстАдреса = "141070, Московская обл, Королев г, Болшево мкр, 2-ой Гражданский пер, дом 12";
СтруктураАдреса = УправлениеКонтактнойИнформациейСлужебный.РаспределитьАдресПоПолямБезКлассификатора(ТекстАдреса);

// В результате мы получим структуру с заполненными полями, такими как:
// СтруктураАдреса.Город
// СтруктураАдреса.Улица
// СтруктураАдреса.Дом

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

Автоподбор вариантов через АдресныйКлассификаторСлужебный

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

Этот метод возвращает массив подходящих объектов классификатора. Посмотрим на пример вызова:


ТекстПоиска = "г. Королев, пер. 2-ой Г";
ДополнительныеПараметры = Новый Структура;
ДополнительныеПараметры.Вставить("Уровни", "Регион,Город,НаселенныйПункт,Улица");

Варианты = АдресныйКлассификаторСлужебный.ВариантыАвтоподбора(ТекстПоиска, ДополнительныеПараметры);

Для Каждого Вариант Из Варианты Цикл
    // Проанализируем найденные соответствия
    Сообщить(Вариант.Представление);
КонецЦикла;

Почему адрес определяется как «В свободной форме»?

Часто программисты сталкиваются с тем, что даже при наличии всех сокращений (г., мкр., пер.) система возвращает адрес как неструктурированную строку. Проанализируем основные причины такой ситуации:

  1. Отсутствие подсистемы: В некоторых старых или сильно переработанных конфигурациях вызов функций БСП может натыкаться на проверку ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.АдресныйКлассификатор"). Если подсистема не зарегистрирована, адрес всегда будет записываться в Value как строка.
  2. Проблемы с ГАР/ФИАС: Если в строке указан «микрорайон», который в классификаторе числится как «элемент планировочной структуры», а локальная база классификатора устарела, поиск не даст результата.
  3. Отсутствие индекса: Иногда для успешного сопоставления требуется наличие почтового индекса в начале строки.

Рекомендации по нормализации адресных строк

Чтобы повысить вероятность успешного разбора адреса средствами БСП, рекомендуется предварительно нормализовать строку. Рассмотрим несколько шагов для совместной работы с данными:

  1. Убедитесь, что между частями адреса стоят запятые.
  2. Удалите лишние пробелы в начале и конце строки.
  3. Проверьте, включен ли в базе «1С:Облачный классификатор». Использование облачного сервиса значительно повышает точность разбора по сравнению с локальным КЛАДРом или ФИАСом, так как облако использует алгоритмы нечеткого поиска.
  4. В современных конфигурациях (БСП 3.1.5+) для разбора лучше использовать методы общего модуля РаботаСАдресами, такие как РаботаСАдресамиКлиентСервер.АдресИзПредставления.

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

← На главную