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

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

В процессе разработки сложных мобильных решений на платформе 1С:Предприятие часто возникает необходимость взаимодействия с внешним оборудованием, например, сканерами штрихкодов или терминалами сбора данных. Иногда стандартных возможностей платформы недостаточно, и разработчики пишут собственные драйверы или сервисы на языке Java/Kotlin, компилируют их в APK и хотят реализовать механизм бесшовной установки или обновления этого компонента прямо из интерфейса 1С. Рассмотрим, как правильно реализовать запуск инсталляции APK-файла, и разберем типичные ошибки, возникающие при этом процессе.

Анализ проблемы: почему стандартный запуск приложения не срабатывает

Разберем ситуацию: разработчик подготовил APK-файл, поместил его в ОбщийМакет конфигурации и пытается программно запустить его установку. Типичный код, который на первый взгляд кажется верным, выглядит следующим образом:


&НаКлиенте
Процедура УстановитьДрайвер(Команда)
    #Если МобильноеПриложениеКлиент Тогда 
        СсылкаНаФайл = ПолучитьСсылкуНаДрайвер();
        ИмяФайлаВрем = "ДрайверСканера.apk";
        ВременныйКаталог = КаталогВременныхФайлов();
        Если ПолучитьФайл(СсылкаНаФайл, ВременныйКаталог + ИмяФайлаВрем, Ложь) Тогда
            ЗапуститьПриложение(ВременныйКаталог + ИмяФайлаВрем);
        КонецЕсли;
    #КонецЕсли
КонецПроцедуры

Проанализируем ситуацию: при выполнении этого кода в мобильном приложении часто ничего не происходит. Выясним причину. Основная проблема заключается в политике безопасности операционной системы Android и особенностях работы платформы 1С с файловой системой. Когда мы используем метод КаталогВременныхФайлов(), файл сохраняется в приватную папку приложения. К этой папке имеет доступ только само приложение 1С. Системный установщик пакетов (Package Installer), который запускается методом ЗапуститьПриложение(), работает под другой системной учетной записью и просто «не видит» файл в защищенном временном хранилище, получая ошибку доступа (Access Denied).

Решение проблемы: правильный выбор каталога и прав доступа

Для того чтобы внешняя системная утилита смогла прочитать наш APK-файл, его необходимо поместить в область памяти, доступную для совместного использования. В платформе 1С для этих целей лучше всего подходит КаталогДокументов(). Рассмотрим исправленный алгоритм установки:

  1. Извлекаем бинарные данные APK-файла из макета на сервере.
  2. Передаем файл на мобильное устройство.
  3. Сохраняем файл именно в КаталогДокументов().
  4. Вызываем команду ЗапуститьПриложение(), передавая путь к файлу в общедоступном каталоге.

Посмотрим на обновленный пример кода, который успешно решает задачу:


&НаКлиенте
Процедура УстановитьДрайвер(Команда)
    
    #Если МобильноеПриложениеКлиент Тогда 
        // Получаем файл из временного хранилища (куда он был помещен на сервере)
        АдресФайла = ПолучитьФайлССервера();
        
        // Ключевой момент: используем КаталогДокументов вместо КаталогВременныхФайлов
        ПутьКФайлу = КаталогДокументов() + "ScannerDriver.apk";
        
        ОписаниеФайла = Новый ОписаниеПередаваемогоФайла(ПутьКФайлу, АдресФайла);
        МассивФайлов = Новый Массив;
        МассивФайлов.Добавить(ОписаниеФайла);
        
        // Получаем файл во внутреннюю память устройства
        НачатьПолучениеФайловССервера(Новый ОписаниеОповещения("ПослеЗагрузкиДрайвера", ЭтотОбъект), МассивФайлов);
    #КонецЕсли
    
КонецПроцедуры

&НаКлиенте
Процедура ПослеЗагрузкиДрайвера(Результат, ДополнительныеПараметры) Экспорт
    Если Результат = Неопределено Тогда
        Возврат;
    КонецЕсли;
    
    ПутьКФайлу = Результат[0].Имя;
    // Запуск системного установщика
    ЗапуститьПриложение(ПутьКФайлу);
КонецПроцедуры

Важные технические нюансы работы в Android

Проанализируем дополнительные факторы, которые могут влиять на успешность запуска установки в современных версиях ОС 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) к файлу внутри песочницы приложения.

Различие между Компонентой и Сервисом

Рассмотрим важный архитектурный момент, упомянутый в обсуждении. Существует два принципиально разных способа расширения функционала:

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

← На главную