Работа с терминалами сбора данных (ТСД) на базе ОС Android в экосистеме 1С имеет свои специфические особенности. Зачастую разработчики сталкиваются с ситуацией, когда внешняя компонента (ВК) вроде бы успешно загружается в память, но метод Подключить() упорно возвращает Ложь. В рамках данной статьи мы подробно разберем, как пройти путь от инициализации компоненты до получения данных со сканера, проанализируем типичные ошибки и выясним, почему тип макета в конфигурации играет решающую роль.
Начнем с классического способа подключения, который часто используется в самописных мобильных приложениях. Для того чтобы мобильная платформа «увидела» драйвер, необходимо сначала установить его на устройство, а затем подключить. Рассмотрим последовательность действий и программный код, который для этого требуется.
Для инициализации мы используем асинхронные методы платформы, так как в мобильном приложении блокирующие вызовы крайне нежелательны и могут привести к зависанию интерфейса. Проанализируем типичный пример кода:
&НаКлиенте
Процедура ПодключитьСканер()
ОписаниеОповещения = Новый ОписаниеОповещения("ПослеПодключенияКомпоненты", ЭтаФорма);
НачатьПодключениеВнешнейКомпоненты(ОписаниеОповещения, "ОбщийМакет.ДрайверСканера1С", "ScannerNative", ТипВнешнейКомпоненты.Native);
КонецПроцедуры
&НаКлиенте
Процедура ПослеПодключенияКомпоненты(Результат, ДополнительныеПараметры) Экспорт
Если Результат Тогда
Попытка
ОбъектДрайвера = Новый("AddIn.ScannerNative.BarcodeScanner");
// Далее следует инициализация параметров
Исключение
Сообщить("Ошибка создания объекта драйвера!");
КонецПопытки;
Иначе
Сообщить("Не удалось подключить внешнюю компоненту");
КонецЕсли;
КонецПроцедуры
На этом этапе многие сталкиваются с тем, что объект создается (ОбъектДрайвера не равен Неопределено), но при попытке выполнить ОбъектДрайвера.Подключить("") система возвращает Ложь. Давайте разберемся, почему это происходит.
Одной из самых коварных ошибок при разработке под Android является неверный выбор типа объекта Макет в дереве конфигурации. Рассмотрим ситуацию подробнее: если вы загружаете драйвер (обычно это zip-архив с манифестом и библиотеками .so) в макет с типом Двоичные данные, система может вести себя нестабильно.
Выясним причину: при запуске в режиме обычного мобильного клиента через стандартную «оболочку» 1С, платформа может прощать такие несоответствия. Однако, как только вы собираете полноценный APK-пакет, механизмы безопасности Android и внутренняя логика платформы начинают строго проверять тип ресурса. Для корректной работы макет ОБЯЗАТЕЛЬНО должен иметь тип Внешняя компонента.
Важный момент: если вы обнаружили, что УстановитьВнешнююКомпоненту() или НачатьПодключениеВнешнейКомпоненты() выдает ошибку именно в собранном приложении, проверьте свойства макета. Пересоздайте макет с правильным типом, заново загрузите туда архив драйвера, и проблема с возвратом Ложь методом Подключить() во многих случаях исчезнет сама собой.
Если компонента подключилась, но сканер все еще не реагирует на нажатие кнопки, необходимо настроить параметры связи. В современных ТСД (Zebra, Honeywell, АТОЛ) сканер часто работает через системную службу DataWedge или её аналоги. В этом случае драйвер 1С должен «слушать» определенные системные события Android — так называемые Intents.
Рассмотрим, как получить список доступных параметров у компоненты. Большинство современных Native API компонент поддерживают метод получения описания параметров в формате XML. Проанализируем, как это можно использовать для отладки:
ПараметрыВК = "";
ОбъектДрайвера.ПолучитьПараметры(ПараметрыВК);
// В переменной ПараметрыВК теперь содержится XML-структура
// с именами параметров, такими как "Устройство", "EventName", "Data"
Для работы через Broadcast Intent (широковещательные сообщения) нам нужно передать компоненте настройки, соответствующие профилю сканирования в настройках Android. Обычно это параметры:
com.1c.mobile.SCAN_ACTION.Установка параметров выполняется методом УстановитьПараметр(). Только после установки корректных параметров метод Подключить() инициализирует слушателя событий и начнет генерировать ВнешнееСобытие в 1С.
Разберем, почему ручное использование методов НачатьПодключениеВнешнейКомпоненты считается менее предпочтительным. Разработчики 1С рекомендуют использовать механизмы БПО (Библиотека подключаемого оборудования для мобильных приложений). Это позволяет абстрагироваться от конкретных версий драйверов и архитектур процессоров.
Проанализируем преимущества использования методов БПО:
ДрайверыОборудования и ПодключаемоеОборудование позволяет менять настройки сканера (суффиксы, префиксы, режимы работы) без переписывания программного кода.
МенеджерОборудованияКлиент.ПодключитьОборудование(Оповещение, ИдентификаторУстройства);
Если же вы создаете максимально легкое приложение и решили отказаться от БПО, помните рекомендации из сообщения №23 форума: для подключения компоненты из макета лучше использовать общие модули ОбщегоНазначенияКлиент.ПодключитьКомпонентуИзМакета. Это обеспечивает более высокий уровень стабильности при обновлении платформы.
При анализе причин отказа работы ВК на новых ТСД с Android 10 и выше, нельзя забывать про разрядность. Современные требования Google Play диктуют использование 64-битных библиотек. Убедитесь, что используемая вами версия драйвера (например, из последних релизов БПО версии 2.1.x или выше) содержит внутри zip-архива папку libs/arm64-v8a с соответствующим файлом .so.
Если ТСД имеет 64-битную архитектуру, а ваша компонента содержит только 32-битные библиотеки (папка armeabi-v7a), то метод УстановитьВнешнююКомпоненту может успешно выполниться (так как это просто распаковка файлов), но попытка создать объект или вызвать Подключить() приведет к краху или возврату Ложь, так как бинарный код не может быть исполнен в данной среде.
Проанализировав ситуацию с подключением сканера на Android, мы выделили основные шаги для успешной интеграции:
Ложь в методе Подключить(), исследуйте XML-параметры драйвера и сопоставьте их с настройками Android Intents на самом ТСД.Соблюдение этих правил позволит вам быстро и надежно внедрить сканирование штрихкодов в любой мобильный проект на платформе 1С.