При разработке мобильных приложений на платформе 1С программисты часто сталкиваются с необходимостью подключения торгового оборудования, в частности сканеров штрихкодов. Попытка использовать привычную библиотеку ScanOpos.dll, которая успешно работает в настольных версиях, на мобильной платформе (даже если тестирование происходит на ОС Windows) часто заканчивается ошибкой: "возможно отсутствует компонента для используемого клиентского приложения".
В рамках данной статьи мы разберем, почему стандартные библиотеки не подходят для мобильной среды, как правильно упаковать компоненту для мобильного клиента и как избежать типичных ошибок при работе с локальными данными на мобильных устройствах.
Рассмотрим первопричину проблемы. Традиционная библиотека ScanOpos.dll, широко известная по работе с 1С 7.7 и ранними версиями 8.x, чаще всего реализована как COM-компонента. Мобильная платформа 1С (включая мобильный клиент под Windows и Android) имеет архитектурные ограничения: она принципиально не поддерживает технологию COM.
Для того чтобы внешняя компонента заработала на мобильном устройстве, она должна быть написана с использованием технологии Native API. Это кроссплатформенный стандарт 1С, который позволяет библиотеке исполняться в различных средах. Если вы пытаетесь загрузить обычную DLL через общий макет, система видит несоответствие интерфейсов и выдает ошибку отсутствия компоненты.
Проанализируем процесс подключения корректной библиотеки. Для мобильных приложений нельзя просто "закинуть" один файл .dll или .so в макет. Платформа ожидает увидеть структурированный ZIP-архив, содержащий манифест и наборы файлов для разных архитектур.
Выясним, что должно входить в состав такого архива:
.dll для Windows (x86/x64), .so для Android (ARM/x86).manifest.xml.Пример структуры manifest.xml, который позволяет платформе понять, какой файл загружать:
<?xml version="1.0" encoding="UTF-8"?>
<bundle xmlns="http://v8.1c.ru/8.2/uconf/res/compositions">
<component os="Windows" path="ScanOposWin.dll" type="native" arch="i386"/>
<component os="Windows" path="ScanOposWin64.dll" type="native" arch="x86_64"/>
<component os="Android" path="libScanOposArm.so" type="native" arch="arm"/>
</bundle>
Если вы тестируете приложение на Windows-планшете или через мобильный клиент под Windows, 1С будет искать в манифесте секцию os="Windows". Если разрядность вашего мобильного клиента не совпадает с разрядностью библиотеки в манифесте, регистрация также провалится.
Вместо того чтобы пытаться адаптировать старые библиотеки, рекомендуется использовать готовое решение от фирмы 1С — "1С:Библиотека подключаемого оборудования для мобильных устройств" (БПО МП). В ее состав уже включены все необходимые компоненты, разработанные по технологии Native API.
Для подключения сканера в режиме ТСД выполним следующие шаги:
Equipment...).Теперь в коде мобильного приложения мы можем обращаться к этой компоненте. Пример инициализации может выглядеть так:
& Результат = УстановитьВнешнююКомпоненту("ОбщийМакет.КомпонентаСканераШтрихкодов");
Если Результат Тогда
ПодключитьВнешнююКомпоненту("ОбщийМакет.КомпонентаСканераШтрихкодов", "Scanner", ТипВнешнейКомпоненты.Native);
ОбъектДрайвера = Новый("AddIn.Scanner.ScanOpos");
КонецЕсли;
Разберем еще одну проблему, с которой часто сталкиваются при разработке под мобильную платформу (в частности, на версии 2.3.9). При работе с данными может возникать ошибка: "Поле 'Ссылка' не заполнено", даже если вы просто редактируете существующий элемент.
Это связано с особенностями встроенной базы данных SQLite, которую использует мобильное приложение. Платформа 1С на мобильных устройствах крайне чувствительна к составу полей в запросах и кэше. Если вы используете запросы к локальным таблицам, необходимо придерживаться следующих правил:
Ссылка, ВерсияДанных, Код (или Номер), если планируете дальнейшую запись объекта.Записать(). На мобильной платформе контроль заполнения часто срабатывает жестче, чем на полноценном сервере.Рассмотрим пример правильного запроса для мобильной платформы:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура.Ссылка КАК Ссылка,
| Номенклатура.Наименование КАК Наименование,
| Номенклатура.Штрихкод КАК Штрихкод
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| Номенклатура.Штрихкод = &Штрихкод";
Обратите внимание, что даже если нам нужно только наименование, выбор Ссылка помогает платформе корректно идентифицировать объект в локальном кэше при последующих манипуляциях.
Проанализируем ситуацию: если ваша цель — "укрепление собственного опыта" и создание надежного решения для ТСД, рассмотрите альтернативные способы получения данных со сканера, которые не требуют мучительной регистрации ScanOpos.dll:
СредстваМультимедиа.СканироватьШтрихКод(). Она вызывает камеру устройства и возвращает результат напрямую в 1С без всяких внешних компонент.Подведем итог: использование ScanOpos.dll на мобильной платформе — путь тупиковый. Переходите на Native API через БПО МП или используйте штатные возможности мобильной платформы для работы с торговым оборудованием. Это обеспечит стабильность приложения и избавит от ошибок несовместимости типов клиентских приложений.