ВНИМАНИЕ! Компонента не имеет видимого интерфейса. При попытке запустить через иконку ничего происходить не будет!
Работает с мобильной платформой не выше 8.3.11
Предыстория создания //infostart.ru/public/586539/ (сначала ознакомиться)
На том этапе был создан сервис, который "жил сам по себе", запускался при старте системы, имел интерфейс и ручные настройки. Мне это показалось не достаточно удобным. Родилась идея отдельной компоненты. Она похожа на предыдущую, но управляется из 1С, не имеет интерфейса с настройками.
В модуль управляемого приложения прописываем:
Процедура ПриНачалеРаботыСистемы()
ОбщегоНазначенияКлиент.ПодключитьГлобальноеСобытиеОповещения();
ОбщегоНазначенияКлиент.ЗапуститьКомпонентуСканирования();
КонецПроцедуры
Процедура ПриЗавершенииРаботыСистемы()
ОбщегоНазначенияКлиент.ОстановитьКомпонентуСканирования();
КонецПроцедуры
В модуль ОбщегоНазначенияКлиент
Процедура ПодключитьГлобальноеСобытиеОповещения() Экспорт
#Если МобильноеПриложениеКлиент Тогда
Оп = Новый ОписаниеОповещения("ОбработчикЛокальныхУведомлений", ЭтотОбъект);
ДоставляемыеУведомления.ПодключитьОбработчикУведомлений(Оп);
#КонецЕсли
КонецПроцедуры
Процедура ГлобальноеСобытиеОповещения(Сообщение, ЧтоТоЕще = "") Экспорт
Попытка
Отправитель = Число(Сообщение.Отправитель);
Исключение
Возврат
КонецПопытки;
Если Отправитель = 1 Тогда
Оповестить(Формат(Отправитель,"ЧГ="),Сообщение.Текст, "Сканирование ШК");
Иначе
Возврат
КонецЕсли;
КонецПроцедуры
Процедура ОбработчикЛокальныхУведомлений(Уведомление,Локальное,Показано, ЧтоТоЕще) Экспорт
ГлобальноеСобытиеОповещения(Новый Структура("Отправитель,Текст",Уведомление.Текст,Уведомление.Данные));
КонецПроцедуры
&НаКлиенте
Процедура ЗапуститьКомпонентуСканирования() Экспорт
#Если МобильноеПриложениеКлиент Тогда
НовЗП = Новый ЗапускПриложенияМобильногоУстройства();
НовЗП.Действие = "com.barcodeto1c.action";
НовЗП.ДополнительныеДанные.Добавить("ServiceState","Start"); //что сделать: Старт/Стоп
НовЗП.ДополнительныеДанные.Добавить("ServiceSCAN_MESSAGE","scan.rcv.message"); //чей бродкаст ловить
НовЗП.ДополнительныеДанные.Добавить("ServiceBarCodeField","barocode"); //в каком поле сканер возвращает штрих-код (если не задавать - по умолчанию barocode, что в большинстве случаев оно так)
НовЗП.ДополнительныеДанные.Добавить("ServiceEventID","1"); //категория сообщение для 1С
НовЗП.ДополнительныеДанные.Добавить("ServiceToast","Service STARTED!");//(не обязательно) просто покажет Тост при успехе
НовЗП.ДополнительныеДанные.Добавить("ServiceBase_Name",ОбщегоНазначенияСервер.ПолучитьИДБазы());//если одна база - можно поставить ""
Результат = НовЗП.Запустить(Истина);
Если НЕ Результат = 77 Тогда
//тут можно отловить что что-то не так. Возможно апк не установлена или что-то не сработало
КонецЕсли;
#КонецЕсли
КонецПроцедуры
&НаКлиенте
Процедура ОстановитьКомпонентуСканирования() Экспорт
#Если МобильноеПриложениеКлиент Тогда
НовЗП = Новый ЗапускПриложенияМобильногоУстройства();
НовЗП.Действие = "com.barcodeto1c.action";
НовЗП.ДополнительныеДанные.Добавить("ServiceState","Stop");
НовЗП.ДополнительныеДанные.Добавить("ServiceToast","Service STOPED!");
Результат = НовЗП.Запустить(Истина);
#КонецЕсли
КонецПроцедуры
ПолучитьИДБазы() можно разными способами. Я её прописал в константы.
Успешный результат всегда равен 77 (просто число, мне так захотелось)
У формы должно быть прописано ОбработкаОповещения приблизительно так:
&НаКлиенте
Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)
Если ИмяСобытия = "1" И ВводДоступен() Тогда
ПолученШтрихКод(Параметр); //процедура для обработки ШК
КонецЕсли;
КонецПроцедуры
Теперь мы можем стартовать сервис только по необходимости. Если у нас несколько баз - то ловить события только той базой, что запущена.
Распространяется "как есть". Надеюсь будет полезным.
Добавлено в версии 1.1
1) сервис может работать с некоторыми bluetooth-сканерами (у которых для настройки используется утилита DataWedge со строкой "посылки" com.hht.emdk.datawedge.data_string)
2) добавлена возможность самостоятельно указывать поле, в котором возвращается набор байт со сканера. По-умолчанию это "barocode". Если сервису передать строку НовЗП.ДополнительныеДанные.Добавить("ServiceBarCodeField","svoe_pole") - то информация будет читаться из него
Оптимизация по размеру файла. А то жрала много памяти предыдущая ;)
Добавлено в версии 1.2.1
- Поддержка устройства CipherLab 9700A (ну и наверное его подобными)
28/03/18 Добавлены исходники
Добавлено в версии 1.2.2
- Поддержка устройств, которые возвращают штрих-код как строку, а не массив байт.