При разработке и внедрении мобильных решений на платформе 1С (например, мобильного приложения «1С:Мобильная касса») специалисты часто сталкиваются со специфической проблемой. Драйвер торгового оборудования (например, ККТ АТОЛ) отлично функционирует в офлайн-режиме, если конфигурация загружена на мобильное устройство напрямую по USB-кабелю из конфигуратора. Однако стоит опубликовать базу на веб-сервере и обновить приложение «по воздуху» (через мобильную платформу разработчика), как работа в отсутствие интернет-соединения становится невозможной. Приложение при каждом запуске пытается скачать внешнюю компоненту с веб-сервера и выдает ошибку «драйвер не установлен» или аварийно завершает работу.
В этой статье мы подробно разберем, почему возникает такое поведение, как устроена архитектура публикации внешних компонент в мобильной платформе 1С, и пошагово настроим окружение для бесперебойной автономной работы курьеров и кассиров.
---
Давайте проанализируем внутренние механизмы работы мобильной платформы 1С. Разница в поведении приложения при установке по кабелю и при получении обновлений по сети заключается в способе подготовки файлов конфигурации.
Когда вы используете макет типа «Внешняя компонента», платформа 1С при публикации информационной базы на веб-сервере разделяет файлы:
1Cv8.1CM) упаковывается в максимально облегченном виде (обычно ее размер составляет всего 2–3 МБ). Все тяжелые бинарные файлы драйверов из нее исключаются..so для архитектуры Android, .apk для вспомогательного Java-кода или .dylib для iOS) извлекаются из макета и сохраняются в специальную иерархию папок в каталоге публикации на веб-сервере (например, по пути /Android/arm/имя_компоненты.so).1cema.xml прописываются прямые URL-ссылки на эти внешние файлы.В результате при запуске сеанса на мобильном устройстве платформа разработчика считывает дескриптор. Как только управление доходит до вызова метода инициализации ККТ, мобильное устройство инициирует HTTP-запрос к веб-серверу для загрузки компоненты. Если в этот момент интернет отсутствует, драйвер не может быть загружен, и касса прекращает работу. Если же вы «заливаете» базу через USB-кабель методом отладки, конфигуратор принудительно упаковывает все связанные файлы напрямую в локальный кэш устройства, имитируя их успешную загрузку.
---
При успешном скачивании из интернета мобильное приложение распаковывает внешние компоненты во внутреннюю файловую систему устройства. Путь к этой директории в операционной системе Android выглядит следующим образом:
/data/user/0/com.e1c.mobile/files/1C/1cem/[Уникальный_ID_базы]/ExtCompT/
В этой папке хранятся файлы драйверов, готовые к работе. Однако в устаревших версиях платформы (например, в линейке 8.3.10, которая часто используется в стабильных сборках мобильных касс) кэширование работает нестабильно. При обновлении конфигурации на сервере кэш в папке ExtCompT может очищаться или блокироваться, требуя повторного обращения к сети для валидации версий. Начиная с современных релизов (в частности, с платформы 8.3.24), этот механизм оптимизирован: платформа корректно отслеживает версию макета и обращается к сети только при реальном обновлении файла драйвера в конфигураторе.
---
Часто мобильное приложение падает (завершает работу аварийно) в момент обращения к драйверу. Проанализируем причину: по умолчанию веб-сервер IIS (Internet Information Services) блокирует скачивание файлов с неизвестными расширениями, возвращая мобильному клиенту ошибку 404 (Not Found) или 403 (Forbidden). Платформа 1С не получает бинарный файл компоненты и завершает процесс критической ошибкой.
Чтобы исправить это, нам необходимо настроить сопоставление MIME-типов на сервере публикации. Выполним следующие шаги:
.so:
.soapplication/octet-stream.apk:
.apkapplication/octet-streamДля проверки корректности настройки попробуйте открыть браузер на компьютере или телефоне и ввести прямой путь к компоненте, например:
http://[Адрес_Вашего_Сервера]/[Имя_Публикации]/Android/arm/com_atol_fptr1c_fz54.so
Если браузер предложил сохранить файл на локальный диск — веб-сервер настроен правильно. Теперь мобильное приложение при наличии связи сможет успешно скачать драйвер в свой локальный кэш без падений.
---
Давайте выясним, в каком месте конфигурации происходит вызов компоненты. В типовой библиотеке подключаемого оборудования для мобильных платформ (БПО для МП) основным методом является асинхронная установка компоненты. Поиск в конфигураторе по системному методу НачатьУстановкуВнешнейКомпоненты выведет нас на процедуру инициализации.
Посмотрим на пример регистрации ККТ АТОЛ в кодовой базе мобильного приложения:
Перечисления.ТипыПодключаемогоОборудования.ККТ,
"ДрайверАТОЛККТ54ФЗ",
"АТОЛ:ККТ с передачей данных в ОФД (54-ФЗ)",
"AddIn.ATOL_KKT_1C83_V9",
Ложь,
"9.12.0.6076"
При вызове этого блока кода мобильная платформа проверяет наличие зарегистрированного COM/GLaD-класса AddIn.ATOL_KKT_1C83_V9. Если класс отсутствует в системе, запускается фоновый процесс загрузки библиотеки из макета, который в режиме веб-публикации жестко привязан к наличию сети.
---
Использование мобильной платформы разработчика (когда базы запускаются по HTTP-ссылке через стартер 1С) категорически не подходит для промышленной эксплуатации курьерами. Любой сбой сети, перезапуск устройства или очистка временных файлов приведет к тому, что приложение потребует интернет для повторного скачивания драйверов.
Единственный надежный способ обеспечить 100% автономность (офлайн-режим) — собрать полноценный дистрибутив приложения (файл .apk) с помощью специализированной конфигурации «Сборщик мобильных приложений».
Разберем по шагам, как работает этот процесс и почему он решает проблему офлайн-доступа:
.so и .apk) под все поддерживаемые архитектуры процессоров мобильных устройств (ARM, x86)..apk) в директорию ресурсов.Для сборки приложения вам потребуются установленные на компьютере компоненты: Java Development Kit (JDK), Android SDK и Сборщик мобильных приложений от 1С. В самом Сборщике необходимо сгенерировать собственный сертификат разработчика (ключ подписи Keystore) для подписи собранного APK-файла. Это абсолютно бесплатно и не требует покупки платного аккаунта разработчика Google Play.
Важное примечание по багфиксингу сборщика: При генерации ключа подписи в некоторых старых версиях «Сборщика мобильных приложений» существовала внутренняя программная ошибка (не хватало пробелов в формируемой строке параметров командной строки для утилиты keytool). Если при генерации ключа сборщик выдает ошибку, необходимо зайти в код конфигурации сборщика и вручную добавить недостающие пробелы в процедурах формирования системного вызова утилиты создания ключей.
---
Если по каким-то причинам сборка полноценного APK-приложения в данный момент невозможна, а запустить работу курьеров без интернета нужно срочно, можно прибегнуть к архитектурной хитрости.
Мы можем переопределить способ хранения драйвера в конфигурации. Для этого выполним следующие действия:
НачатьУстановкуВнешнейКомпоненты, ориентированного на имя системного макета, выполните сохранение двоичных данных во временный файл на устройстве, а затем вызовите метод установки из локального файла.При такой реализации весь объем драйвера (около 15-20 МБ) будет жестко интегрирован в файл мобильной базы данных 1Cv8.1CM. При первом подключении к веб-серверу мобильное устройство скачает базу целиком (загрузка займет чуть больше времени), но в дальнейшем драйвер будет инициализироваться локально из тела базы данных, полностью игнорируя сетевые запросы.
Рассмотренные методы позволяют полностью решить проблему автономной печати чеков и гарантируют стабильную работу выездных сотрудников в любых условиях отсутствия связи.