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

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

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

Различие в работе компоненты: APK против Мобильной платформы

Для начала нам необходимо понять фундаментальную разницу в том, как мобильное устройство «видит» внешнюю компоненту в разных режимах запуска. Когда вы собираете полноценный APK-файл (автономное мобильное приложение), все необходимые библиотеки (файлы .so) упаковываются непосредственно в состав инсталлятора. При установке система Android размещает их в защищенных системных каталогах приложения, откуда они беспрепятственно загружаются платформой.

Ситуация кардинально меняется, когда мы используем Мобильную платформу как «контейнер» для запуска опубликованной конфигурации. Давайте разберем этот процесс по шагам:

  1. Мобильное устройство подключается к веб-серверу (например, Apache) и скачивает файл описания конфигурации 1cema.xml.
  2. Файл базы данных 1Cv8.1CM загружается на устройство, но, как показывает практика, он не содержит в себе бинарные файлы внешних компонент. Это сделано для минимизации объема передаваемых данных.
  3. В момент вызова метода ПодключитьВнешнююКомпоненту мобильное приложение обращается обратно к веб-серверу, чтобы найти нужную библиотеку под конкретную архитектуру процессора текущего смартфона.

Проверка структуры публикации на веб-сервере

Выясним причину, по которой компонента может не загружаться. Если публикация выполнена корректно, в каталоге на сервере Apache, где лежит ваш файл 1cema.xml, должна автоматически создаться иерархия папок. Проанализируем типичную структуру:

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

Влияние архитектуры процессора (32 и 64 бит)

Рассмотрим ситуацию с разрядностью. Современные смартфоны под управлением Android 13 и выше все чаще требуют 64-битную архитектуру (arm64-v8a). Если ваша мобильная платформа установлена как 32-битная, а вы пытаетесь загрузить драйвер, который в макете содержит только 64-битные библиотеки (или наоборот), метод ПодключитьВнешнююКомпоненту завершится ошибкой.

Важный нюанс: Драйверы Атол часто поставляются в виде архивов, содержащих библиотеки для разных платформ. Проанализируем содержимое макета: в нем должны присутствовать файлы для Linux-device-ARM. Если вы используете современное устройство, убедитесь, что в макете есть библиотека именно для Android-ARM64.

Проверка доступности файлов через браузер

Чтобы исключить проблемы с настройками прав доступа на веб-сервере Apache, выполните простой тест. Попробуйте с мобильного устройства через браузер открыть прямую ссылку на файл компоненты. Ссылка будет выглядеть примерно так:

http://[ваш-ip]/[имя-публикации]/Android/ARM/[имя-компоненты].apk

Если браузер выдает ошибку 404 (Not Found) или 403 (Forbidden), значит, проблема в настройках Apache. Проверьте конфигурационный файл httpd.conf. Особое внимание уделите MIME-типам. Веб-сервер должен уметь отдавать файлы с расширениями .so и .apk. Можно добавить следующие строки в настройки Apache:


AddType application/octet-stream .so
AddType application/vnd.android.package-archive .apk

Программная реализация подключения

Посмотрим на пример кода, который рекомендуется использовать для подключения компоненты в мобильном приложении. Важно учитывать асинхронность в мобильных средах (хотя для внешней компоненты в мобильной платформе часто допустим и синхронный вызов, асинхронный метод более надежен).


&НаКлиенте
Процедура ПодключитьДрайверККТ()
    ИмяМакета = "ОбщийМакет.ДрайверАтолККТ";
    ИмяМеста = "ККТ_Атол";
    
    // Попробуем подключить компоненту из макета
    Результат = ПодключитьВнешнююКомпоненту(ИмяМакета, ИмяМеста, ТипВнешнейКомпоненты.Native);
    
    Если Результат Тогда
        Драйвер = Новый(ИмяМеста + ".AtolДрайвер"); 
        Сообщить("Драйвер успешно подключен!");
    Иначе
        Сообщить("Ошибка загрузки драйвера. Проверьте связь с сервером публикации.");
    КонецЕсли;
КонецПроцедуры

Если Результат всегда Ложь, попробуйте предварительно выполнить метод УстановитьВнешнююКомпоненту(ИмяМакета). В мобильной платформе это инициирует принудительное скачивание файлов с сервера в локальный кэш устройства.

Проблемы с кэшированием и безопасностью Android 11+

Начиная с Android 11, Google ввел строгие ограничения на выполнение кода из неисполняемых директорий. При работе через мобильную платформу 1С иногда возникает конфликт: система безопасности блокирует загрузку библиотеки .so, если она была скачана в папку кэша, не имеющую прав на выполнение.

Рассмотрим шаги для очистки «битого» кэша:

  1. Зайдите в настройки Android -> Приложения -> 1С:Предприятие.
  2. Выберите пункт «Память» и нажмите «Очистить кэш» и «Очистить данные».
  3. Удалите информационную базу из списка в мобильной платформе и добавьте её заново.

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

Итоги и рекомендации

Проанализировав ситуацию, можно составить чеклист для исправления ошибки:

Следуя этим шагам, вы обеспечите корректную доставку библиотек драйвера с сервера на мобильное устройство, и метод ПодключитьВнешнююКомпоненту будет отрабатывать стабильно.

← На главную