Предлагаю Вашему вниманию сервис для работы с bluetooth сканером штрихкода, который выполняет передачу данных в мобильное приложение 1С посредством фонового уведомления. Данный подход упрощает работу пользователю с оборудованием.
Предыстория
На данный момент в предприятиях занимающихся торговлей очень часто используются сканеры штрихкодов (как проводные, так и безпроводные) и терминалы сборы данных (ТСД). Разница между ними - цена! Одно устройство ТСД может стоить нескольких (а то и больше) обычных сканеров. Каждое предприятие старается сократить затраты, очевидно выбор падет на обычный сканер. И вот тут на помощь приходит мобильная платформа 1С, которая может работать с подключаемыми устройствами к мобильному устройству. Но, не все так просто...
Как работает сканер штрихкодов?
На данный момент, обычный (современный) сканер имеет два режима работы: режим разрыва клавиатуры и режим эмуляции com-порта (другое название SPP Mode).
В режиме разрыва клавиатуры сканер - это клавиатура. В таком случае необходимо чтобы:
- Экран был включен
- Курсор стоял в поле ввода
- Необходимо разрабатывать особый алгоритм отработки данных
В режим SPP - это обычное устройство подключенное через com-порт, которое посылает на него сообщения (в данной случае считанный штрихкод)
- Необходимо чтобы было запущено приложение (в наш случае 1С) для получения и обработки данных со сканера.
Очевидно, режим SPP это то что нам нужно.
Как подключить беспроводной сканер к мобильному устройству в режиме SPP Mode?
На первый взгляд все просто: включить bluetooth, найти устройство в окружении, подключиться к нему. Да, устройство подключится, но толку от него не будет. Для того чтобы работать со сканером в режиме SPP Mode необходимо дополнительное приложение, которое будет с ним работать. А именно поддерживать подключение и принимать сообщения. И тут на помощь приходит Java. С ее помощью можно разработать то самое приложение, которое нам требуется.
На инфостарте есть несколько публикаций, которые выполняют похожую функцию, но к сожалению только для ТСД. Им огромное спасибо за идею.
раз Управляемый Android Service перехвата сообщений Broadcast со сканера штрих-кодов в 1С
два Внешнее событие" и мобильная платформа 1С
Сервис для работы с беспроводным сканером в режиме SPP Mode
Проштудировав множество сайтов по Java, наткнувшись на множество недоработок в мобильной платформе 1С, в конечном итоге написал приложение (правда без графического интерфейса), которое реализует требуемую функцию.
Немного о сервисе:
- Сервис предоставляет функцию получению УИД устройства (только спаренного, то есть подключенного). Полученный УИД можно будет сохранить где-нибудь в константе и далее использовать его для подключения
- Сервис предоставляет функцию подключения к сканеру (с помощью ранее полученного УИДа) и обеспечивает фоновую работу с устройством.
- Сервис выполняет фоновую отправку уведомления в мобильное приложение 1С.
- Сервис работает со всеми сканерами которые имеют функцию SPP Mode
Как это выглядит в 1С ---->>>>
Вот основное действие для запуска сервиса
#Если МобильноеПриложениеКлиент Тогда
Попытка
Запуск = Новый ЗапускПриложенияМобильногоУстройства();
Запуск.Действие = "com.bluetoothscanersender.action";
// Для ServiceState есть два действия
// 1. GetBTAdress - получаем адрес блютуса
// 2. start - выполняет подключение к сканеру и запускает процедуру для работы с сообщениями от сканера
Запуск.ДополнительныеДанные.Добавить("ServiceState","start");
Запуск.ДополнительныеДанные.Добавить("BTAdress",ЗначениеКонстант.АдресBluetooth);
// получим идентификатор базы, так как при нескольких базах при входящем сообщении
// будет появляться ошибка "Уведомление для неизвестного приложения"
СистемнаяИнформация = Новый СистемнаяИнформация;
// при одной базе указать значение ""
Запуск.ДополнительныеДанные.Добавить("ServiceBase_Name","");
// результат запуска будет в виде всплывающего окна "toast" из запускаемого приложения
Запуск.Запустить(Истина);
Исключение
// сообщаяем что что-то не работает
КонецПопытки;
#КонецЕсли
Вот процедура для обработки уведомлений из сервиса (все возвращаемые значения имеют тип "Строка")
// выполняет подключения обработчика событий, который будет мониторить локальные уведомления
//
Процедура ПодключитьГлобальноеСобытиеОповещения() Экспорт
#Если МобильноеПриложениеКлиент Тогда
ОП = Новый ОписаниеОповещения("ОбработчикЛокальныхУведомлений", ЭтотОбъект);
ДоставляемыеУведомления.ПодключитьОбработчикУведомлений(ОП);
#КонецЕсли
КонецПроцедуры // ПодключитьГлобальноеСобытиеОповещения()
// Подключает процедуру-обработчик получения уведомления
//
// Параметры:
// Уведомление - Объект, содержащий данные уведомления, у которого заполнены только поля "Текст" и "Данные", остальные содержат значения по умолчанию.
// Локальное - тип Булево. Истина - уведомление было создано локально операционной системой. Ложь - было получено Push-уведомление.
// Показано - тип Булево. Указывает, что уведомление было показано пользователю средствами операционной системы.
//
Процедура ОбработчикЛокальныхУведомлений(Уведомление,Локальное,Показано,ДопПараметр) Экспорт
ГлобальноеСобытиеОповещения(Новый Структура("Отправитель,Текст",Уведомление.Текст,Уведомление.Данные));
КонецПроцедуры // ОбработчикЛокальныхУведомлений()
// Обработчик перехваченного события
//
Процедура ГлобальноеСобытиеОповещения(Сообщение)
Отправитель = Сообщение.Отправитель;
Если Отправитель = "SenderBarcode" Тогда
// получили штрих код
Оповестить(Отправитель,Сообщение.Текст, "Сканирование ШК");
ИначеЕсли Отправитель = "GetBTAdress" Тогда
// получили адрес bluetooth нашего сканера в формета "Имя сканера /// Адрес сканера"
Оповестить(Отправитель,Сообщение.Текст, "Адрес bluetooth");
Иначе
Возврат
КонецЕсли;
КонецПроцедуры
Баги, фичи и прочие факи
При разработке приложения на Java проблем не было. Они начались при попытки "подружить" сервис и мобильного приложения 1С.
Итак, имеем следующие баги (или если хотите недоработки) в мобильной платформе 1С:
- Самая важная проблема - мобильное приложение не может принимать внешние оповещения. Вернее в каких то версиях могло принимать, а в каких то нет. В комментариях к этой (Публикация) публикации это упоминалось. Чиниться это просто:
в файле платформы permissions.xml по адресу Android\prjandroid-arm\bin (точно также как описано в публикации) добавляем android:exported="true" и добавляем фильтр на получаемые уведомления
<intent-filter>
<action android:name="com.google.android.c2dm.intent.RECEIVE" />
</intent-filter>
в итоге должны получить следующее:
<LocalNotification>
<uses-permission android:name="android.permission.VIBRATE"/>
<target xpath="/manifest/application" >
<receiver
android:name="com.e1c.mobile.LocalNotificationReceiver"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="com.google.android.c2dm.intent.RECEIVE" />
</intent-filter>
</receiver>
</target>
</LocalNotification>
именно по этому адресу сервис будет отправлять сообщения в 1С, а 1С соответственно получать их.
В сервисе это выглядит так (сообщение отправки списка блютуз устройств):
Intent intentFor1C = new Intent("com.google.android.c2dm.intent.RECEIVE");
intentFor1C.putExtra("text", "GetBTAdress");
intentFor1C.putExtra("title", "1C");
intentFor1C.putExtra("data", (Serializable) TextOfDevice);
intentFor1C.putExtra("base", BaseName);
- Проблемы при сборки apk файла.Если на форме вы создали группу, и назначили ей свойство , например "Свертываемая", то получите ошибку "Ошибка при вызове метода объекта модели XDTO. Неверный параметр" . Вот тут Список неявных ошибок, возникающих при разработке мобильного приложения. И способы их решения есть еще пару багов. На них стоит обратить внимание
Есть некоторые "фичи":
- При сворачивании мобильного приложения 1С, и при следующем возвращении к нему, запущенный клиентский ранее сеанс зависает. И при этом требуется перезапустить приложение. Можно ли это как исправить?Если кто-то знает может поделиться информацией.
Оборудование и программное обеспечение.
При разработке я использовал:
- Сборщик мобильных приложений 1С версии 2.0.7.48 (в сборщике использовал ANT 1.10.5, JDK 1.8.0_181 )
- Мобильная платформа 1С версии 8.3.9.91 (Версия 8.3.12.67 вообще не собралась, опытным путем решил что там ошибок больше чем в выбранной 8.3.9)
- Планшет Samsung Galaxy Tab A (Android 5.1)
- Сервис для работы со сканером написан на Java c помощью Android Studio 3.2.1, с поддержкой api level 15 (взял минимальный для того чтобы приложение работало на большинстве устройств)
- Сканер штрих кодов Netum RD-1698LY (Вот ссылка на его описание). Сразу скажу что режим SPP Mode у него работает только с Windows и Android.
Улучшение сервиса
В дальнейшем планирую сделать сервису графический интерфейс, для того чтобы можно было настраивать различные параметры.