Как обеспечить получение GPS-координат в фоновом режиме для мобильного APK-приложения на 1С

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

Разработка мобильных приложений на платформе 1С часто сопряжена с нюансами работы операционной системы Android, особенно когда речь идет о фоновых процессах. Типичная ситуация: в приложении «1С:Запуск» (утилите для разработчика) сбор координат работает идеально, но стоит собрать полноценный APK-файл, как получение данных прекращается сразу после сворачивания окна. В этой статье мы подробно разберем причины такого поведения и пошагово реализуем решение, которое позволит вашему приложению стабильно работать в фоне.

Анализируем стандартный подход к получению координат

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


ОписаниеОповещения = Новый ОписаниеОповещения("ОбработкаИзмененияМестоположения", ЭтотОбъект);
СредстваГеопозиционирования.ПодключитьОбработчикИзмененияМестоположения(
    ОписаниеОповещения, 
    "gps", 
    , 
    1
);

Здесь мы указываем, что хотим получать данные от спутников gps с минимальным интервалом в 1 секунду. Проблема заключается в том, что когда приложение свернуто, Android стремится максимально снизить энергопотребление. Разберемся, почему поведение «1С:Запуск» отличается от собранного APK.

Выясняем причины различий между APK и платформой разработчика

Многие разработчики ошибочно полагают, что APK-файл и приложение внутри мобильной платформы 1С должны вести себя идентично. Однако проанализируем ситуацию глубже:

  1. Контейнер разрешений: Приложение «1С:Демонстрация конфигураций» — это универсальный контейнер. При установке он запрашивает практически все возможные права. Android воспринимает его как доверенную среду с расширенными привилегиями.
  2. Манифест приложения: Собранный APK имеет собственный файл манифеста. Если в нем явно не указаны права на работу в фоне или не инициированы специфические системные службы, Android мгновенно блокирует доступ к GPS-модулю для «уснувшего» приложения.
  3. Политика энергосбережения: Начиная с Android 8.0 и выше, система накладывает жесткие ограничения на фоновые задания (Background Limits). Если приложение не активно, оно не может просто так «слушать» GPS, если оно не зарегистрировано как Foreground Service (заметная служба).

Обход ошибки платформы 10232643: «Лайфхак» с аудиозаписью

Одной из наиболее неочевидных причин сбоя является зарегистрированная ошибка в некоторых релизах мобильной платформы (например, 8.3.18, 8.3.19). Суть проблемы заключается в том, что штатный механизм геопозиционирования не всегда корректно сообщает системе Android о необходимости создать Foreground Service. Рассмотрим пошагово, как это исправить.

Как показывает практика и опыт разработчиков, для решения проблемы необходимо в свойствах мобильной конфигурации включить флаг «Запись аудио в фоновом режиме». Казалось бы, как связана аудиозапись и GPS? Дело в том, что активация этой настройки принудительно заставляет платформу 1С регистрировать ту самую «заметную службу» в Android. Это дает приложению легальное право продолжать выполнение кода и обращение к датчикам, даже если экран заблокирован.

Настройка разрешений в сборщике мобильных приложений

Чтобы приложение работало корректно, проанализируем настройки, которые необходимо выставить при сборке APK в «Сборщике мобильных приложений» или в свойствах конфигурации:

Настройка устройства на базе Android

Даже если программная часть выполнена верно, настройки самой ОС могут блокировать получение данных. Разберем, что необходимо проверить на конечном устройстве (смартфоне):

1. Разрешение «Разрешить в любом режиме». Зайдите в «Настройки» -> «Приложения» -> «Ваше приложение» -> «Разрешения» -> «Местоположение». Убедитесь, что выбран вариант «Разрешить в любом режиме» (Allow all the time). Если выбрано «Разрешить только во время использования», координаты в фоне приходить не будут.

2. Оптимизация батареи. Android по умолчанию пытается «оптимизировать» приложения. Найдите раздел «Батарея» или «Экономия заряда», выберите ваше приложение и установите режим «Не экономить» или «Без ограничений». Это предотвратит принудительную остановку процесса системы через некоторое время после сворачивания.

Дополнительные методы стабилизации работы

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

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


Процедура ПринудительныйОпросКоординат() Экспорт
    Данные = СредстваГеопозиционирования.ПолучитьПоследнееМестоположение();
    Если Данные <> Неопределено Тогда
        // Обработка полученных данных
    КонецЕсли;
КонецПроцедуры

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

Подведем итоги

Для стабильного получения GPS-координат в APK-файле 1С нам необходимо выполнить три условия:

  1. Активировать в конфигурации права на фоновую геолокацию и фоновую аудиозапись (как костыль для Foreground Service).
  2. В настройках Android вручную выдать право на доступ к местоположению «Всегда».
  3. Отключить оптимизацию батареи для конкретного приложения.

Соблюдение этих правил позволит вашему мобильному решению на базе 1С работать так же стабильно, как и нативные Android-приложения, обеспечивая точный трекинг в любых условиях.

← На главную