Как устранить ошибку «Внешняя компонента отсутствует для данной ОС» при сборке мобильного приложения 1С?

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

При разработке мобильных приложений на платформе 1С:Предприятие часто возникает ситуация, когда внешняя компонента (ВК) прекрасно работает в режиме отладки через мобильное приложение «1С:Запуск», но при попытке создать полноценный .apk файл через Сборщик мобильных приложений процесс завершается с ошибкой или предупреждением. Чаще всего в логах сборки можно увидеть сообщение: [WARN] внешняя компонента: [Имя_Компоненты] отсутствует для данной ОС.

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

Разберем причину возникновения проблемы

Проанализируем логику работы Сборщика мобильных приложений. В отличие от стандартной мобильной платформы, которая установлена на конкретном смартфоне или ТСД и использует архитектуру этого устройства (обычно это ARM), Сборщик по умолчанию пытается подготовить универсальный пакет или набор пакетов для всех поддерживаемых архитектур Android:

  1. armeabi-v7a (32-битный ARM)
  2. arm64-v8a (64-битный ARM)
  3. x86 (i386)
  4. x86_64

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

Рассмотрим это на примере компоненты org_innovait_AtolSmartLiteUtils. Она предназначена для ТСД ATOL Smart.Lite, которые работают исключительно на процессорах ARM. Разработчик компоненты логично не включил в поставку библиотеки для x86, так как таких ТСД не существует. Однако Сборщик требует «полный комплект» для прохождения проверки целостности.

Способ 1: «Обман» валидатора через структуру папок (быстрое решение)

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

Проанализируем пошагово процесс модификации выгрузки:

  1. Выполните стандартную выгрузку конфигурации для сборщика мобильного приложения. В результате вы получите файл 1cema.zip (или аналогичный по структуре каталог).
  2. Распакуйте этот архив или откройте его через менеджер архивов.
  3. Перейдите в каталог, где хранятся файлы внешних компонент. Путь обычно выглядит так: Android.
  4. Внутри каталога Android вы увидите папку ARM (или armeabi-v7a).
  5. Создайте вручную рядом с ней папку с именем i386 (это соответствует архитектуре x86).
  6. Скопируйте содержимое папки ARM (файлы .so и другие вспомогательные файлы) в только что созданную папку i386.
  7. Запакуйте всё обратно и запустите процесс сборки в Сборщике мобильных приложений.

Важное замечание: При такой манипуляции приложение успешно соберется, и на ARM-устройствах всё будет работать корректно. Однако, если вы попытаетесь запустить этот APK на эмуляторе (например, BlueStacks) или редком планшете с процессором Intel, приложение упадет с ошибкой UnsatisfiedLinkError, так как система попытается выполнить ARM-код на x86-процессоре.

Способ 2: Корректировка манифеста внешней компоненты

Разберем более «чистый» технический подход. Внутри каждой внешней компоненты (которая представляет собой ZIP-архив) должен находиться файл manifest.xml. Он описывает, для каких платформ предназначены бинарные файлы.

Если в манифесте указано просто platform name="Android", Сборщик ожидает увидеть все 4 архитектуры. Рассмотрим пример правильного описания в манифесте, которое может помочь Сборщику понять ограничения компоненты:


<component xmlns="http://v8.1c.ru/8.2/uobjects">
  <platform name="Android" architecture="armeabi-v7a">
    <file>libAtolUtils.so</file>
  </platform>
  <platform name="Android" architecture="arm64-v8a">
    <file>libAtolUtils64.so</file>
  </platform>
</component>

Если явно указать архитектуры в манифесте самой ВК перед тем, как импортировать её в конфигурацию 1С (в макет или в общий макет), Сборщик может пропустить отсутствие папок для x86 без дополнительных манипуляций с файлом 1cema.

Почему Сборщик ведет себя именно так?

Проанализируем ситуацию с точки зрения издателя приложений. Когда вы загружаете приложение в Google Play, магазин требует наличия 64-битных библиотек (arm64-v8a). Платформа 1С старается соответствовать этим стандартам «из коробки». Даже если вы не планируете публиковать приложение в Store, механизмы сборки остаются унифицированными.

В последних версиях Сборщика (начиная с 2.0.11) требования были несколько смягчены, но если используется старый шаблон мобильной платформы, проблема остается актуальной. Файл 1cema является описанием ресурсов, и если Сборщик видит «пробел» в поддерживаемых архитектурах ОС Android, он выдает [WARN], который на некоторых этапах линковки трактуется как критическая нехватка данных.

Рекомендации по разработке

Чтобы избежать подобных проблем в будущем, при работе с мобильными внешними компонентами рекомендуем придерживаться следующих правил:

  1. Проверяйте состав ВК: Перед загрузкой в 1С убедитесь, что в ZIP-архиве компоненты есть папки для armeabi-v7a и arm64-v8a. Это минимум для современных устройств.
  2. Используйте заглушки: Если компонента специфична для железа (как в случае с ТСД), добавляйте пустые папки или папки-заглушки для x86, чтобы не «ломать» автоматизированные скрипты сборки.
  3. Контролируйте логи: Всегда внимательно читайте лог сборщика. Если вы видите предупреждение об отсутствии компоненты, проверьте структуру каталогов в итоговом файле выгрузки.

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

← На главную