Почему СредстваГеопозиционирования.ОбновитьМестоположение возвращает ложь и как это исправить

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

Работа с геопозиционированием в мобильной платформе 1С — задача, требующая учета множества факторов: от программного кода до специфических настроек операционной системы Android и аппаратных особенностей устройства. Часто разработчики сталкиваются с ситуацией, когда метод ОбновитьМестоположение возвращает Ложь, даже если спутники видны сторонними приложениями. Разберем подробно, почему это происходит и как обеспечить стабильное получение координат.

Проверка системных разрешений и настроек устройства

Прежде чем приступать к анализу кода, необходимо убедиться, что операционная система позволяет приложению 1С получать данные. Начиная с Android 6.0 и выше, наличие разрешений в манифесте приложения при сборке является необходимым, но не достаточным условием. Проанализируем основные системные барьеры:

  1. Разрешения среды выполнения (Runtime Permissions): Пользователь должен вручную подтвердить доступ к геолокации в настройках планшета или смартфона для конкретного приложения 1С. Если доступ запрещен на уровне системы, метод ОбновитьМестоположение будет мгновенно возвращать Ложь.
  2. Режим энергосбережения (Doze Mode): В Android 7.0 и выше агрессивные алгоритмы экономии заряда могут блокировать работу GPS-модуля для фоновых или «неприоритетных» по мнению системы приложений. Попробуем добавить мобильное приложение 1С в список исключений в разделе «Оптимизация расхода батареи».
  3. Точность геолокации: Убедимся, что в настройках Android выбран режим «По всем источникам» (GPS, Wi-Fi и мобильные сети). Иногда принудительный выбор режима «Только GPS» замедляет получение координат настолько, что метод 1С завершается по таймауту.

Корректная программная реализация получения координат

Рассмотрим правильную последовательность вызова методов. Одной из частых ошибок является попытка получить координаты без предварительной проверки доступности провайдера. Проанализируем пример кода, который демонстрирует надежный подход к инициализации геопозиционирования:


#Если МобильноеПриложениеКлиент Тогда
Если НЕ СредстваГеопозиционирования.ИспользованиеДанныхГеопозиционированияВключено() Тогда
    ПоказатьПредупреждение(,"Средства геопозиционирования отключены в настройках устройства.", 60);
    Возврат;
КонецЕсли;

ПровайдерGPS = СредстваГеопозиционирования.ПолучитьПровайдера("gps");

Если ПровайдерGPS = Неопределено Тогда
    ПоказатьПредупреждение(,"Не найден провайдер ГЕОДанных ""gps"".", 60);
    Возврат;
КонецЕсли;

// Устанавливаем достаточный таймаут, например, 60 секунд
Если СредстваГеопозиционирования.ОбновитьМестоположение(ПровайдерGPS.Имя, 60) Тогда
    Местоположение = СредстваГеопозиционирования.ПолучитьПоследнееМестоположение(ПровайдерGPS.Имя);
    Если НЕ Местоположение = Неопределено Тогда
        Широта = Местоположение.Координаты.Широта;
        Долгота = Местоположение.Координаты.Долгота;
        // Дальнейшая обработка координат
    КонецЕсли;
Иначе
    ПоказатьПредупреждение(,"Не удалось получить актуальные координаты за отведенное время.", 60);
КонецЕсли;
#КонецЕсли

В данном примере мы сначала проверяем глобальную доступность геопозиционирования через ИспользованиеДанныхГеопозиционированияВключено(), затем ищем конкретный провайдер "gps" и только после этого инициируем обновление данных.

Проблема холодного старта и выбора провайдера

Выясним причину, по которой ОбновитьМестоположение может возвращать Ложь даже при активном GPS. Модулю GPS требуется время на получение альманаха и эфемерид от спутников (так называемый «холодный старт»). Если таймаут в методе 1С установлен слишком коротким (например, 30 секунд), приемник может просто не успеть зафиксировать позицию.

Рассмотрим альтернативный подход. Вместо жесткой привязки к "gps", попробуем использовать комбинированный метод через ПолучитьСамогоТочногоПровайдера(). Это позволит системе автоматически переключаться между GPS и данными сотовых вышек/Wi-Fi, что значительно ускоряет получение первичной позиции.

Особенности платформы и кэширование данных

В некоторых релизах платформы (например, ветка 8.3.14) наблюдались особенности, когда ОбновитьМестоположение возвращает Истина, но последующий вызов ПолучитьПоследнееМестоположение выдает Неопределено. Это связано с внутренней задержкой записи данных в системный стек. В таких случаях проанализируем возможность использования асинхронных методов.

Вместо синхронного ожидания, которое блокирует интерфейс, рекомендуется использовать метод НачатьОбновлениеМестоположения. Это позволяет приложению получать уведомления об изменении координат в реальном времени. Как только устройство определит позицию с нужной точностью, сработает обработчик оповещения.

Нужен ли ключ Google Maps для получения координат?

Разберем важный вопрос, касающийся сборки мобильного приложения. Для работы со СредстваГеопозиционирования ключ API Google Maps не требуется. Эти средства взаимодействуют напрямую с аппаратной частью устройства и стандартными сервисами Android (Fused Location Provider).

Ключ API необходим только в тех случаях, если вы планируете отображать интерактивные карты Google внутри своего приложения, использовать их слои или специфические сервисы геокодирования Google. Если ваша задача — просто получить широту и долготу для записи в документ, указывать ключ при сборке в сборщике мобильных приложений необязательно.

Рекомендации по стабильной работе

Для минимизации ошибок при получении координат на устройствах типа Asus, Samsung и других Android-планшетах, выполним следующие шаги:

Таким образом, успех работы с геопозиционированием в 1С зависит от комбинации корректных системных настроек Android, правильной обработки провайдеров в коде и понимания механизмов работы спутниковой навигации.

← На главную