Как программно удалить или обновить мобильное приложение 1С на Android?

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

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

В этой статье мы подробно разберем, почему классическое удаление перед установкой — это опасный путь, как правильно организовать накатывание новых релизов APK «поверх» старых, как реализовать программный запрос на удаление и как обновлять бизнес-логику приложения мгновенно без пересборки самого пакета.

Почему удаление приложения перед обновлением — плохая практика?

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

Правильный подход: установка обновления «поверх» старой версии

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

  1. Идентичное имя пакета (Application ID): имя пакета (например, com.company.my1capp) в новой сборке должно символ в символ совпадать со старой версией. Если имя пакета изменится, Android воспримет его как совершенно другое приложение.
  2. Совпадение цифровой подписи (Keystore): новый APK должен быть подписан точно тем же сертификатом разработчика (ключом подписи), что и текущая установленная версия. Если подписать приложение другим ключом, Android выдаст ошибку безопасности и заблокирует установку до тех пор, пока пользователь вручную не удалит старую версию.
  3. Повышение номера версии (Version Code): в манифесте новой сборки код версии (целое число) должен быть строго больше, чем в предыдущей. Только в этом случае ОС поймет, что выполняется процедура обновления, а не даунгрейда.

Как запустить установку скачанного APK из кода 1С

Если вы распространяете мобильное приложение самостоятельно (например, через корпоративный веб-сервер, минуя Google Play), вы можете реализовать механизм автоматического скачивания и установки обновления. После того как файл APK скачан во временное хранилище на мобильном устройстве, мы можем запустить процесс его установки с помощью объекта ЗапускПриложенияМобильногоУстройства.

Рассмотрим пример кода, который инициализирует установку нового пакета:


// Предположим, что новый APK сохранен по пути ПутьКНовомуAPK
Запуск = Новый ЗапускПриложенияМобильногоУстройства;
Запуск.Действие = "android.intent.action.VIEW";
Запуск.Данные = "file://" + ПутьКНовомуAPK; 
Запуск.Тип = "application/vnd.android.package-archive";

Попытка
    Запуск.Запустить();
Исключение
    ВызватьИсключение "Не удалось запустить обновление приложения: " + ОписаниеОшибки();
КонецПопытки;

Важное примечание для современных версий Android: начиная с Android 7.0 и выше, прямая передача путей через схему file:// блокируется из соображений безопасности (возникает ошибка FileUriExposedException). Платформа 1С берет на себя обход этой проблемы при правильной работе с путями, однако в манифесте приложения при сборке обязательно должно быть объявлено системное разрешение:

<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />

При первом запуске обновления система Android попросит пользователя вручную разрешить вашему мобильному приложению «Установку приложений из неизвестных источников». Это стандартное поведение ОС для защиты от вредоносного ПО.

Как инициировать программное удаление приложения

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

Для этого мы также воспользуемся механизмом Intent (Намерения) через объект ЗапускПриложенияМобильногоУстройства:


Намерение = Новый ЗапускПриложенияМобильногоУстройства();
Намерение.Действие = "android.intent.action.DELETE";
// Указываем имя пакета целевого приложения, которое хотим удалить
Намерение.Данные = "package:com.company.old1capp"; 

Попытка
    Намерение.Запустить();
Исключение
    Сообщить("Ошибка при попытке вызвать удаление: " + ОписаниеОшибки());
КонецПопытки;

При запуске этого кода пользователь увидит системный запрос: «Удалить это приложение?». Если пользователь согласится, операционная система очистит память устройства от программы.

Динамическое обновление конфигурации без пересборки APK (Over-the-Air)

В большинстве случаев разработчикам мобильных приложений 1С требуется обновить не саму платформу (которая меняется достаточно редко), а непосредственно бизнес-логику (метаданные, формы, модули конфигурации). Пересобирать ради этого тяжелый APK-файл (весом в 80–100 МБ) крайне нерационально.

Давайте разберем более эффективный механизм — автоматическое обновление конфигурации через публикацию на веб-сервере:

Для тонкой настройки этого процесса разработчики иногда программно анализируют конфигурационные файлы мобильной платформы. Рассмотрим пример кода, который помогает определить путь к файлу настроек информационных баз ibases.v8i на различных версиях мобильных операционных систем:


СисИнфо = Новый СистемнаяИнформация;
ВерсияОС = СокрЛП(СисИнфо.ВерсияОС);

Если Лев(ВерсияОС, 9) = "Apple iOS" Тогда
    ПутьФайлаНастроек = "/Library/1C/1cem/ibases.v8i";
ИначеЕсли Лев(ВерсияОС, 7) = "Android" Тогда
    // Определяем имя пакета динамически или используем константу
    ИмяПакетаПриложения = "com.company.my1capp"; 
    
    Если Лев(ВерсияОС, 9) = "Android 7" ИЛИ Лев(ВерсияОС, 9) = "Android 8" ИЛИ Лев(ВерсияОС, 9) = "Android 9" Тогда
        ПутьФайлаНастроек = "/data/user/0/" + ИмяПакетаПриложения + "/files/ibases.v8i";
    ИначеЕсли Лев(ВерсияОС, 9) = "Android 4" ИЛИ Лев(ВерсияОС, 9) = "Android 5" ИЛИ Лев(ВерсияОС, 9) = "Android 6" Тогда
        ПутьФайлаНастроек = "/data/data/" + ИмяПакетаПриложения + "/files/ibases.v8i";
    Иначе
        // Универсальный путь для современных версий Android 10 и выше
        ПутьФайлаНастроек = "/data/user/0/" + ИмяПакетаПриложения + "/files/ibases.v8i";
    КонецЕсли;
КонецЕсли;

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

Резюме

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

← На главную