Автоматизация процессов в мобильном приложении — одна из самых востребованных задач при разработке на платформе 1С. Часто возникает необходимость синхронизации данных с центральной базой без участия пользователя, например, каждые 30 минут. В мобильной платформе 1С существует несколько подходов к решению этой задачи, которые зависят от состояния приложения (активно оно или свернуто) и версии используемой платформы. Разберем подробно каждый из доступных механизмов.
Если ваша задача требует выполнения действий только в тот момент, когда пользователь непосредственно работает с приложением, самым простым и надежным способом будет использование встроенного метода ПодключитьОбработчикОжидания. Проанализируем этот подход: он позволяет запускать процедуру через заданный интервал времени.
Для реализации этого метода в модуле управляемого приложения или в модуле формы необходимо прописать следующий код:
// В процедуре ПриНачалеРаботыСистемы или ПриОткрытии формы
Интервал = 1800; // 30 минут в секундах
ПодключитьОбработчикОжидания("ВыполнитьОбменДанными", Интервал, Ложь);
Затем определим саму процедуру, которая будет вызываться автоматически:
&НаКлиенте
Процедура ВыполнитьОбменДанными()
// Здесь располагается логика вашего обмена через веб-сервисы
Сообщить("Запущен автоматический обмен данными...");
КонецПроцедуры
Важный нюанс: Этот метод работает только тогда, когда приложение активно. Если пользователь свернет приложение или заблокирует экран, выполнение кода в большинстве случаев будет приостановлено операционной системой для экономии энергии. Для программного отслеживания этого состояния подойдёт внешняя компонента для определения нахождения мобильного приложения на переднем плане.
Начиная с версий платформы 8.3.18 и выше, разработчики 1С значительно расширили возможности фоновой работы. Теперь в мобильном приложении можно использовать объект РегламентныеЗадания, аналогично серверной версии 1С. Рассмотрим, как настроить расписание.
Выясним основные этапы настройки:
Проанализируем поведение системы: на ОС Android платформа пытается использовать системный планировщик WorkManager. Это означает, что даже если приложение закрыто, система может выделить квант времени для выполнения задания. Однако стоит помнить, что ОС Android может объединять задачи разных приложений и запускать их не строго по расписанию, а тогда, когда это оптимально с точки зрения расхода батареи.
Иногда приложению нужно "напомнить" о себе. Для этого используются локальные уведомления. Это не совсем автоматический запуск процедуры в фоне, но отличный способ инициировать действие пользователя или привлечь внимание системы к приложению. Рассмотрим пример создания локального уведомления через объект ДоставляемоеУведомление.
Уведомление = Новый ДоставляемоеУведомление;
Уведомление.Текст = "Пора обновить данные!";
Уведомление.ДатаПринятия = ТекущаяДата() + 1800; // через 30 минут
Уведомление.ЗвуковоеОповещение = ЗвуковоеОповещение.Стандартное;
Медиатор = НовыеСредстваТелефонии.ПолучитьМедиатор(); // Пример для новых версий
// Или используем стандартные средства управления уведомлениями
ДоставитьУведомление(Уведомление);
Когда уведомление появится на экране смартфона и пользователь нажмет на него, приложение перейдет в активное состояние, и вы сможете запустить процедуру обмена в обработчике ПриНажатииНаУведомление.
Наиболее профессиональный подход для реализации обмена — инициировать его со стороны сервера. Рассмотрим ситуацию: в центральной базе обновились данные. Вместо того чтобы мобильное приложение постоянно "спрашивало" сервер, сервер сам посылает сигнал приложению.
Разберем этапы взаимодействия:
ПриПолученииУведомления в модуле приложения даже в фоновом режиме.Пример кода в модуле приложения:
Процедура ПриПолученииУведомления(Уведомление, Локальное, Показано)
// Код обмена данными
ВыполнитьОбменССервером();
КонецПроцедуры
Важно: Для работы Push-уведомлений на iOS существуют жесткие ограничения. Система может игнорировать частые фоновые уведомления, если пользователь редко открывает приложение.
Для устройств на Android существует возможность запустить приложение как "сервис переднего плана". Это критически важно, если вам нужна максимальная гарантия выполнения кода каждые 30 минут. В этом режиме приложение показывает постоянное уведомление в статус-баре, что сообщает системе: "Этот процесс важен, его нельзя убивать".
Чтобы реализовать такой режим, необходимо:
ПодключитьОбработчикОжидания.Подведем итог нашему анализу и выберем оптимальный путь:
ПодключитьОбработчикОжидания.Помните, что мобильные операционные системы с каждым годом становятся все более агрессивными в плане экономии заряда, поэтому стабильность фонового обмена на 100% гарантировать сложно без внешних триггеров (Push-сообщений). Для организации сетевого обмена в отдельных фоновых потоках можно использовать внешнюю компоненту для выполнения HTTP-запросов в мобильном приложении.