Почему функция ПолучитьМестоположениеПоАдресу возвращает Неопределено в мобильном приложении 1С и как это исправить?

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

При разработке мобильных решений на платформе 1С:Предприятие часто возникает задача определения географических координат по текстовому адресу (прямое геокодирование) или получения адреса по известным координатам (обратное геокодирование). Разберем типичную ситуацию, когда вызов штатного метода ПолучитьМестоположениеПоАдресу возвращает значение Неопределено даже при наличии интернет-соединения и корректно сформированных данных.

Анализ исходного кода и проявления проблемы

Рассмотрим стандартный программный код, используемый для получения координат и последующего отображения точки на карте:


СтруктураДанныхАдреса = Новый Структура();
СтруктураДанныхАдреса.Вставить("Страна", Объект.Страна);
СтруктураДанныхАдреса.Вставить("Город", Объект.Город);
СтруктураДанныхАдреса.Вставить("Улица", Объект.Улица);
СтруктураДанныхАдреса.Вставить("Дом", Объект.Дом);

ДанныеАдреса = Новый ДанныеАдреса(СтруктураДанныхАдреса);
Координаты = ПолучитьМестоположениеПоАдресу(ДанныеАдреса);

Если Координаты <> Неопределено Тогда
    ПоказатьНаКарте(Координаты);
Иначе
    Сообщить("Не удалось определить координаты по указанному адресу.");
КонецЕсли;

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

Причины сбоя встроенных механизмов геокодирования

Штатные методы геопозиционирования и картографии мобильной платформы 1С на операционной системе Android опираются на нативные службы Google Play Services. Выделим ключевые факторы, из-за которых платформа не может получить ответ от картографического сервиса:

  1. Отсутствие ключа Google API в конфигурации сборщика: При сборке мобильного приложения в «Сборщике мобильных приложений 1С» необходимо явно указывать API-ключ для сервисов Google. Если включено разрешение «Геопозиционирование», но ключ не задан, инструменты работы с картами и геокодированием блокируются на уровне платформы.
  2. Неактивные API в Google Cloud Console: Для полноценной работы штатных функций одного лишь создания проекта недостаточно. В консоли разработчика Google должны быть активированы сервисы Geocoding API (для работы методов ПолучитьМестоположениеПоАдресу и ПолучитьАдресПоМестоположению) и Maps SDK for Android (для вызова ПоказатьНаКарте).
  3. Отсутствие привязанного платежного профиля (Billing Account): Политика Google требует обязательной привязки платежного аккаунта к проекту в Google Cloud. Без этого бесплатный лимит запросов не активируется, и все внешние вызовы к Geocoding API отклоняются сервером со статусом ошибки.
  4. Ограничения ключа по сертификату и пакету: Если для ключа заданы ограничения (Key Restrictions), цифровой отпечаток сертификата SHA-1 и имя пакета (Package Name) должны строго совпадать с файлом хранилища ключей (Keystore), которым подписан итоговый APK-пакет.
  5. Устройства без Google Mobile Services (GMS): На смартфонах без предустановленных сервисов Google нативные функции геокодирования 1С работать не смогут.

Пошаговое решение: настройка проекта и сборщика приложений

Разберем по шагам, как настроить окружение и правильно собрать мобильное приложение 1С:

  1. Создание проекта и ключа в Google Cloud Console: Перейдем в консоль разработчика Google Cloud, создадим новый проект и активируем в библиотеке API библиотеки Geocoding API и Maps SDK for Android.
  2. Привязка биллинга: Убедимся, что к проекту подключен активный платежный аккаунт, иначе запросы к API будут блокироваться.
  3. Настройка разрешений ключа: При создании учетных данных (Credentials -> API Key) укажем ограничения по имени пакета Android-приложения и SHA-1 отпечатку сертификата подписи вашего мобильного приложения.
  4. Указание ключа в Сборщике мобильных приложений 1С: Откроем конфигурацию «Сборщик мобильных приложений», перейдем в параметры собираемого приложения и в поле настроек ключей карт Google укажем полученный API-ключ.
  5. Проверка разрешений в манифесте: Убедимся, что для приложения установлены разрешения на использование интернета и геолокации (доступ к точному и примерному местоположению).

Рекомендации по заполнению объекта ДанныеАдреса

Посмотрим на структуру объекта ДанныеАдреса. Для минимизации ошибок распознавания поисковым алгоритмом передаваемые сведения должны быть максимально полными. Конструктор принимает структуру, которая может содержать следующие ключи:


СтруктураДанныхАдреса = Новый Структура();
СтруктураДанныхАдреса.Вставить("Страна", "Россия");
СтруктураДанныхАдреса.Вставить("Регион", "Московская область");
СтруктураДанныхАдреса.Вставить("Район", "");
СтруктураДанныхАдреса.Вставить("Город", "Москва");
СтруктураДанныхАдреса.Вставить("НаселенныйПункт", "");
СтруктураДанныхАдреса.Вставить("Улица", "Тверская");
СтруктураДанныхАдреса.Вставить("Дом", "1");
СтруктураДанныхАдреса.Вставить("Корпус", "");
СтруктураДанныхАдреса.Вставить("Строение", "");
СтруктураДанныхАдреса.Вставить("Квартира", "");
СтруктураДанныхАдреса.Вставить("Индекс", "125009");

ДанныеАдреса = Новый ДанныеАдреса(СтруктураДанныхАдреса);

Указание региона и индекса существенно снижает вероятность неоднозначного поиска, особенно в случаях, когда улицы с одинаковыми названиями присутствуют в разных населенных пунктах.

Альтернативные варианты геокодирования и работы с картами

Если проект разрабатывается для устройств без сервисов Google или требуется независимость от встроенных механизмов ОС, рассмотрим альтернативные варианты реализации:

  1. Прямое геокодирование через HTTP-запросы: Выполним отправку запроса к любому картографическому REST API (Яндекс Карты, OpenStreetMap/Nominatim и др.) с помощью объектов HTTPСоединение и HTTPЗапрос. Ответ сервера обрабатывается стандартным объектом ЧтениеJSON, откуда извлекаются координаты широты и долготы.
  2. Интерактивная карта через «Поле HTML-документа»: Разместим на форме элемент с типом «Поле HTML-документа» и загрузим JavaScript-контейнер с интерактивной картой выбранного провайдера. Это позволит кастомизировать маркеры, отображать маршруты и полигоны без использования нативных системных библиотек.
  3. Открытие адреса во внешнем навигаторе: С помощью процедуры ЗапуститьПриложение можно передать строку адреса или координаты в установленные на мобильном устройстве навигационные программы через системные URL-схемы (geo: или intents).
← На главную