Обработка разбирает составные часты адреса с использованием Яндекс API.
Подобные решения есть и на Инфостарте, например , эта публикация //infostart.ru/public/587079/ .
Документацию Яндекса на эту тему можно найти здесь
https://tech.yandex.ru/maps/doc/geocoder/desc/concepts/About-docpage/
Функционал геокодирования, реализованный в обработке, мы использовали для:
- разбора данных по продажам торговых точек, получаемым из разных источников -это вторичные продажи в фарме -для схлопывания данных по одинаковым адресам
- проверки корректности контактной информации по контрагентам - в контактную информацию добавлялись геокоординаты - широта и долгота, эти данные используются для торговых представителей
Первоначальный вариант был еще на первой версии API, здесь рабочий вариант на сегодняшний день.
В обработке в поле Адрес указывается разбираемый адрес.
Кнопка Разобрать адрес вызывает функционал геокодирования Яндекса и результат отображает в форме обработки ниже.
Несколько примеров работы обработки
Первый пример - с неполным адресом . По введенному адресу Яндекс находит 10 похожих адресов.
Второй пример - с адресом, содержащим ошибки в написании. Тем не менее , использование Яндекс API дает отличный -единственный результат
Обработка сделана на управляемых формах, для разработчиков код приведен ниже.
// Адрес - вводится на форме и разбирается Яндексом
//
&НаКлиенте
Процедура Разобрать(Команда)
НайденныеАдреса.Очистить();
//НайденныеАдреса- таблица значений на форме
//
// Колонки (все колонки строки неограниченной длины)
//
// АдресИсправленный - Адрес , исправленный Яндексом
// Страна
// Регион
// Округ- округ/район
// Населенный пункт
// Улица
// Дом
Запрос = Новый HTTPСоединение("geocode-maps.yandex.ru", , , , , , Новый ЗащищенноеСоединениеOpenSSL());
АдресOutput = КаталогВременныхФайлов() + "geores.xml";
Запрос.Получить("1.x/?&geocode=" + Адрес, АдресOutput);
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.ОткрытьФайл(АдресOutput);
ПостроительDOM = Новый ПостроительDOM;
ДокументДОМ = ПостроительDOM.Прочитать(ЧтениеXML);
ЧтениеXML.Закрыть();
Найдено = ДокументДОМ.ПолучитьЭлементыПоИмени("featureMember");
Для каждого НайденныйАдрес из Найдено Цикл
НовыйАдрес=НайденныеАдреса.Добавить();
СписокTextСтрана = НайденныйАдрес.ПолучитьЭлементыПоИмени("CountryName");
Если СписокTextСтрана.Количество()>0 Тогда
Страна=СписокTextСтрана[0].ТекстовоеСодержимое;
НовыйАдрес.Страна=Страна;
КонецЕсли;
АдресИсправленный=Адрес;
СписокTextАдрес = НайденныйАдрес.ПолучитьЭлементыПоИмени("AddressLine");
Если СписокTextАдрес.Количество()>0 Тогда
АдресИсправленный=СписокTextАдрес[0].ТекстовоеСодержимое; //Адрес, исправленный Яндексом
КонецЕсли;
НовыйАдрес.АдресИсправленный=АдресИсправленный;
СписокTextРегион = НайденныйАдрес.ПолучитьЭлементыПоИмени("AdministrativeAreaName");
Если СписокTextРегион.Количество()>0 Тогда
Регион=СписокTextРегион[0].ТекстовоеСодержимое;
НовыйАдрес.Регион=Регион;
КонецЕсли;
СписокTextОкруг = НайденныйАдрес.ПолучитьЭлементыПоИмени("SubAdministrativeAreaName");
Если СписокTextОкруг.Количество()>0 Тогда
Округ=СписокTextОкруг[0].ТекстовоеСодержимое;
НовыйАдрес.Округ=Округ;
КонецЕсли;
СписокTextНаселенныйПункт = НайденныйАдрес.ПолучитьЭлементыПоИмени("LocalityName");
Если СписокTextНаселенныйПункт.Количество()>0 Тогда
НаселенныйПункт=СписокTextНаселенныйПункт[0].ТекстовоеСодержимое;
НовыйАдрес.НаселенныйПункт=НаселенныйПункт;
КонецЕсли;
СписокTextУлица = НайденныйАдрес.ПолучитьЭлементыПоИмени("ThoroughfareName");
Если СписокTextУлица.Количество()>0 Тогда
Улица=СписокTextУлица[0].ТекстовоеСодержимое;
НовыйАдрес.Улица=Улица;
КонецЕсли;
СписокTextДом = НайденныйАдрес.ПолучитьЭлементыПоИмени("PremiseNumber");
Если СписокTextДом.Количество()>0 Тогда
Дом= СписокTextДом[0].ТекстовоеСодержимое;
НовыйАдрес.Дом=Дом;
КонецЕсли;
КонецЦикла;
КонецПроцедуры