Разработка для мобильных устройств на платформе «1С:Предприятие» имеет одну фундаментальную особенность: мобильное приложение обычно работает автономно, а сервер выступает в роли пассивного хранилища данных, доступного через опубликованные Web- или HTTP-сервисы. В такой архитектуре сервер «не видит» мобильное устройство и не может напрямую отправить ему команду на начало обмена. В этой статье мы разберем, как преодолеть это ограничение и заставить мобильное приложение реагировать на изменения, произошедшие в центральной базе.
Разберем ситуацию: центральный сервер опубликован как веб-сервер и имеет статический адрес. Мобильный же клиент часто находится за NAT оператора связи, имеет динамический IP-адрес или вовсе временно теряет сеть. Таким образом, инициировать TCP-соединение со стороны сервера к мобильному устройству технически невозможно. Все запросы должны исходить от клиента.
Тем не менее, существует несколько проверенных способов реализовать «реактивность» приложения, чтобы оно начинало синхронизацию сразу после внесения изменений на сервере. Рассмотрим их подробно.
Проанализируем самый простой в реализации метод, который выбрал автор темы. Суть заключается в том, что мобильное приложение регулярно «спрашивает» сервер: «Есть ли для меня новые данные?». Если сервер отвечает «Да», запускается полноценная процедура обмена.
Для реализации этого подхода выполним следующие шаги:
Web-сервиса или HTTP-сервиса. Этот метод не должен передавать сами данные, его задача — максимально быстро вернуть булево значение (Истина/Ложь), сигнализирующее о наличии изменений для конкретного устройства.ПодключитьОбработчикОжидания.Рассмотрим пример кода для мобильного приложения:
&НаКлиенте
Процедура ПриОткрытии(Отказ)
// Запускаем проверку каждые 30 секунд
ПодключитьОбработчикОжидания("ПроверитьНаличиеОбновленийНаСервере", 30);
КонецПроцедуры
&НаКлиенте
Процедура ПроверитьНаличиеОбновленийНаСервере()
// Вызываем легкую функцию через WS-ссылку или HTTP-запрос
ЕстьИзменения = ПроверитьИзмененияНаСервереНаСервере();
Если ЕстьИзменения Тогда
// Вызываем основную процедуру обмена
ВыполнитьСинхронизациюДанных();
КонецЕсли;
КонецПроцедуры
Важный нюанс: Чтобы не раздражать пользователя и не блокировать интерфейс, процедуру ВыполнитьСинхронизациюДанных рекомендуется выполнять в фоновом режиме, используя ФоновыеЗадания мобильной платформы, если это позволяет логика вашего приложения.
Разберем более продвинутый и энергоэффективный метод — Push-уведомления. В отличие от постоянных запросов, этот метод позволяет мобильному приложению «спать» и активироваться только по сигналу от сервисов уведомлений (Google FCM или Apple APNs).
В платформе 1С реализован механизм ДоставляемыеУведомления. Проанализируем цепочку действий:
ПриПолученииДоставляемогоУведомления.Существует два типа пуш-уведомлений, которые мы можем использовать:
Пример обработки уведомления в модуле мобильного приложения:
Процедура ПриПолученииДоставляемогоУведомления(Уведомление, Локальное, Показано)
// Проверяем содержимое уведомления
Если Уведомление.Данные.Свойство("ТипСобытия") И Уведомление.Данные.ТипСобытия = "ТребуетсяОбмен" Тогда
// Инициируем синхронизацию
ВыполнитьСинхронизациюДанных();
КонецЕсли;
КонецПроцедуры
Рассмотрим современный инструмент — Систему взаимодействия. Она работает на протоколе WebSockets, который поддерживает постоянное открытое соединение между сервером и клиентом. Это позволяет серверу мгновенно «толкнуть» сообщение клиенту.
Выясним преимущества этого метода:
Для реализации необходимо зарегистрировать информационную базу в сервисе взаимодействия и подписать мобильное приложение на соответствующий канал или обсуждение. Когда на сервере происходит событие (например, проведение документа ЗаказПокупателя), сервер отправляет сообщение, которое перехватывается мобильным клиентом через обработчик оповещений.
Если по условиям безопасности использование внешних Push-сервисов невозможно (закрытый контур), проанализируем архитектуру Long Polling. Это модификация обычного опроса.
Выясним суть метода: мобильное приложение делает запрос к серверу (используя HTTPЗапрос), а сервер не отвечает сразу, если данных нет. Он «удерживает» соединение открытым в течение длительного времени (например, 30–60 секунд). Как только данные появляются или время истекает, сервер отправляет ответ. При получении ответа клиент тут же отправляет новый «длинный» запрос.
Почему HTTP лучше WS для мобильных? HTTPСервисы работают быстрее, так как используют легковесный JSON вместо тяжелого SOAP/XML, который используется в Web-сервисах. Это критично для мобильных процессоров и экономии заряда батареи.
Проанализируем, какой метод выбрать в зависимости от задач:
Важно помнить об эмоциях пользователя. Как справедливо отмечено в обсуждении, внезапное начало тяжелого обмена в момент, когда пользователь вводит данные в форму, может привести к потере данных или зависанию интерфейса. Поэтому всегда проверяйте состояние приложения перед началом синхронизации и, по возможности, используйте фоновое выполнение задач.