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

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

При разработке и сборке мобильных приложений на платформе «1С:Предприятие» разработчики часто сталкиваются с двумя ключевыми задачами: корректная настройка окружения Android SDK для сборки APK-пакета и реализация начального наполнения базы данных при автономной работе мобильного приложения (без обязательного подключения к центральной информационной базе).

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

Устранение ошибки сборки «com.android.sdklib.build.ApkCreationException: java.io.FileNotFoundException: 1cem.ap_ does not exist»

В процессе компиляции и сборки мобильного пакета через «Сборщик мобильных приложений» на этапе выполнения Ant-скрипта может возникать ошибка отсутствия промежуточного файла ресурсов 1cem.ap_. Выясним причину такого поведения.

Файл 1cem.ap_ представляет собой скомпилированный архив ресурсов Android-приложения, который генерируется утилитой упаковки ресурсов (AAPT). Если компиляция ресурсов завершается со сбоем, скрипт сборки не находит результирующий файл и прерывает процесс. Разберем по шагам, как локализовать и устранить проблему:

  1. Согласование версий Android SDK и Сборщика: Убедимся, что установленные версии Android SDK Platform, SDK Platform-tools и SDK Build-tools соответствуют требованиям используемой версии сборщика мобильных приложений. Для устаревших сборок на базе утилиты Ant критически важно использовать совместимые пакеты инструментов (например, Build-tools 23.x.x), так как более поздние версии Google SDK прекратили поддержку Ant-сценариев. При использовании современных версий мобильной платформы рекомендуется обновить сам «Сборщик мобильных приложений» на версию с поддержкой Gradle.
  2. Проверка версии Java Development Kit (JDK): Для сборок с использованием утилиты Ant требуется строго JDK 8 (версия 1.8). Использование более новых версий Java (JDK 9, 11, 17) вызывает непредвиденные сбои в работе сценариев build.xml.
  3. Проверка путей к каталогам: Проверим, чтобы в путях к Android SDK, JDK, сборщику и каталогу временных файлов (например, C:\mobilTMP\) полностью отсутствовали пробелы, кириллические символы и спецсимволы.

Как передать начальные данные в мобильное приложение без подключения к серверу

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

Рассмотрим проверенные и эффективные способы передачи начальных данных в автономное приложение.

Способ 1. Хранение данных в общем макете конфигурации (рекомендуемый)

Данные каталога (в формате JSON или XML) предварительно выгружаются и помещаются в конфигурацию мобильного приложения как ОбщийМакет с типом Двоичные данные или Текстовый документ. При первом запуске приложения эти данные считываются и загружаются в справочники программно.

Разберем пример реализации. В модуль управляемого приложения поместим обработчик события ПриНачалеРаботыСистемы:


Процедура ПриНачалеРаботыСистемы()
    
    Если Не Константы.БазаИнициализирована.Получить() Тогда
        ИнициализироватьНачальныеДанные();
    КонецЕсли;
    
КонецПроцедуры

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


Процедура ИнициализироватьНачальныеДанные()
    
    // Получаем макет с предварительно подготовленными данными в формате XML или JSON
    МакетДанных = ПолучитьОбщийМакет("НачальныйКаталог");
    
    // Для текстовых данных (JSON / XML) читаем текст напрямую из макета
    Чтение = Новый ЧтениеXML;
    Чтение.УстановитьСтроку(МакетДанных.ПолучитьТекст());
    
    // Начинаем транзакцию для максимальной скорости записи на мобильном устройстве
    НачатьТранзакцию();
    
    Попытка
        Пока Чтение.Прочитать() Цикл
            Если Чтение.ТипУзла = ТипУзлаXML.НачалоЭлемента И Чтение.Имя = "Товар" Тогда
                НовыйТовар = Справочники.Номенклатура.СоздатьЭлемент();
                НовыйТовар.Наименование = Чтение.ПолучитьАтрибут("Наименование");
                НовыйТовар.Артикул = Чтение.ПолучитьАтрибут("Артикул");
                НовыйТовар.Записать();
            КонецЕсли;
        КонецЦикла;
        
        // Фиксируем факт успешной инициализации базы
        Константы.БазаИнициализирована.Установить(Истина);
        ЗафиксироватьТранзакцию();
    Исключение
        ОтменитьТранзакцию();
        ВызватьИсключение;
    КонецПопытки;
    
    Чтение.Закрыть();
    
КонецПроцедуры

Если данные сохранены как двоичный макет произвольного формата, мы также можем преобразовать их в строку или сохранить во временный файл сеанса, используя системные методы платформы:


ДвоичныеДанные = ПолучитьОбщийМакет("МакетДвоичныхДанных");
ИмяВременногоФайла = ПолучитьИмяВременногоФайла("xml");
ДвоичныеДанные.Записать(ИмяВременногоФайла);

// Выполняем чтение из временного файла
Чтение = Новый ЧтениеXML;
Чтение.ОткрытьФайл(ИмяВременногоФайла);
// Обработка данных...
Чтение.Закрыть();

// Удаляем временный файл после обработки
УдалитьФайлы(ИмяВременногоФайла);

Важное замечание по путям к файлам в Android: Не следует использовать жестко заданные пути вроде /sdcard/..., так как в современных версиях операционной системы Android действуют жесткие ограничения политики безопасности (Scoped Storage). Для работы с файлами всегда используйте функцию ПолучитьИмяВременногоФайла() или стандартный рабочий каталог пользователя.

Способ 2. Использование предопределенных элементов метаданных

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

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

Способ 3. Использование вкладки «Файлы» в Сборщике мобильных приложений

Если необходимо включить в мобильное приложение большие объемы служебных файлов (справочные базы SQLite, медиафайлы, готовые каталоги), не раздувая при этом файл конфигурации 1cema.xml, можно воспользоваться вкладкой «Файлы» в «Сборщике мобильных приложений». Эти файлы упаковываются в подкаталог ресурсов APK-пакета и могут быть прочитаны средствами платформы при старте мобильного клиента.

← На главную