Интеграция мобильных устройств с торговым оборудованием — одна из наиболее востребованных задач при автоматизации складской логистики, розничной торговли и проведения инвентаризаций. Использование компактных Bluetooth-сканеров, особенно в форм-факторе кольца на палец, позволяет существенно повысить производительность работы персонала, оставляя руки сотрудника свободными для работы с товаром. В этой статье мы подробно рассмотрим, как реализовать подключение беспроводного Bluetooth-сканера к мобильному приложению или мобильному клиенту на платформе 1С:Предприятие 8, разберем архитектуру взаимодействия и напишем готовый код для обработки считанных штрихкодов.
Для реализации полноценного взаимодействия мобильного устройства со сканером штрихкодов нам не требуется писать низкоуровневые драйверы с нуля. Компания 1С предоставляет специализированный инструмент — «1С:Библиотека подключаемого оборудования для мобильных приложений» (МБПО). Именно на ее основе строятся все типовые мобильные решения от 1С.
В основе работы с оборудованием на мобильной платформе Android лежат так называемые внешние компоненты, созданные по технологии Native API. Эти компоненты компилируются под целевые операционные системы (в данном случае — под архитектуру процессоров Android ARM/x86) и поставляются внутри конфигурации 1С в виде двоичных данных, упакованных в zip-архивы и помещенных в ОбщиеМакеты. Примером такого макета является Драйвер1СУстройствоВводаNative или специализированный Драйвер1ССканерШтрихкода.
Когда мобильное приложение запускается, платформа с помощью метода ПодключитьВнешнююКомпоненту извлекает бинарный драйвер из общего макета, устанавливает его в операционную систему мобильного устройства и инициализирует объект драйвера. После этого драйвер начинает слушать порт подключения и транслировать полученные данные в платформу 1С в виде внешнего события.
Перед тем как перейти к настройке программной части, нам необходимо четко разграничить два принципиально разных режима работы Bluetooth-сканера. Неправильный выбор режима — наиболее частая причина сбоев при интеграции. Рассмотрим их подробнее.
1. Режим HID (Human Interface Device / Эмуляция клавиатуры)
В этом режиме мобильный телефон воспринимает подключенный по Bluetooth сканер как обычную беспроводную клавиатуру. При сканировании штрихкода устройство просто эмулирует быстрое нажатие клавиш, «печатая» символы штрихкода в активное текстовое поле на экране.
2. Режим SPP (Serial Port Profile) и BLE (Bluetooth Low Energy)
В этом режиме сканер работает как виртуальный последовательный COM-порт. Данные передаются в фоновом режиме напрямую в приложение 1С через соответствующий сокет, минуя системный буфер ввода клавиатуры Android.
Для профессиональной работы на складе мы настоятельно рекомендуем использовать исключительно режим SPP.
Рассмотрим процедуру подключения недорогого беспроводного сканера-кольца к мобильному телефону по шагам:
0000, 1234 или 1111 (точные данные всегда указаны в инструкции к устройству).Драйвер1СУстройствоВводаNative). В параметрах подключения укажите порт подключения «Bluetooth». Нажмите кнопку поиска устройств, выберите из списка ваше сопряженное сканер-кольцо и сохраните настройки.Теперь рассмотрим, как выглядит программная обработка событий сканирования. Когда сканер считывает штрихкод в режиме SPP, внешняя компонента генерирует внешнее событие, которое перехватывается платформой 1С и передается в глобальный модуль или модуль управляемой формы через предопределенную процедуру ОбработкаОповещения.
Проанализируем пример кода для управляемой формы мобильного приложения, выполняющей сканирование товаров:
&НаКлиенте
Перем ПоддерживаемыйИсточник;
&НаКлиенте
Процедура ПриОткрытии(Отказ)
// Задаем имя источника события, которое генерирует наш драйвер сканера
ПоддерживаемыйИсточник = "BarcodeScanner";
// Попытаемся подключить внешнюю компоненту из общего макета конфигурации
ИмяМакета = "ОбщийМакет.Драйвер1СУстройствоВводаNative";
Попытка
РезультатПодключения = ПодключитьВнешнююКомпоненту(ИмяМакета, "СканерШК", ТипВнешнейКомпоненты.Native);
Если РезультатПодключения Тогда
// Инициализируем объект драйвера для работы с портами
ОбъектДрайвера = Новый("АддитивнаяКомпонента.СканерШК");
Сообщить("Драйвер сканера штрихкодов успешно подключен!");
Иначе
Сообщить("Не удалось загрузить внешнюю компоненту сканера.");
КонецЕсли;
Исключение
ЗаписьЖурналаРегистрации("ПодключениеСканера", УровеньЖурналаРегистрации.Ошибка,,, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
Сообщить("Критическая ошибка при подключении драйвера!");
КонецПопытки;
КонецПроцедуры
&НаКлиенте
Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)
// Проверяем, что событие пришло именно от нашего сканера штрихкодов
Если Источник = ПоддерживаемыйИсточник Или ИмяСобытия = "ВнешнееСобытие" Тогда
// В зависимости от драйвера, штрихкод может приходить напрямую в параметре
// или требовать разбора структуры данных. Рассмотрим стандартный вариант БПО.
Штрихкод = "";
Если ТипЗнч(Параметр) = Тип("Структура") Тогда
Параметр.Свойство("Штрихкод", Штрихкод);
ИначеЕсли ТипЗнч(Параметр) = Тип("Массив") И Параметр.Количество() > 0 Тогда
Штрихкод = Строка(Параметр[0]);
Иначе
Штрихкод = Строка(Параметр);
EndIf;
Штрихкод = СокрЛП(Штрихкод);
Если НЕ ПустаяСтрока(Штрихкод) Тогда
// Вызываем процедуру обработки полученного значения
ОбработатьПолученныйШтрихкод(Штрихкод);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ОбработатьПолученныйШтрихкод(Знач ТекущийШтрихкод)
// Очищаем спецсимволы, которые могут приходить в конце строки (например, символы переноса строки)
ТекущийШтрихкод = СтрЗаменить(ТекущийШтрихкод, Символы.ПС, "");
ТекущийШтрихкод = СтрЗаменить(ТекущийШтрихкод, Символы.ВК, "");
ПоказатьОповещениеПользователя("Сканирование",, "Считан штрихкод: " + ТекущийШтрихкод, БиблиотекаКартинок.Информация);
// Здесь реализуется прикладная логика поиска товара в базе данных
// Например, вызов серверной процедуры для поиска номенклатуры
ДанныеТовара = НайтиТоварНаСервере(ТекущийШтрихкод);
Если ДанныеТовара.Найден Тогда
// Добавляем строку в табличную часть документа
НоваяСтрока = Объект.Товары.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСтрока, ДанныеТовара);
НоваяСтрока.Количество = 1;
Иначе
// Если товар не найден, подаем звуковой сигнал предупреждения
Сигнал();
ВызватьИсключениеПредупреждение("Товар со штрихкодом " + ТекущийШтрихкод + " не зарегистрирован в базе данных!");
КонецЕсли;
КонецПроцедуры
&НаСервереБезКонтекста
Функция НайтиТоварНаСервере(Знач Штрихкод)
Результат = Новый Структура("Найден, Номенклатура, Характеристика, Цена", Ложь, Неопределено, Неопределено, 0);
// Выполняем запрос к регистру сведений "ШтрихкодыНоменклатуры"
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ РАЗРЕШЕННЫЕ
| Штрихкоды.Номенклатура КАК Номенклатура,
| Штрихкоды.Характеристика КАК Характеристика
|ИЗ
| РегистрСведений.ШтрихкодыНоменклатуры КАК Штрихкоды
|ГДЕ
| Штрихкоды.Штрихкод = &Штрихкод";
Запрос.УстановитьПараметр("Штрихкод", Штрихкод);
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
Результат.Найден = Истина;
Результат.Номенклатура = Выборка.Номенклатура;
Результат.Характеристика = Выборка.Характеристика;
КонецЕсли;
Возврат Результат;
КонецФункции
Если вы используете не просто бытовой смартфон, а специализированный защищенный сканфон или промышленный ТСД со встроенным лазерным считывателем (например, устройства от Zebra, Honeywell, Urovo), наиболее производительным и отказоустойчивым решением будет использование механизма Broadcast Intents (широковещательных сообщений Android).
Суть метода заключается в следующем:
Для реализации этого сценария в настройках интеграции 1С выбирается режим работы драйвера «Широковещательное сообщение» (Broadcast), и указываются параметры перехвата, настроенные в утилите управления сканером на ТСД (например, Action: android.intent.ACTION_DECODE_DATA, Extra: barcode_string).
Разработчики часто сталкиваются с непонятной ошибкой: при отладке на компьютере в тонком клиенте все работает штатно, но при попытке запустить мобильный клиент на Android-смартфоне метод ПодключитьВнешнююКомпоненту возвращает Ложь, и сканер отказывается инициализироваться.
Выясним причину этой проблемы. При работе через мобильный клиент или мобильное приложение, которое синхронизируется с сервером базы данных, платформа пытается скачать бинарные файлы драйверов (архивы и скомпилированные библиотеки .so для Android) с веб-сервера (IIS или Apache), на котором опубликована информационная база 1С. По умолчанию популярные веб-серверы из соображений безопасности блокируют скачивание файлов с неизвестными им расширениями.
Чтобы решить эту проблему, необходимо вручную прописать разрешенные MIME-типы в настройках вашего веб-сервера:
Для Microsoft IIS:
.soapplication/octet-stream.apkapplication/octet-streamДля Apache (httpd.conf):
В конфигурационный файл httpd.conf веб-сервера Apache необходимо добавить следующие строки, разрешающие отдачу бинарных файлов мобильным клиентам:
AddType application/octet-stream .so
AddType application/octet-stream .apk
После внесения изменений обязательно перезапустите службу Apache. Это полностью устранит проблему с блокировкой скачивания драйверов мобильными устройствами.
Проанализируем накопленный опыт использования связки «смартфон + Bluetooth-сканер-кольцо» в реальных складских условиях по сравнению с классическими терминалами сбора данных (ТСД):
Таким образом, мы рассмотрели полный цикл интеграции беспроводного сканирующего оборудования с мобильной 1С — от физических настроек сопряжения Bluetooth SPP до написания кода обработки внешних событий и конфигурирования веб-сервера. Следуя этим инструкциям, вы сможете развернуть стабильную и быструю систему мобильного учета на вашем предприятии.