При разработке в среде 1С часто возникает задача преобразования «сырой» строки адреса (например, «г. Москва, ул. Ленина, д. 1») в структурированный вид, где отдельно выделены город, улица, номер дома и индекс. Это необходимо для правильного хранения контактной информации в базе данных и корректного обмена с государственными информационными системами. В библиотеке стандартных подсистем (БСП) для этого предусмотрены специальные механизмы, однако их работа имеет свои нюансы, которые мы подробно разберем ниже.
Одним из наиболее часто используемых инструментов в конфигурациях, использующих БСП (например, ЗУП, ERP, БП), является метод модуля УправлениеКонтактнойИнформациейСлужебный. Рассмотрим ситуацию, когда у нас есть строка адреса и нам нужно получить объект, разложенный по полям.
Проанализируем пример вызова функции:
// Пример использования в конфигурациях на базе БСП
ПредставлениеАдреса = "г. Королев мкр Болшево, пер. 2-ой Гражданский, 12";
Результат = УправлениеКонтактнойИнформациейСлужебный.СформироватьАдресПоПредставлению(ПредставлениеАдреса);
Эта функция пытается сопоставить переданный текст с данными, имеющимися в адресном классификаторе. Однако стоит учитывать важный момент: если в системе не подключена подсистема «Адресный классификатор» или не загружены данные по конкретному региону, функция может вернуть результат в типе addressType = ВСвободнойФорме. Это означает, что система не смогла однозначно сопоставить части строки с объектами ФИАС/ГАР.
Бывают случаи, когда адресный классификатор в базе не загружен полностью или строка содержит специфические сокращения, которые мешают точному поиску. В таких ситуациях мы можем воспользоваться методом распределения по полям на основе простых алгоритмов парсинга строк. В БСП для этого существует функция РаспределитьАдресПоПолямБезКлассификатора.
Рассмотрим, как это работает программно:
// Метод позволяет попытаться выделить части адреса даже без актуальной базы ФИАС
ТекстАдреса = "141070, Московская обл, Королев г, Болшево мкр, 2-ой Гражданский пер, дом 12";
СтруктураАдреса = УправлениеКонтактнойИнформациейСлужебный.РаспределитьАдресПоПолямБезКлассификатора(ТекстАдреса);
// В результате мы получим структуру с заполненными полями, такими как:
// СтруктураАдреса.Город
// СтруктураАдреса.Улица
// СтруктураАдреса.Дом
Выясним причину, по которой этот метод может быть полезен. Он не требует обращения к тяжелым таблицам классификатора и работает значительно быстрее, если вам нужно просто первичное разделение строки на составляющие по запятым и ключевым сокращениям (г., ул., д. и т.д.).
Для реализации интерактивного ввода или программного поиска наиболее подходящего адреса из списка существующих в системе, можно использовать методы автоподбора. Разберем работу функции ВариантыАвтоподбора, которая часто встречается в современных версиях БСП.
Этот метод возвращает массив подходящих объектов классификатора. Посмотрим на пример вызова:
ТекстПоиска = "г. Королев, пер. 2-ой Г";
ДополнительныеПараметры = Новый Структура;
ДополнительныеПараметры.Вставить("Уровни", "Регион,Город,НаселенныйПункт,Улица");
Варианты = АдресныйКлассификаторСлужебный.ВариантыАвтоподбора(ТекстПоиска, ДополнительныеПараметры);
Для Каждого Вариант Из Варианты Цикл
// Проанализируем найденные соответствия
Сообщить(Вариант.Представление);
КонецЦикла;
Часто программисты сталкиваются с тем, что даже при наличии всех сокращений (г., мкр., пер.) система возвращает адрес как неструктурированную строку. Проанализируем основные причины такой ситуации:
ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.АдресныйКлассификатор"). Если подсистема не зарегистрирована, адрес всегда будет записываться в Value как строка.Чтобы повысить вероятность успешного разбора адреса средствами БСП, рекомендуется предварительно нормализовать строку. Рассмотрим несколько шагов для совместной работы с данными:
РаботаСАдресами, такие как РаботаСАдресамиКлиентСервер.АдресИзПредставления.Подводя итог, можно сказать, что типовые методы в БСП существуют и они достаточно мощные. Основная проблема зачастую заключается не в отсутствии функций, а в состоянии данных самого классификатора внутри информационной базы или в настройках доступа к веб-сервисам 1С.