Синхронизация мобильного приложения с центральной базой 1С — это всегда компромисс между объемом передаваемых данных и скоростью работы. Когда речь заходит о 5000 товаров, тысячах клиентов с индивидуальными ценами и истории из 20 000 документов, стандартные механизмы «выгрузить всё» перестают работать. В этой ситуации перед разработчиком стоит задача: как уместить загрузку в 5 минут и при этом не перегрузить мобильное устройство. Рассмотрим основные стратегии и технические приемы, которые помогут решить эту задачу.
Первое и самое важное правило для больших баз: никогда не передавайте данные целиком при каждом обмене. Нам необходимо реализовать механизм, который будет отслеживать, что именно изменилось с момента последней синхронизации конкретного мобильного клиента.
Рассмотрим два основных способа реализации:
РегистрСведений, где будут храниться версии объектов или время их последнего изменения. При запросе мобильное приложение передает дату своей последней успешной синхронизации, а сервер выбирает только те данные, которые изменились позже этой даты. Это значительно снижает нагрузку на сервер при большом количестве узлов.Изображения — самый «тяжелый» тип данных. Если у нас 5000 товаров и по 2-3 картинки на каждый, общий объем может составлять гигабайты. Передавать их в основном пакете данных нельзя. Выясним, как правильно организовать работу с графикой:
Разделение данных и файлов. Основной обмен должен содержать только текстовую информацию и ссылки (идентификаторы) изображений. Сами файлы должны загружаться отдельно.
Использование миниатюр (Thumbnails). Разберем ситуацию: пользователю в списке товаров нужны картинки для быстрого подбора. Вместо оригиналов фотографий сервер должен подготовить уменьшенные копии (например, 100x100 пикселей) в формате WebP или сильно сжатом JPEG. Вес такой картинки составит всего 5-10 Кб.
Динамическая (ленивая) загрузка. Посмотрим на пример реализации: мобильное приложение скачивает только список товаров. Картинки подгружаются «по воздуху» только для тех позиций, которые в данный момент отображаются на экране смартфона, и кешируются локально. Рассмотрим пример логики:
// Логика на стороне МП при выводе строки списка
Если ЭтоНужныйТовар Тогда
ИмяФайла = ПолучитьПутьКЛокальномуФайлу(ТоварИД);
Если НЕ ФайлСуществует(ИмяФайла) Тогда
// Запускаем фоновое задание на скачивание картинки с сервера
ФоновыеЗадания.Выполнить("ЗагрузитьКартинкуССервера", Параметры);
КонецЕсли;
КонецЕсли;
Выбор формата влияет не только на размер пакета, но и на скорость его «переваривания» мобильным устройством. Хотя JSON является стандартом де-факто, платформа 1С отлично работает с MessagePack. Это бинарный формат, который компактнее текстовых форматов и быстрее обрабатывается процессором смартфона.
Обязательно используйте сжатие данных. На стороне сервера пакет данных упаковывается в ZIP, а на стороне мобильного приложения распаковывается. Это сокращает объем передаваемого трафика в 5-10 раз.
Пример сериализации таблицы значений в XML (как один из вариантов передачи):
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.УстановитьСтроку();
СериализаторXDTO.ЗаписатьXML(ЗаписьXML, ТаблицаДанных);
СтрокаXML = ЗаписьXML.Закрыть();
// Далее СтрокаXML сжимается и отправляется
Часто узким местом становится не сеть, а запись данных в локальную базу SQLite на телефоне. Запись 20 000 документов по одному — это гарантированный выход за пределы 5-минутного лимита из-за накладных расходов на каждую транзакцию базы данных.
Проанализируем решение: необходимо использовать явное управление транзакциями. Оберните запись всего пакета данных или крупных блоков (по 500-1000 объектов) в одну транзакцию.
НачатьТранзакцию();
Попытка
Для Каждого ДокументИзПакета Из ЗагруженныеДанные Цикл
// Запись документа без проведения (для скорости)
НовыйДок = Документы.Продажи.СоздатьДокумент();
ЗаполнитьЗначенияСвойств(НовыйДок, ДокументИзПакета);
НовыйДок.Записать(РежимЗаписиДокумента.Запись);
КонецЦикла;
ЗафиксироватьТранзакцию();
Исключение
ОтменитьТранзакцию();
// Обработка ошибки
КонецПопытки;
Важно: При массовой загрузке старайтесь отключать лишние проверки в модулях объектов и минимизировать количество индексов, если это возможно в рамках вашей конфигурации.
Рассмотрим радикальный, но очень эффективный метод для первичной загрузки или масштабных обновлений: подготовка файла базы данных на сервере. Вместо того чтобы заставлять телефон создавать тысячи записей, сервер формирует файл базы (например, SQLite), наполняет его данными и передает мобильному приложению готовый файл. Мобильное приложение просто подменяет или подключает этот файл как внешний источник данных. Это позволяет передавать миллионы строк за время, равное скорости скачивания файла из интернета.
Если специфика работы позволяет постоянное наличие интернета, стоит рассмотреть переход на Мобильный клиент 1С. В этом режиме данные не хранятся на устройстве, а отображаются напрямую с сервера. Проблема 5-минутной синхронизации исчезает полностью, так как данные всегда актуальны и подгружаются по мере необходимости, как в обычном веб-браузере.
Для достижения цели «загрузка за 5 минут» необходимо комбинировать несколько подходов:
Такой комплексный подход обеспечит стабильную работу приложения даже на средних по характеристикам смартфонах и при нестабильном интернет-соединении.