Более новая версия (продолжение) тут
Предыстория аналогична как //infostart.ru/public/579674/ Спасибо за идеи Meteorage
Закупили КПК Caribe PL-40. Не плохой такой девайс. Написали на него мобильное приложение для складского учета. Вот только сканировал он в разрыв клавиатуры и в 1С постоянно приходилось тапать в окно для ввода штрих-кода. Было перепробовано много способов победить данный недуг. В частности и //infostart.ru/public/547851/ (спасибо автору dewersia ). Смотрели ACode tools. Он не работает (на сколько мне известно) со сторонними КПК и тем более со встроенными сканерами. Конечно, был получен неоценимый опыт изучая его код (за что огромное спасибо автору DitriX).
Возможности сервиса:
- Автостарт после загрузки КПК (OnBootReceiver);
- Старт/Стоп сервиса в интерфейсе приложения;
- Назначение "имени сообщения" от сканера. У разных КПК они различаются. К примеру, у нашего это "scan.rcv.message", у Urovo - "urovo.rcv.message". Нужно конкретно знать какое сообщение от сканера выдается бродкастом на конкретном аппарате.
- Назначение "1C Event ID". Это как раз тот эвент, по которому 1С будет определять что это прилетел к ней Штрих-код. По-умолчанию это 1.
- Назначение "1C Base ID". Используется если в списке выбора баз более одной базы. Если только одна - оставить поле пустым. Идентификатор брать с файла ibases.v8i.
В мобильном приложении обязательно должна быть инициализация приема внешних сообщений (Пример из ACode tools):
В модуле управляемого приложения:
Процедура ПриНачалеРаботыСистемы()
ОбщегоНазначенияКлиент.ПодключитьГлобальноеСобытиеОповещения();
КонецПроцедуры
В модуле ОбщегоНазначенияКлиент
Процедура ПодключитьГлобальноеСобытиеОповещения() Экспорт
#Если МобильноеПриложениеКлиент Тогда
Оп = Новый ОписаниеОповещения("ОбработчикЛокальныхУведомлений", ЭтотОбъект);
ДоставляемыеУведомления.ПодключитьОбработчикУведомлений(Оп);
#КонецЕсли
КонецПроцедуры
Процедура ГлобальноеСобытиеОповещения(Сообщение, ЧтоТоЕще = "") Экспорт
Попытка
Отправитель = Число(Сообщение.Отправитель);
Исключение
Возврат
КонецПопытки;
Если Отправитель = 1 Тогда //тут 1C Event ID из сервиса
Оповестить(Формат(Отправитель,"ЧГ="),Сообщение.Текст, "Сканирование ШК");
Иначе
Возврат
КонецЕсли;
КонецПроцедуры
Процедура ОбработчикЛокальныхУведомлений(Уведомление,Локальное,Показано, ЧтоТоЕще) Экспорт
ГлобальноеСобытиеОповещения(Новый Структура("Отправитель,Текст",Уведомление.Текст,Уведомление.Данные));
КонецПроцедуры
Таким образом у нас получают Штрих-код все формы, у которых описана ОбработкаОповещения. Для получения ШК только в активную форму используем метод управляемой формы ВводДоступен()
&НаКлиенте
Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)
Если ИмяСобытия = "1" И ВводДоступен() Тогда
ПолученШтрихКод(Параметр);
КонецЕсли;
КонецПроцедуры
Кому интересно, процесс передачи со стороны Android описан так:
public void onReceive(Context context, Intent intent) {
byte[] barcode = intent.getByteArrayExtra("barocode");
int lng = intent.getIntExtra("length", 0);
this.barcodeStr = new String(barcode, 0, lng);
if (lng > 0) {
Intent intentFor1C = new Intent("com.google.android.c2dm.intent.RECEIVE");
intentFor1C.putExtra("text", BCService.EventID);
intentFor1C.putExtra("title", "1C");
intentFor1C.putExtra("data", this.barcodeStr);
if (BCService.BaseName != null || BCService.BaseName != "") {
intentFor1C.putExtra("base", BCService.BaseName);
}
context.sendBroadcast(intentFor1C);
}
}
Ну, в принципе, и всё. Сервис писался "для себя" и распространяется "как есть". Буду рад, если кому пригодится!