Как настроить офлайн-работу драйвера ККМ в мобильном приложении 1С и избежать постоянного скачивания с сервера

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

При разработке и внедрении мобильных решений на платформе 1С (например, мобильного приложения «1С:Мобильная касса») специалисты часто сталкиваются со специфической проблемой. Драйвер торгового оборудования (например, ККТ АТОЛ) отлично функционирует в офлайн-режиме, если конфигурация загружена на мобильное устройство напрямую по USB-кабелю из конфигуратора. Однако стоит опубликовать базу на веб-сервере и обновить приложение «по воздуху» (через мобильную платформу разработчика), как работа в отсутствие интернет-соединения становится невозможной. Приложение при каждом запуске пытается скачать внешнюю компоненту с веб-сервера и выдает ошибку «драйвер не установлен» или аварийно завершает работу.

В этой статье мы подробно разберем, почему возникает такое поведение, как устроена архитектура публикации внешних компонент в мобильной платформе 1С, и пошагово настроим окружение для бесперебойной автономной работы курьеров и кассиров.

---

Почему мобильное приложение требует интернет для загрузки драйвера?

Давайте проанализируем внутренние механизмы работы мобильной платформы 1С. Разница в поведении приложения при установке по кабелю и при получении обновлений по сети заключается в способе подготовки файлов конфигурации.

Когда вы используете макет типа «Внешняя компонента», платформа 1С при публикации информационной базы на веб-сервере разделяет файлы:

  1. Сама мобильная конфигурация (файл 1Cv8.1CM) упаковывается в максимально облегченном виде (обычно ее размер составляет всего 2–3 МБ). Все тяжелые бинарные файлы драйверов из нее исключаются.
  2. Библиотеки внешних компонент (файлы .so для архитектуры Android, .apk для вспомогательного Java-кода или .dylib для iOS) извлекаются из макета и сохраняются в специальную иерархию папок в каталоге публикации на веб-сервере (например, по пути /Android/arm/имя_компоненты.so).
  3. В служебном дескрипторе конфигурации 1cema.xml прописываются прямые URL-ссылки на эти внешние файлы.

В результате при запуске сеанса на мобильном устройстве платформа разработчика считывает дескриптор. Как только управление доходит до вызова метода инициализации ККТ, мобильное устройство инициирует HTTP-запрос к веб-серверу для загрузки компоненты. Если в этот момент интернет отсутствует, драйвер не может быть загружен, и касса прекращает работу. Если же вы «заливаете» базу через USB-кабель методом отладки, конфигуратор принудительно упаковывает все связанные файлы напрямую в локальный кэш устройства, имитируя их успешную загрузку.

---

Где платформа хранит загруженные компоненты: папка ExtCompT

При успешном скачивании из интернета мобильное приложение распаковывает внешние компоненты во внутреннюю файловую систему устройства. Путь к этой директории в операционной системе Android выглядит следующим образом:

/data/user/0/com.e1c.mobile/files/1C/1cem/[Уникальный_ID_базы]/ExtCompT/

В этой папке хранятся файлы драйверов, готовые к работе. Однако в устаревших версиях платформы (например, в линейке 8.3.10, которая часто используется в стабильных сборках мобильных касс) кэширование работает нестабильно. При обновлении конфигурации на сервере кэш в папке ExtCompT может очищаться или блокироваться, требуя повторного обращения к сети для валидации версий. Начиная с современных релизов (в частности, с платформы 8.3.24), этот механизм оптимизирован: платформа корректно отслеживает версию макета и обращается к сети только при реальном обновлении файла драйвера в конфигураторе.

---

Шаг 1. Настройка веб-сервера IIS для работы с компонентами

Часто мобильное приложение падает (завершает работу аварийно) в момент обращения к драйверу. Проанализируем причину: по умолчанию веб-сервер IIS (Internet Information Services) блокирует скачивание файлов с неизвестными расширениями, возвращая мобильному клиенту ошибку 404 (Not Found) или 403 (Forbidden). Платформа 1С не получает бинарный файл компоненты и завершает процесс критической ошибкой.

Чтобы исправить это, нам необходимо настроить сопоставление MIME-типов на сервере публикации. Выполним следующие шаги:

  1. Откройте Диспетчер служб IIS на вашем сервере под управлением Windows.
  2. В дереве подключений выберите ваш сайт или конкретное виртуальное приложение, под которым опубликована мобильная база 1С.
  3. В центральной панели дважды щелкните по иконке «Типы MIME» (MIME Types).
  4. В панели «Действия» (справа) нажмите кнопку «Добавить...» (Add...).
  5. Заполните поля для расширения .so:
    • Расширение имени файла: .so
    • MIME-тип: application/octet-stream
  6. Аналогичным образом добавьте правило для расширения .apk:
    • Расширение имени файла: .apk
    • MIME-тип: application/octet-stream
  7. Примените изменения и перезапустите пул приложений или весь веб-сервер IIS.

Для проверки корректности настройки попробуйте открыть браузер на компьютере или телефоне и ввести прямой путь к компоненте, например:

http://[Адрес_Вашего_Сервера]/[Имя_Публикации]/Android/arm/com_atol_fptr1c_fz54.so

Если браузер предложил сохранить файл на локальный диск — веб-сервер настроен правильно. Теперь мобильное приложение при наличии связи сможет успешно скачать драйвер в свой локальный кэш без падений.

---

Шаг 2. Анализ программного кода интеграции драйвера

Давайте выясним, в каком месте конфигурации происходит вызов компоненты. В типовой библиотеке подключаемого оборудования для мобильных платформ (БПО для МП) основным методом является асинхронная установка компоненты. Поиск в конфигураторе по системному методу НачатьУстановкуВнешнейКомпоненты выведет нас на процедуру инициализации.

Посмотрим на пример регистрации ККТ АТОЛ в кодовой базе мобильного приложения:


Перечисления.ТипыПодключаемогоОборудования.ККТ,
"ДрайверАТОЛККТ54ФЗ",
"АТОЛ:ККТ с передачей данных в ОФД (54-ФЗ)",
"AddIn.ATOL_KKT_1C83_V9",
Ложь,
"9.12.0.6076"

При вызове этого блока кода мобильная платформа проверяет наличие зарегистрированного COM/GLaD-класса AddIn.ATOL_KKT_1C83_V9. Если класс отсутствует в системе, запускается фоновый процесс загрузки библиотеки из макета, который в режиме веб-публикации жестко привязан к наличию сети.

---

Шаг 3. Кардинальное решение для продакшена — Сборка собственного APK

Использование мобильной платформы разработчика (когда базы запускаются по HTTP-ссылке через стартер 1С) категорически не подходит для промышленной эксплуатации курьерами. Любой сбой сети, перезапуск устройства или очистка временных файлов приведет к тому, что приложение потребует интернет для повторного скачивания драйверов.

Единственный надежный способ обеспечить 100% автономность (офлайн-режим) — собрать полноценный дистрибутив приложения (файл .apk) с помощью специализированной конфигурации «Сборщик мобильных приложений».

Разберем по шагам, как работает этот процесс и почему он решает проблему офлайн-доступа:

  1. При сборке пакета Сборщик мобильных приложений распаковывает вашу конфигурацию 1С.
  2. Сборщик сканирует макеты конфигурации. Обнаружив макеты с типом «Внешняя компонента», он извлекает из них бинарные библиотеки (файлы с расширениями .so и .apk) под все поддерживаемые архитектуры процессоров мобильных устройств (ARM, x86).
  3. Сборщик физически помещает эти файлы внутрь итогового пакета приложения (файла .apk) в директорию ресурсов.
  4. При установке собранного приложения на телефон пользователя все драйверы устанавливаются локально в системную папку приложения. При вызове кода инициализации торгового оборудования приложение берет компоненту прямо из собственных ресурсов, не обращаясь к внешним веб-серверам.

Для сборки приложения вам потребуются установленные на компьютере компоненты: Java Development Kit (JDK), Android SDK и Сборщик мобильных приложений от 1С. В самом Сборщике необходимо сгенерировать собственный сертификат разработчика (ключ подписи Keystore) для подписи собранного APK-файла. Это абсолютно бесплатно и не требует покупки платного аккаунта разработчика Google Play.

Важное примечание по багфиксингу сборщика: При генерации ключа подписи в некоторых старых версиях «Сборщика мобильных приложений» существовала внутренняя программная ошибка (не хватало пробелов в формируемой строке параметров командной строки для утилиты keytool). Если при генерации ключа сборщик выдает ошибку, необходимо зайти в код конфигурации сборщика и вручную добавить недостающие пробелы в процедурах формирования системного вызова утилиты создания ключей.

---

Альтернативный обходной путь: Использование макетов «Двоичные данные»

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

Мы можем переопределить способ хранения драйвера в конфигурации. Для этого выполним следующие действия:

  1. Экспортируйте zip-архив внешней компоненты АТОЛ из стандартного макета на жесткий диск вашего компьютера.
  2. Создайте в конфигурации новый макет с типом «Двоичные данные» (вместо типа «Внешняя компонента») и загрузите в него сохраненный архив драйвера.
  3. Перепишите участок кода БПО, отвечающий за установку компоненты. Вместо стандартного метода НачатьУстановкуВнешнейКомпоненты, ориентированного на имя системного макета, выполните сохранение двоичных данных во временный файл на устройстве, а затем вызовите метод установки из локального файла.

При такой реализации весь объем драйвера (около 15-20 МБ) будет жестко интегрирован в файл мобильной базы данных 1Cv8.1CM. При первом подключении к веб-серверу мобильное устройство скачает базу целиком (загрузка займет чуть больше времени), но в дальнейшем драйвер будет инициализироваться локально из тела базы данных, полностью игнорируя сетевые запросы.

Рассмотренные методы позволяют полностью решить проблему автономной печати чеков и гарантируют стабильную работу выездных сотрудников в любых условиях отсутствия связи.

← На главную