Работа с геопозиционированием в мобильной платформе 1С — задача, требующая учета множества факторов: от программного кода до специфических настроек операционной системы Android и аппаратных особенностей устройства. Часто разработчики сталкиваются с ситуацией, когда метод ОбновитьМестоположение возвращает Ложь, даже если спутники видны сторонними приложениями. Разберем подробно, почему это происходит и как обеспечить стабильное получение координат.
Прежде чем приступать к анализу кода, необходимо убедиться, что операционная система позволяет приложению 1С получать данные. Начиная с Android 6.0 и выше, наличие разрешений в манифесте приложения при сборке является необходимым, но не достаточным условием. Проанализируем основные системные барьеры:
ОбновитьМестоположение будет мгновенно возвращать Ложь.Рассмотрим правильную последовательность вызова методов. Одной из частых ошибок является попытка получить координаты без предварительной проверки доступности провайдера. Проанализируем пример кода, который демонстрирует надежный подход к инициализации геопозиционирования:
#Если МобильноеПриложениеКлиент Тогда
Если НЕ СредстваГеопозиционирования.ИспользованиеДанныхГеопозиционированияВключено() Тогда
ПоказатьПредупреждение(,"Средства геопозиционирования отключены в настройках устройства.", 60);
Возврат;
КонецЕсли;
ПровайдерGPS = СредстваГеопозиционирования.ПолучитьПровайдера("gps");
Если ПровайдерGPS = Неопределено Тогда
ПоказатьПредупреждение(,"Не найден провайдер ГЕОДанных ""gps"".", 60);
Возврат;
КонецЕсли;
// Устанавливаем достаточный таймаут, например, 60 секунд
Если СредстваГеопозиционирования.ОбновитьМестоположение(ПровайдерGPS.Имя, 60) Тогда
Местоположение = СредстваГеопозиционирования.ПолучитьПоследнееМестоположение(ПровайдерGPS.Имя);
Если НЕ Местоположение = Неопределено Тогда
Широта = Местоположение.Координаты.Широта;
Долгота = Местоположение.Координаты.Долгота;
// Дальнейшая обработка координат
КонецЕсли;
Иначе
ПоказатьПредупреждение(,"Не удалось получить актуальные координаты за отведенное время.", 60);
КонецЕсли;
#КонецЕсли
В данном примере мы сначала проверяем глобальную доступность геопозиционирования через ИспользованиеДанныхГеопозиционированияВключено(), затем ищем конкретный провайдер "gps" и только после этого инициируем обновление данных.
Выясним причину, по которой ОбновитьМестоположение может возвращать Ложь даже при активном GPS. Модулю GPS требуется время на получение альманаха и эфемерид от спутников (так называемый «холодный старт»). Если таймаут в методе 1С установлен слишком коротким (например, 30 секунд), приемник может просто не успеть зафиксировать позицию.
Рассмотрим альтернативный подход. Вместо жесткой привязки к "gps", попробуем использовать комбинированный метод через ПолучитьСамогоТочногоПровайдера(). Это позволит системе автоматически переключаться между GPS и данными сотовых вышек/Wi-Fi, что значительно ускоряет получение первичной позиции.
В некоторых релизах платформы (например, ветка 8.3.14) наблюдались особенности, когда ОбновитьМестоположение возвращает Истина, но последующий вызов ПолучитьПоследнееМестоположение выдает Неопределено. Это связано с внутренней задержкой записи данных в системный стек. В таких случаях проанализируем возможность использования асинхронных методов.
Вместо синхронного ожидания, которое блокирует интерфейс, рекомендуется использовать метод НачатьОбновлениеМестоположения. Это позволяет приложению получать уведомления об изменении координат в реальном времени. Как только устройство определит позицию с нужной точностью, сработает обработчик оповещения.
Разберем важный вопрос, касающийся сборки мобильного приложения. Для работы со СредстваГеопозиционирования ключ API Google Maps не требуется. Эти средства взаимодействуют напрямую с аппаратной частью устройства и стандартными сервисами Android (Fused Location Provider).
Ключ API необходим только в тех случаях, если вы планируете отображать интерактивные карты Google внутри своего приложения, использовать их слои или специфические сервисы геокодирования Google. Если ваша задача — просто получить широту и долготу для записи в документ, указывать ключ при сборке в сборщике мобильных приложений необязательно.
Для минимизации ошибок при получении координат на устройствах типа Asus, Samsung и других Android-планшетах, выполним следующие шаги:
НачатьОбновлениеМестоположения заранее (например, при открытии формы или начале маршрута), чтобы к моменту нажатия кнопки «Зафиксировать» приемник уже был активен.СредстваГеопозиционирования.ПолучитьПровайдера("network") как резервного варианта.Таким образом, успех работы с геопозиционированием в 1С зависит от комбинации корректных системных настроек Android, правильной обработки провайдеров в коде и понимания механизмов работы спутниковой навигации.