Как реализовать загрузку данных в фоновом режиме в мобильном приложении 1С по расписанию?

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

При разработке мобильных приложений на платформе 1С:Предприятие часто возникает задача синхронизации данных без участия пользователя. Например, когда приложение свернуто или телефон находится в кармане, данные должны подгружаться в локальную базу, чтобы при открытии пользователь сразу видел актуальную информацию. Однако стандартные механизмы мобильной платформы накладывают определенные ограничения. В этой статье мы подробно разберем, почему это сложно сделать «из коробки» и какие архитектурные подходы позволяют обойти эти ограничения.

Ограничения мобильной платформы 1С

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

Операционные системы (особенно Android версии 8.0 и выше и iOS) жестко ограничивают активность приложений, которые не находятся в фокусе пользователя, в целях экономии заряда батареи. Если операционная система видит, что приложение пытается выполнить ресурсоемкую операцию в фоне, она с большой вероятностью принудительно завершит процесс.

Использование механизмов Android для фоновых задач

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

  1. WorkManager (Android): Это современный стандарт для выполнения фоновых заданий. Рассмотрим его преимущества: он гарантирует выполнение задачи, даже если устройство будет перезагружено. Мы можем запланировать задачу с определенными условиями (например, «только при наличии Wi-Fi» или «только во время зарядки»).
  2. Foreground Service (Служба переднего плана): Если нам необходим гарантированный и непрерывный обмен (актуально для ТСД на складах), проанализируем использование Foreground Service. В этом случае в строке уведомлений пользователя всегда будет отображаться активная иконка приложения. Система считает такой процесс приоритетным и не «прибивает» его для очистки оперативной памяти.
  3. AlarmManager: Позволяет пробуждать приложение строго по расписанию. Однако в новых версиях Android использование точных будильников требует специального разрешения от пользователя.

Алгоритм реализации через внешнюю компоненту

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

  1. Разрабатывается внешняя компонента на языке Java или Kotlin (для Android).
  2. В компоненте регистрируется задача через WorkManager.
  3. В назначенное время компонента «просыпается» и выполняет легкий HTTP-запрос к серверу 1С (через HTTP-сервисы), минуя запуск основного интерфейса мобильной платформы.
  4. Полученные данные сохраняются во временный файл или локальную базу данных SQLite, к которой имеет доступ мобильное приложение 1С.
  5. Когда пользователь открывает приложение, выполняется проверка наличия «подготовленных» данных, и 1С быстро импортирует их в свою внутреннюю базу.

Оптимизация энергопотребления и режим Doze Mode

Разберем важный нюанс: режим Doze Mode. Когда телефон лежит неподвижно с выключенным экраном, Android ограничивает доступ к сети для всех приложений. Чтобы наше решение работало стабильно, необходимо программно или вручную добавить приложение 1С в список «Исключений энергосбережения».

Выясним, как предложить это пользователю. Мы можем вызвать системное диалоговое окно с помощью кода внешней компоненты:


// Пример логики запроса разрешения на игнорирование оптимизации батареи
Intent intent = new Intent();
intent.setAction(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS);
intent.setData(Uri.parse("package:" + getPackageName()));
startActivity(intent);

Альтернативный подход: Фоновый обмен при запуске

Если разработка внешней компоненты кажется слишком сложной, рассмотрим более простой, но менее «фоновый» вариант. Мы можем настроить приложение так, чтобы обмен начинался автоматически в момент активации приложения пользователем.

Посмотрим на пример логики в модуле управляемого приложения:


Процедура ПриНачалеРаботыСистемы()
    // Проверяем необходимость синхронизации
    ПоследнееОбновление = ВосстановитьНастройку("ДатаПоследнейЗагрузки");
    ТекущаяДата = ТекущаяДатаСеанса();
    
    Если ТекущаяДата - ПоследнееОбновление > 3600 Тогда // Раз в час
        // Запускаем фоновое задание мобильной платформы
        МобильныеСредства.ПодключитьОбработчикОжидания("ВыполнитьОбменДанными", 1, Истина);
    КонецЕсли;
КонецПроцедуры

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

Рекомендации для ТСД (Терминалов сбора данных)

Для специализированных устройств, таких как ТСД, ситуация проще. Производители часто позволяют в настройках системы отключать любые ограничения на фоновую работу конкретных приложений. В этом случае мы можем использовать бесконечный цикл в обработчике ожидания, но нужно учитывать «тяжесть» платформы 1С и возможные утечки памяти при длительной работе без перезагрузки приложения.

Важные моменты для запоминания:

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

← На главную