При разработке мобильных решений на платформе 1С:Предприятие часто возникает задача определения географических координат по текстовому адресу (прямое геокодирование) или получения адреса по известным координатам (обратное геокодирование). Разберем типичную ситуацию, когда вызов штатного метода ПолучитьМестоположениеПоАдресу возвращает значение Неопределено даже при наличии интернет-соединения и корректно сформированных данных.
Рассмотрим стандартный программный код, используемый для получения координат и последующего отображения точки на карте:
СтруктураДанныхАдреса = Новый Структура();
СтруктураДанныхАдреса.Вставить("Страна", Объект.Страна);
СтруктураДанныхАдреса.Вставить("Город", Объект.Город);
СтруктураДанныхАдреса.Вставить("Улица", Объект.Улица);
СтруктураДанныхАдреса.Вставить("Дом", Объект.Дом);
ДанныеАдреса = Новый ДанныеАдреса(СтруктураДанныхАдреса);
Координаты = ПолучитьМестоположениеПоАдресу(ДанныеАдреса);
Если Координаты <> Неопределено Тогда
ПоказатьНаКарте(Координаты);
Иначе
Сообщить("Не удалось определить координаты по указанному адресу.");
КонецЕсли;
При выполнении этого фрагмента на мобильном устройстве под управлением ОС Android функция ПолучитьМестоположениеПоАдресу (а также парный метод ПолучитьАдресПоМестоположению) может возвращать Неопределено. Проанализируем основные причины такого поведения платформы.
Штатные методы геопозиционирования и картографии мобильной платформы 1С на операционной системе Android опираются на нативные службы Google Play Services. Выделим ключевые факторы, из-за которых платформа не может получить ответ от картографического сервиса:
ПолучитьМестоположениеПоАдресу и ПолучитьАдресПоМестоположению) и Maps SDK for Android (для вызова ПоказатьНаКарте).Разберем по шагам, как настроить окружение и правильно собрать мобильное приложение 1С:
Посмотрим на структуру объекта ДанныеАдреса. Для минимизации ошибок распознавания поисковым алгоритмом передаваемые сведения должны быть максимально полными. Конструктор принимает структуру, которая может содержать следующие ключи:
СтруктураДанныхАдреса = Новый Структура();
СтруктураДанныхАдреса.Вставить("Страна", "Россия");
СтруктураДанныхАдреса.Вставить("Регион", "Московская область");
СтруктураДанныхАдреса.Вставить("Район", "");
СтруктураДанныхАдреса.Вставить("Город", "Москва");
СтруктураДанныхАдреса.Вставить("НаселенныйПункт", "");
СтруктураДанныхАдреса.Вставить("Улица", "Тверская");
СтруктураДанныхАдреса.Вставить("Дом", "1");
СтруктураДанныхАдреса.Вставить("Корпус", "");
СтруктураДанныхАдреса.Вставить("Строение", "");
СтруктураДанныхАдреса.Вставить("Квартира", "");
СтруктураДанныхАдреса.Вставить("Индекс", "125009");
ДанныеАдреса = Новый ДанныеАдреса(СтруктураДанныхАдреса);
Указание региона и индекса существенно снижает вероятность неоднозначного поиска, особенно в случаях, когда улицы с одинаковыми названиями присутствуют в разных населенных пунктах.
Если проект разрабатывается для устройств без сервисов Google или требуется независимость от встроенных механизмов ОС, рассмотрим альтернативные варианты реализации:
HTTPСоединение и HTTPЗапрос. Ответ сервера обрабатывается стандартным объектом ЧтениеJSON, откуда извлекаются координаты широты и долготы.ЗапуститьПриложение можно передать строку адреса или координаты в установленные на мобильном устройстве навигационные программы через системные URL-схемы (geo: или intents).