При разработке мобильных приложений на платформе 1С:Предприятие часто возникает задача синхронизации данных без участия пользователя. Например, когда приложение свернуто или телефон находится в кармане, данные должны подгружаться в локальную базу, чтобы при открытии пользователь сразу видел актуальную информацию. Однако стандартные механизмы мобильной платформы накладывают определенные ограничения. В этой статье мы подробно разберем, почему это сложно сделать «из коробки» и какие архитектурные подходы позволяют обойти эти ограничения.
Прежде всего, проанализируем ситуацию с точки зрения архитектуры 1С. Средствами самой мобильной платформы реализовать полноценный фоновый обмен, когда приложение полностью закрыто или свернуто, невозможно. Это связано с тем, что мобильное приложение 1С представляет собой достаточно «тяжелый» контейнер. Для выполнения любого кода на языке 1С требуется инициализация всей среды конфигурации, что потребляет значительные ресурсы устройства и занимает время.
Операционные системы (особенно Android версии 8.0 и выше и iOS) жестко ограничивают активность приложений, которые не находятся в фокусе пользователя, в целях экономии заряда батареи. Если операционная система видит, что приложение пытается выполнить ресурсоемкую операцию в фоне, она с большой вероятностью принудительно завершит процесс.
Разберем основные инструменты, которые предлагают современные мобильные ОС для решения подобных задач. Поскольку стандартная 1С их не вызывает напрямую, нам потребуется использование внешних компонент.
Foreground Service. В этом случае в строке уведомлений пользователя всегда будет отображаться активная иконка приложения. Система считает такой процесс приоритетным и не «прибивает» его для очистки оперативной памяти.Поскольку мы выяснили, что среда 1С слишком тяжела для частого пробуждения в фоне, рассмотрим наиболее эффективную стратегию синхронизации. Проанализируем шаги реализации:
WorkManager.Разберем важный нюанс: режим 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С и возможные утечки памяти при длительной работе без перезагрузки приложения.
Важные моменты для запоминания:
Silent Push (тихих уведомлений) — это наиболее современный способ «разбудить» приложение для обмена, но он требует настройки сервера Push-уведомлений.Подводя итог, можно сказать, что задача фоновой загрузки решаема, но она требует выхода за рамки стандартного программирования на 1С и погружения в специфику мобильных операционных систем.