В процессе разработки сложных мобильных решений на платформе 1С:Предприятие часто возникает необходимость взаимодействия с внешним оборудованием, например, сканерами штрихкодов или терминалами сбора данных. Иногда стандартных возможностей платформы недостаточно, и разработчики пишут собственные драйверы или сервисы на языке Java/Kotlin, компилируют их в APK и хотят реализовать механизм бесшовной установки или обновления этого компонента прямо из интерфейса 1С. Рассмотрим, как правильно реализовать запуск инсталляции APK-файла, и разберем типичные ошибки, возникающие при этом процессе.
Разберем ситуацию: разработчик подготовил APK-файл, поместил его в ОбщийМакет конфигурации и пытается программно запустить его установку. Типичный код, который на первый взгляд кажется верным, выглядит следующим образом:
&НаКлиенте
Процедура УстановитьДрайвер(Команда)
#Если МобильноеПриложениеКлиент Тогда
СсылкаНаФайл = ПолучитьСсылкуНаДрайвер();
ИмяФайлаВрем = "ДрайверСканера.apk";
ВременныйКаталог = КаталогВременныхФайлов();
Если ПолучитьФайл(СсылкаНаФайл, ВременныйКаталог + ИмяФайлаВрем, Ложь) Тогда
ЗапуститьПриложение(ВременныйКаталог + ИмяФайлаВрем);
КонецЕсли;
#КонецЕсли
КонецПроцедуры
Проанализируем ситуацию: при выполнении этого кода в мобильном приложении часто ничего не происходит. Выясним причину. Основная проблема заключается в политике безопасности операционной системы Android и особенностях работы платформы 1С с файловой системой. Когда мы используем метод КаталогВременныхФайлов(), файл сохраняется в приватную папку приложения. К этой папке имеет доступ только само приложение 1С. Системный установщик пакетов (Package Installer), который запускается методом ЗапуститьПриложение(), работает под другой системной учетной записью и просто «не видит» файл в защищенном временном хранилище, получая ошибку доступа (Access Denied).
Для того чтобы внешняя системная утилита смогла прочитать наш APK-файл, его необходимо поместить в область памяти, доступную для совместного использования. В платформе 1С для этих целей лучше всего подходит КаталогДокументов(). Рассмотрим исправленный алгоритм установки:
APK-файла из макета на сервере.КаталогДокументов().ЗапуститьПриложение(), передавая путь к файлу в общедоступном каталоге.Посмотрим на обновленный пример кода, который успешно решает задачу:
&НаКлиенте
Процедура УстановитьДрайвер(Команда)
#Если МобильноеПриложениеКлиент Тогда
// Получаем файл из временного хранилища (куда он был помещен на сервере)
АдресФайла = ПолучитьФайлССервера();
// Ключевой момент: используем КаталогДокументов вместо КаталогВременныхФайлов
ПутьКФайлу = КаталогДокументов() + "ScannerDriver.apk";
ОписаниеФайла = Новый ОписаниеПередаваемогоФайла(ПутьКФайлу, АдресФайла);
МассивФайлов = Новый Массив;
МассивФайлов.Добавить(ОписаниеФайла);
// Получаем файл во внутреннюю память устройства
НачатьПолучениеФайловССервера(Новый ОписаниеОповещения("ПослеЗагрузкиДрайвера", ЭтотОбъект), МассивФайлов);
#КонецЕсли
КонецПроцедуры
&НаКлиенте
Процедура ПослеЗагрузкиДрайвера(Результат, ДополнительныеПараметры) Экспорт
Если Результат = Неопределено Тогда
Возврат;
КонецЕсли;
ПутьКФайлу = Результат[0].Имя;
// Запуск системного установщика
ЗапуститьПриложение(ПутьКФайлу);
КонецПроцедуры
Проанализируем дополнительные факторы, которые могут влиять на успешность запуска установки в современных версиях ОС Android (версии 8.0, 10, 11 и выше):
1. Разрешение на установку из неизвестных источников. Начиная с Android 8.0, это разрешение выдается не глобально для всей системы, а для каждого конкретного приложения. При первом вызове ЗапуститьПриложение() для APK, система может заблокировать действие и предложить пользователю перейти в настройки, чтобы разрешить мобильному клиенту 1С устанавливать приложения. Мы должны быть готовы проинструктировать пользователя об этом шаге.
2. MIME-типы. В некоторых случаях платформе 1С требуется явно «подсказать», что передаваемый файл является инсталлятором. Хотя расширение .apk обычно обрабатывается корректно, системный MIME-тип для таких файлов — application/vnd.android.package-archive. При использовании расширенных функций запуска мобильного устройства через ДанныеМобильногоУстройства можно указывать этот тип явно.
3. Использование Scoped Storage. В последних версиях Android (11+) доступ к файловой системе сильно ограничен. Использование КаталогДокументов() в 1С является наиболее стабильным способом, так как платформа берет на себя механизмы FileProvider, позволяя системному установщику безопасно получить временный доступ (URI) к файлу внутри песочницы приложения.
Рассмотрим важный архитектурный момент, упомянутый в обсуждении. Существует два принципиально разных способа расширения функционала:
.so файл (библиотека C++), упакованная в .zip с манифестом 1С. Она подключается методом ПодключитьВнешнююКомпоненту() и работает внутри процесса 1С. В этом случае устанавливать APK не нужно.APK). Оно работает как отдельный процесс. Для взаимодействия с ним из 1С используется механизм Intent (через ЗапуститьПриложениеМобильногоУстройства) или широковещательные сообщения (Broadcast Intents).Если ваша задача — реализовать обновление самого мобильного приложения 1С (конфигурации), рекомендуется использовать штатный механизм, указав «Адрес для обновления конфигурации» в свойствах мобильного приложения. Однако для установки вспомогательных утилит описанный метод с использованием КаталогДокументов() является единственно верным и проверенным на практике решением.