При разработке мобильных приложений на платформе 1С:Предприятие одной из самых сложных задач является стабильная работа с торговым оборудованием, в частности с кассами ККТ Атол. Часто возникает ситуация: в тестовой среде или в виде собранного APK-файла всё работает корректно, но при попытке запустить конфигурацию через мобильную платформу (путем публикации на веб-сервере) метод ПодключитьВнешнююКомпоненту возвращает «Ложь». В этой статье мы подробно разберем механизм загрузки библиотек, проанализируем влияние среды Android и выясним, как обеспечить успешное подключение драйвера.
Для начала нам необходимо понять фундаментальную разницу в том, как мобильное устройство «видит» внешнюю компоненту в разных режимах запуска. Когда вы собираете полноценный APK-файл (автономное мобильное приложение), все необходимые библиотеки (файлы .so) упаковываются непосредственно в состав инсталлятора. При установке система Android размещает их в защищенных системных каталогах приложения, откуда они беспрепятственно загружаются платформой.
Ситуация кардинально меняется, когда мы используем Мобильную платформу как «контейнер» для запуска опубликованной конфигурации. Давайте разберем этот процесс по шагам:
1cema.xml.1Cv8.1CM загружается на устройство, но, как показывает практика, он не содержит в себе бинарные файлы внешних компонент. Это сделано для минимизации объема передаваемых данных.ПодключитьВнешнююКомпоненту мобильное приложение обращается обратно к веб-серверу, чтобы найти нужную библиотеку под конкретную архитектуру процессора текущего смартфона.Выясним причину, по которой компонента может не загружаться. Если публикация выполнена корректно, в каталоге на сервере Apache, где лежит ваш файл 1cema.xml, должна автоматически создаться иерархия папок. Проанализируем типичную структуру:
/ИмяПубликации/Android/ARM/ — здесь должны лежать файлы .so и вспомогательные .apk для ARM-процессоров./ИмяПубликации/Android/i386/ — файлы для x86-совместимых процессоров (часто используются в эмуляторах).Если этих папок нет или они пусты, мобильная платформа не сможет загрузить драйвер, даже если в самой конфигурации макет заполнен правильно. Проверьте, что при публикации в диалоговом окне 1С выбраны опции публикации внешних компонент.
Рассмотрим ситуацию с разрядностью. Современные смартфоны под управлением 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, Google ввел строгие ограничения на выполнение кода из неисполняемых директорий. При работе через мобильную платформу 1С иногда возникает конфликт: система безопасности блокирует загрузку библиотеки .so, если она была скачана в папку кэша, не имеющую прав на выполнение.
Рассмотрим шаги для очистки «битого» кэша:
Это заставит платформу заново скачать все файлы публикаций с сервера, исключая использование поврежденных или неполных версий драйверов.
Проанализировав ситуацию, можно составить чеклист для исправления ошибки:
Android/ARM в каталоге публикации на Apache и убедитесь, что файлы внутри них доступны по прямой ссылке.Следуя этим шагам, вы обеспечите корректную доставку библиотек драйвера с сервера на мобильное устройство, и метод ПодключитьВнешнююКомпоненту будет отрабатывать стабильно.