Получая координаты с maps.mail.ru по адресу(из КЛАДРА), выехав далеко за большой город сталкиваешься с отсутствием в их базе домов (а улица есть), улиц (а поселок есть). С сайта возвращается список адресов с искомой улицей но в других городах. Пришлось в обработке в функцию ПолучитьКординатыПоАдресуФНС() добавить повторный загрубленный поиск. Использовал из УПП РазложитьСтрокуВМассивПодстрок(). Результат стал существенно лучше. А вообще хорошая обработка.
Функция ПолучитьКординатыПоАдресуФНС(Адрес)
СтруктураАдреса = УправлениеКонтактнойИнформацией.ПолучитьСтруктуруАдресаИзСтроки(Адрес);
Регион=СтруктураАдреса.Регион;
//Если Найти(Регион,"Санкт-Петербург")=0 Тогда
//ОбщегоНазначения.СообщитьОбОшибке("Маршрут возможно определить только в Санкт-Петербурге");
// Возврат "";
//КонецЕсли;
//стрАдрес=СтруктураАдреса.Дом+?(СтруктураАдреса.Корпус="","","+"+СтруктураАдреса.Корпус)+","+СтруктураАдреса.Улица+ "," + СтруктураАдреса.НаселенныйПункт+ "," + СтруктураАдреса.Район+","+СтруктураАдреса.Регион;
стрАдрес=СтруктураАдреса.Регион +"," + СтруктураАдреса.Район +","+ СтруктураАдреса.Город +","+ СтруктураАдреса.НаселенныйПункт + ","+СтруктураАдреса.Улица + "," + СтруктураАдреса.Дом+?(СтруктураАдреса.Корпус="","","+"+СтруктураАдреса.Корпус) ;
АдресUTF16=ПроцедураПреобразоватьСтрокуВUTF16(стрАдрес);
ДанныеСКоординатами=ПроцедураПолучитьДанныеССервера("GeoObjectSearch.aspx?SearchStringKey="+АдресUTF16);
//Разбор ответа сервера
СимволРазбиения="||";
// Если заполнен населенный пункт
СтрокаДанныеСКоординатами = Прав(ДанныеСКоординатами,СтрДлина(ДанныеСКоординатами)-Найти(ДанныеСКоординатами,"Path: '" )-6);
Если Найти(СтрокаДанныеСКоординатами,"; Российская Федерация, государство; ',") Тогда
СтрокаДанныеСКоординатами = Лев(СтрокаДанныеСКоординатами,Найти(СтрокаДанныеСКоординатами,"; Российская Федерация, государство; ',"));
Иначе
СтрокаДанныеСКоординатами = Лев(СтрокаДанныеСКоординатами,Найти(СтрокаДанныеСКоординатами,"; ', CntrLat:,"));
КонецЕсли;
МассивДанныеСКоординатами = ОбщегоНазначения.РазложитьСтрокуВМассивПодстрок(СтрокаДанныеСКоординатами, ";");
Если СтруктураАдреса.НаселенныйПункт <> "" Тогда
НаселенныйПунктМассив = ОбщегоНазначения.РазложитьСтрокуВМассивПодстрок(СтруктураАдреса.НаселенныйПункт, " ");
НаселенныйПункт = "";
Для к=0 По НаселенныйПунктМассив.Количество()-2 Цикл
НаселенныйПункт = НаселенныйПункт + НаселенныйПунктМассив[к]+ " ";
КонецЦикла;
НаселенныйПункт = СокрП(НаселенныйПункт);
ЕстьНаселенныйПункт = 0;
Для Каждого ЭлементМассива из МассивДанныеСКоординатами Цикл
Если Найти(ЭлементМассива,НаселенныйПункт) Тогда
ЕстьНаселенныйПункт = ЕстьНаселенныйПункт + 1;
КонецЕсли;
КонецЦикла;
Если ЕстьНаселенныйПункт = 0 Тогда
Сообщить("Мэйл не находит населенный пункт : " + НаселенныйПункт);
стрАдрес=СтруктураАдреса.Регион + "," + СтруктураАдреса.Район + "," + СтруктураАдреса.НаселенныйПункт ;
АдресUTF16=ПроцедураПреобразоватьСтрокуВUTF16(стрАдрес);
ДанныеСКоординатами=ПроцедураПолучитьДанныеССервера("GeoObjectSearch.aspx?SearchStringKey="+АдресUTF16);
ИначеЕсли СтруктураАдреса.Улица <> "" Тогда
УлицаМассив = ОбщегоНазначения.РазложитьСтрокуВМассивПодстрок(СтруктураАдреса.Улица, " ");
Улица = "";
Для к=0 По УлицаМассив.Количество()-2 Цикл
Улица = Улица + УлицаМассив[к]+ " ";
КонецЦикла;
Улица = СокрП(Улица);
ЕстьУлица = 0;
МассивДанныеСКоординатами = ОбщегоНазначения.РазложитьСтрокуВМассивПодстрок(СтрокаДанныеСКоординатами, ";");
Для Каждого ЭлементМассива из МассивДанныеСКоординатами Цикл
Если Найти(ЭлементМассива,Улица) Тогда
ЕстьУлица = ЕстьУлица + 1;
КонецЕсли;
КонецЦикла;
Если ЕстьУлица = 0 Тогда
Сообщить("Мэйл не находит улицу: " + Улица);
КонецЕсли;
КонецЕсли;
КонецЕсли;
Если СтруктураАдреса.Город <> "" Тогда
ГородМассив = ОбщегоНазначения.РазложитьСтрокуВМассивПодстрок(СтруктураАдреса.Город, " ");
Город = "";
Для к=0 По ГородМассив.Количество()-2 Цикл
Город = Город + ГородМассив[к]+ " ";
КонецЦикла;
Город = СокрЛП(Город);
ЕстьГород = 0;
Для Каждого ЭлементМассива из МассивДанныеСКоординатами Цикл
Если Найти(ЭлементМассива,Город) Тогда
ЕстьГород = ЕстьГород + 1;
КонецЕсли;
КонецЦикла;
Если ЕстьГород = 0 Тогда
Сообщить("Мэйл не находит город : " + Город);
стрАдрес=СтруктураАдреса.Регион +"," + СтруктураАдреса.Район +","+ СтруктураАдреса.Город +","+ СтруктураАдреса.НаселенныйПункт + ","+СтруктураАдреса.Улица;
АдресUTF16=ПроцедураПреобразоватьСтрокуВUTF16(стрАдрес);
ДанныеСКоординатами=ПроцедураПолучитьДанныеССервера("GeoObjectSearch.aspx?SearchStringKey="+АдресUTF16);
КонецЕсли;
КонецЕсли;
//Получить адрес
ДанныеСКоординатами=СтрЗаменить(ДанныеСКоординатами,"Path: '",СимволРазбиения);
ДанныеСКоординатами=СтрЗаменить(ДанныеСКоординатами,"; Российская Федерация, государство; ',",СимволРазбиения);
//%%% SolarGard - начало
ДанныеСКоординатами=СтрЗаменить(ДанныеСКоординатами,"; ', CntrLat: ",СимволРазбиения);
//%%% SolarGard - конец
ДанныеСКоординатами=СтрЗаменить(ДанныеСКоординатами,"CntrLat: ","");
ДанныеСКоординатами=СтрЗаменить(ДанныеСКоординатами,", CntrLon:",СимволРазбиения);
ДанныеСКоординатами=СтрЗаменить(ДанныеСКоординатами,", MinLat: ",СимволРазбиения);
мнчСтрока=СтрЗаменить(ДанныеСКоординатами,СимволРазбиения,Символы.ПС);
сч=1;
ТаблицаАдресов=Новый ТаблицаЗначений;
ТаблицаАдресов.Колонки.Добавить("Адрес",ОбщегоНазначения.ПолучитьОписаниеТиповСтроки(300));
ТаблицаАдресов.Колонки.Добавить("КоординатаX",ОбщегоНазначения.ПолучитьОписаниеТиповСтроки(30));
ТаблицаАдресов.Колонки.Добавить("КоординатаY",ОбщегоНазначения.ПолучитьОписаниеТиповСтроки(30));
//Если указан корпус, то mail.ru все равно возвращает несколько адресов
ВыбранныйАдрес=Неопределено;
Пока сч<СтрЧислоСтрок(мнчСтрока) Цикл
НоваяСтрока=ТаблицаАдресов.Добавить();
НоваяСтрока.Адрес=СтрПолучитьСтроку(мнчСтрока,сч+1);
//// Преобразование значения к типу Число не может быть выполнено !!!!!
Попытка
НоваяСтрока.КоординатаY=Формат(Число(СокрЛП(СтрПолучитьСтроку(мнчСтрока,сч+2))),"ЧГ=0;ЧРД=.");
НоваяСтрока.КоординатаX=Формат(Число(СокрЛП(СтрПолучитьСтроку(мнчСтрока,сч+3))),"ЧГ=0;ЧРД=.");
Исключение
КонецПопытки;
сч=сч+5;
//Если ЗначениеЗаполнено(СтруктураАдреса.Корпус) и Не ЗначениеЗаполнено(ВыбранныйАдрес) Тогда
//
// //Получаем первый корпус
// ВыбранныйАдрес=НоваяСтрока;
//
//КонецЕсли;
КонецЦикла;
//Если используется корпус
Если ТаблицаАдресов.Количество()>0 ТОгда
Возврат ТаблицаАдресов.Получить(0);
Иначе
Возврат Неопределено;
КонецЕсли
КонецФункции
// Функция "расщепляет" строку на подстроки, используя заданный
// разделитель. Разделитель может иметь любую длину.
// Если в качестве разделителя задан пробел, рядом стоящие пробелы
// считаются одним разделителем, а ведущие и хвостовые пробелы параметра Стр
// игнорируются.
// Например,
// РазложитьСтрокуВМассивПодстрок(",ку,,,му", ",") возвратит массив значений из пяти элементов,
// три из которых - пустые строки, а
// РазложитьСтрокуВМассивПодстрок(" ку му", " ") возвратит массив значений из двух элементов
//
// Параметры:
// Стр - строка, которую необходимо разложить на подстроки.
// Параметр передается по значению.
// Разделитель - строка-разделитель, по умолчанию - запятая.
//
//
// Возвращаемое значение:
// массив значений, элементы которого - подстроки
//
Функция РазложитьСтрокуВМассивПодстрок(Знач Стр, Разделитель = ",") Экспорт
МассивСтрок = Новый Массив();
Если Разделитель = " " Тогда
Стр = СокрЛП(Стр);
Пока Истина Цикл
Поз = Найти(Стр,Разделитель);
Если Поз=0 Тогда
МассивСтрок.Добавить(Стр);
Возврат МассивСтрок;
КонецЕсли;
МассивСтрок.Добавить(Лев(Стр,Поз-1));
Стр = СокрЛ(Сред(Стр,Поз));
КонецЦикла;
Иначе
ДлинаРазделителя = СтрДлина(Разделитель);
Пока Истина Цикл
Поз = Найти(Стр,Разделитель);
Если Поз=0 Тогда
МассивСтрок.Добавить(Стр);
Возврат МассивСтрок;
КонецЕсли;
МассивСтрок.Добавить(Лев(Стр,Поз-1));
Стр = Сред(Стр,Поз+ДлинаРазделителя);
КонецЦикла;
КонецЕсли;
КонецФункции // глРазложить