Разработка для мобильных платформ в экосистеме 1С:Предприятие часто преподносит сюрпризы, особенно когда дело касается работы с внешним оборудованием или специфическими библиотеками. Одной из наиболее распространенных проблем является ситуация, когда привычный код для печати штрихкодов, идеально работающий в тонком или толстом клиенте на Windows, категорически отказывается запускаться на мобильном устройстве или в веб-клиенте. В этой статье мы подробно разберем, почему возникает ошибка подключения внешней компоненты печати штрихкода, проанализируем причины ее появления и рассмотрим пошаговые инструкции по исправлению ситуации.
Типичный сценарий проблемы выглядит так: при вызове метода ПодключитьВнешнююКомпоненту система возвращает Ложь (или Неопределено при попытке создания объекта), и штрихкод не генерируется. Рассмотрим стандартный фрагмент кода, который чаще всего используется для этих целей:
// Попытка подключения компоненты из общего макета
ПодключениеВыполнено = ПодключитьВнешнююКомпоненту("ОбщийМакет.КомпонентаПечатиШтрихкодов", "КартинкаШтрихкода", ТипВнешнейКомпоненты.Native);
Если ПодключениеВыполнено Тогда
ВнешняяКомпонента = Новый("AddIn.КартинкаШтрихкода.Barcode");
Иначе
// Здесь мобильное приложение обычно выдает ошибку
Возврат Неопределено;
КонецЕсли;
Проанализируем ситуацию: если этот код работает на ПК, значит, сам макет содержит корректную библиотеку. Однако мобильная платформа предъявляет гораздо более жесткие требования к среде окружения и архитектуре файлов.
Выясним главную техническую причину: внешняя компонента для Windows — это файл с расширением .dll. Но мобильные устройства на Android или iOS работают на процессорах архитектуры ARM. Библиотека .dll, скомпилированная под Windows, физически не может быть исполнена на мобильном процессоре.
Для того чтобы компонента заработала на смартфоне или ТСД (терминале сбора данных), внутри ZIP-архива, который хранится в ОбщийМакет, должны находиться файлы для соответствующих платформ:
.so — для ОС Android..dylib — для ОС iOS.manifest.xml или info.json, который описывает, какой файл загружать для конкретной операционной системы.Если вы используете старую версию компоненты 1С:Печать штрихкодов, в ней может просто не быть мобильных сборок. В этом случае необходимо обновить компоненту, взяв ее из актуальной версии Библиотеки подключаемого оборудования (БПО).
Если ваше мобильное приложение работает через публикацию на Internet Information Services (IIS), проблема может заключаться в том, что сервер просто не отдает файлы нужных расширений мобильному клиенту. Проанализируем настройки MIME-типов. По умолчанию IIS может блокировать передачу файлов, расширения которых ему не знакомы.
Рассмотрим список обязательных MIME-типов, которые необходимо добавить в настройках вашего сайта на IIS:
.so — application/octet-stream.apk — application/vnd.android.package-archive.dylib — application/octet-stream.res — application/octet-stream.json — application/json.zip — application/x-zip-compressedПосле добавления этих типов крайне важно выполнить перепубликацию информационной базы и перезапуск пула приложений. Как показывает практика, простая правка конфигурационного файла без перепубликации иногда не подхватывается мобильным звеном 1С.
При вызове метода ПодключитьВнешнююКомпоненту мобильная платформа скачивает архив из базы, распаковывает его во временную директорию устройства и пытается инициализировать библиотеку. Если у приложения нет прав на запись в эту область или на сервере IIS учетная запись пула приложений (например, IIS AppPool\ИмяПула) не имеет прав на чтение папки макетов, загрузка прервется.
Проверим права доступа для пользователя, под которым запущен IIS. Убедимся, что у него есть права "Чтение" и "Выполнение" на каталог с публикацией базы, а также доступ к системной папке C:\Windows\Temp, которая часто используется для временного хранения объектов метаданных при передаче.
Современные версии платформы 1С 8.3 (особенно начиная с 8.3.18 и выше) настоятельно рекомендуют использовать асинхронные вызовы для работы с внешними объектами. В мобильных ОС синхронное подключение может блокироваться системой безопасности или основным потоком интерфейса.
Разберем пример того, как переписать подключение на асинхронный лад:
&НаКлиенте
Процедура НачатьПодключениеШтрихкода()
ОписаниеОповещения = Новый ОписаниеОповещения("ПослеЗавершенияПодключения", ЭтотОбъект);
// Асинхронное подключение компоненты
НачатьПодключениеВнешнейКомпоненты(ОписаниеОповещения, "ОбщийМакет.КомпонентаПечатиШтрихкодов", "КартинкаШтрихкода", ТипВнешнейКомпоненты.Native);
КонецПроцедуры
&НаКлиенте
Процедура ПослеЗавершенияПодключения(Результат, ДополнительныеПараметры) Экспорт
Если Результат Тогда
ВнешняяКомпонента = Новый("AddIn.КартинкаШтрихкода.Barcode");
// Продолжаем работу с компонентой
Иначе
Сообщить("Не удалось подключить компоненту печати штрихкодов.");
КонецЕсли;
КонецПроцедуры
Использование метода НачатьПодключениеВнешнейКомпоненты значительно повышает стабильность работы приложения на Android и iOS, так как не вызывает "зависания" интерфейса в ожидании ответа от файловой системы.
Если борьба с библиотеками и настройками IIS затянулась, проанализируем альтернативный путь. В современных версиях 1С (начиная с 8.3.16+) появилась возможность генерации некоторых типов штрихкодов средствами самой платформы без привлечения внешних библиотек. Также можно использовать специализированные шрифты (например, для кода EAN-13 или Code39). Шрифты устанавливаются на мобильное устройство или встраиваются в макет, что полностью исключает проблемы с Native API и DLL/SO файлами.
Подведем итог: для решения проблемы в первую очередь проверьте наличие ARM-библиотек в макете, настройте MIME-типы в IIS и попробуйте выполнить полную перепубликацию базы. Если ошибка сохраняется, переход на асинхронные методы подключения станет ключом к стабильной работе вашего мобильного решения.