Как ускорить обмен данными между базой 1С и мобильным приложением при больших объемах данных?

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

Синхронизация мобильного приложения с центральной базой 1С — это всегда компромисс между объемом передаваемых данных и скоростью работы. Когда речь заходит о 5000 товаров, тысячах клиентов с индивидуальными ценами и истории из 20 000 документов, стандартные механизмы «выгрузить всё» перестают работать. В этой ситуации перед разработчиком стоит задача: как уместить загрузку в 5 минут и при этом не перегрузить мобильное устройство. Рассмотрим основные стратегии и технические приемы, которые помогут решить эту задачу.

Переход на дельта-обмен (выгрузка только изменений)

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

Рассмотрим два основных способа реализации:

  1. Планы обмена. Это стандартный механизм платформы 1С. Для каждого мобильного устройства создается узел в плане обмена. При изменении данных (товаров, цен, документов) платформа автоматически регистрирует изменения для всех узлов. Однако, если клиентов 5000, стандартный механизм планов обмена может создать колоссальную нагрузку на серверную базу при регистрации каждого изменения.
  2. Ручной учет изменений через Регистры сведений. Проанализируем альтернативный подход: создать вспомогательный РегистрСведений, где будут храниться версии объектов или время их последнего изменения. При запросе мобильное приложение передает дату своей последней успешной синхронизации, а сервер выбирает только те данные, которые изменились позже этой даты. Это значительно снижает нагрузку на сервер при большом количестве узлов.

Оптимизация работы с изображениями

Изображения — самый «тяжелый» тип данных. Если у нас 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 минут» необходимо комбинировать несколько подходов:

Такой комплексный подход обеспечит стабильную работу приложения даже на средних по характеристикам смартфонах и при нестабильном интернет-соединении.

← На главную