Внешний компонент "1С:Сканер штрихкода" (Native) версия для платформы "1С Предприятие 8.3".

1. simon_simon 1 16.04.23 20:50 Сейчас в теме
Коллеги здравствуйте!
Суть вопроса заключается в использовании внешней компонеты (Версия 10.3.1.2.). Взял ее из "Библиотека подключаемого оборудования для мобильных приложений". В общем проблема работы самого приложения "Библиотека подключаемого оборудования для мобильных приложений" с выбранным сканером на андроид устройстве решена. (Сканер "Netum", использовали разные модели). Решена проблема работы этого сканера в своей конфигурации путем переноса функционала из "Библиотека подключаемого оборудования для мобильных приложений". Но, решение получилось слегка громоздким.

Попытались упростить всю эту схему и столкнулись с тем, что внешнее событие в упрощенной схеме не ловится. Суть упрощения в том, что получаем драйвер из макета , подключаем внешнюю компоненту , ну и дальше как всегда поступали со старыми драйверами надеемся получить внешнее событие при сканировании. Но нет. Так мало того еще и мобильный клиент при попытке сканирования слетает.

Смотрим как зачарованные на реализацию в "Библиотека подключаемого оборудования для мобильных приложений" . Ну используют там модуль сеанса , где устанавливают в этом модуле параметр сеанса, который называется "РабочееМестоКлиента" и тип имеет "СправочникСсылка.РабочиеМеста". Ну и как бы нет ни чего такого. Но, подозрение есть , что без этой штуки не работает связка драйвер - внешнее событие. Есть ли у кого понимание в этом вопросе? Благодарю. Для предвосхищения вопросов типа "Зачем тебе этот новый драйвер? Возьми драйвер постарше и попроще, на котором все работает и не мучайся." Отвечаю, у ряда планшетов на предприятии есть встроенный сканер и там мы результаты сканирования получаем через механизм Broadcast . Вот зачем.

Важное замечание: Содержание лога от внешней компоненты в случае когда мы работаем из функционала БПО и своего упрощенного функционала слегка разный получаю.
В приложенных файлах файл с именем "scan_opos (5)" отвечает не работающей ситуации, файл с именем scan_opos (6) работающей ситуации.
Параметры внешней компоненты в своей реализации устанавливал глядя на то как это все делается в "Библиотека подключаемого оборудования для мобильных приложений". Но в итоге получил не работающий вариант. Все это тестировал в рамках одного и того же мобильного клиента, внешнюю компоненту брал из одного и того же макета.

Заранее благодарю за содействие.
Прикрепленные файлы:
scan_opos (5).txt
scan_opos (6).txt
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. serg33rus 32 17.04.23 17:27 Сейчас в теме
Я тоже брал этот драйвер. И у меня работал он сам по себе, без БПО. Могу дать APK на пробу. Заработает или нет.
3. simon_simon 1 18.04.23 11:17 Сейчас в теме
(2)Если можно, дайте, пожалуйста, попробую.

Еще просьба: взгляните на код подключения, ни чего ли не упущено при подключении ВК?

Procedure ConnectingExternalComponentForScanToMC()
	//If Attached Then
		//ExternalComponent = New("AddIn.InputDevice.InputDevice");  
		
		OK = ПодключитьВнешнююКомпоненту("CommonTemplate.Драйвер1ССканерШтрихкода", "InputDevice", ТипВнешнейКомпоненты.Native);
        ExternalComponent = Новый ("AddIn.InputDevice.InputDevice");

		//P1 = "";
		//P2 = "";
		//P3 = "";
		//P4 = "";
		//P5 = "";
		//P6 = "";
		//P7 = "";
        
		//ExternalComponent.GetDescription(P1, P2, P3, P4, P5, P6, P7); // получаем описание
		
		
        
		
		ExternalComponent.SetParameter("EquipmentType", "УстройствоВвода"); 
		ExternalComponent.SetParameter("Action", "android.intent.action.DEFAULT");
		ExternalComponent.SetParameter("BluetoothDevice", "DEV_KEYBOARD"); // устанавливаем тип сканера блютус девайЗ
		ExternalComponent.SetParameter("COMEncoding", "UTF-8"); 
		ExternalComponent.SetParameter("Category", "");
		ExternalComponent.SetParameter("DataBits", 8);
		ExternalComponent.SetParameter("Extra", "android.intent.extra.STREAM");
		ExternalComponent.SetParameter("ExtraType", "String");   
		//ExternalComponent.SetParameter("GSSymbolKey", 7); 
		ExternalComponent.SetParameter("GSSymbolKey", 7); 
		ExternalComponent.SetParameter("LogFilePath", "/storage/emulated/0/Download/scan_opos.txt");  
        ExternalComponent.SetParameter("LogType", 0); // Логируем в файл  
        ExternalComponent.SetParameter("OutputDataType", 0); // тип данных выходных  
        ExternalComponent.SetParameter("Parity", 0); //   
        ExternalComponent.SetParameter("Prefix", -1); //  
        ExternalComponent.SetParameter("Speed", 9600); // 
        ExternalComponent.SetParameter("StandardAction", "NONE"); // 
        ExternalComponent.SetParameter("StandardCategory", "NONE"); // 
        ExternalComponent.SetParameter("StandardExtra", "NONE"); // 
        ExternalComponent.SetParameter("StopBits", 0); //
        ExternalComponent.SetParameter("Suffix", 3338); //
        ExternalComponent.SetParameter("Timeout", 75); //
		//ExternalComponent.SetParameter("AppType", 6); //
		IDParametr = "";
        OK = ExternalComponent.Open(IDParametr); // подключаем компоненту  
		РезультатТеста       = "";
		АктивированДемоРежим = "";
		
		РезультатТеста = ExternalComponent.ТестУстройства(РезультатТеста, АктивированДемоРежим);
        Сообщить(ExternalComponent.ПолучитьНомерВерсии());
		
        Параметры1 = "";
        ExternalComponent.ПолучитьПараметры(Параметры1); // получаем параметры
        СтрокаПараметры = Параметры1;   
		
		ОписаниеДрайвера = "";
		ExternalComponent.ПолучитьОписание(ОписаниеДрайвера);
		
        If Not OK Then
			Message(ExternalComponent.GetLastError(P7));
        EndIf;
	//EndIf;
	
EndProcedure
Показать
4. simon_simon 1 18.04.23 11:27 Сейчас в теме
Предлагаю, наверное так: если ваш МК запустится, то за стартмани хотели бы с Вами проконсультироваться в каком-то виде (устно, с подключением к нам на сервер для указания наших ошибок.)
5. serg33rus 32 18.04.23 11:58 Сейчас в теме
(4) Написал в личку.
Там от БПО вообще нет ничего кроме самого драйвера. Зато получилось довольно компактно. Правда кроме сканера ШК там нет ничего :-).
7. PaulSparrow 10.06.24 15:56 Сейчас в теме
(5) Доброго дня. Получилось как то реализовать подключение сканера через компоненту и обработку результата?
Подключить компоненту у меня получилось. Вот только не пойму - в настройках (xml) компоненты показывается, что по умолчанию клавиатура. Можно как то переопределять? Как вообще указать настройки своего сканера и как перехватить событие?

Спасибо
6. simon_simon 1 18.04.23 16:37 Сейчас в теме
Коллеги, важное замечание. Как-то я немного не четко, видимо, в самом вопросе написал. Используя эту внешнюю компоненту именно для подключения внешнего блютуз-сканера.
8. serg33rus 32 10.06.24 16:19 Сейчас в теме
(7) В настройках можно/нужно указать нужные.
У меня вот такие на Атолах
Компонента.УстановитьПараметр("EquipmentType", "УстройствоВвода");
Компонента.УстановитьПараметр("Action", Интент);
Компонента.УстановитьПараметр("EventName", "Штрихкод");
Компонента.УстановитьПараметр("Extra", ИнтентДанные);

Компонента.УстановитьПараметр("BluetoothDevice", "BROADCAST");
Компонента.УстановитьПараметр("StandardCategory", "NONE");
Компонента.УстановитьПараметр("StandardAction", "NONE");
Компонента.УстановитьПараметр("StandardExtra", "NONE");

Интент и ИнтентДанные для каждой модели сканера свои.
У меня работает в боевом режиме.
Драйвера 10.1.8.5
Для более новых драйверов приложение не собирал, поскольку текущие работают без нареканий.
PaulSparrow; +1 Ответить
9. PaulSparrow 10.06.24 16:52 Сейчас в теме
(8) Понял, спасибо. А как ловите сами данные от сканера? Я так понял через ОбработкаВнешнегоСобытия() модуля приложения?
10. serg33rus 32 10.06.24 16:53 Сейчас в теме
11. PaulSparrow 10.06.24 17:01 Сейчас в теме
12. PaulSparrow 10.06.24 17:27 Сейчас в теме
(10) Может есть какие мысли, почему не работает? При скане вообще приложение 1С вылетает.

УстановитьВнешнююКомпоненту ("ОбщийМакет.Драйвер1СУстройстваВводаNative");
	
	Если ПодключитьВнешнююКомпоненту("ОбщийМакет.Драйвер1СУстройстваВводаNative", "AddIn", ТипВнешнейКомпоненты.Native) Тогда
		
		Сообщить("Компонента для сканера штрихкодов подключена");
		
		Компонента = Новый ("AddIn.AddIn.InputDevice");
		
		Интент = "nlscan.action.SCANNER_RESULT";
		ИнтентДанные = "SCAN_BARCODE1";
		
		Компонента.УстановитьПараметр("EquipmentType", "УстройствоВвода");
		Компонента.УстановитьПараметр("Action", Интент);
		Компонента.УстановитьПараметр("EventName", "Штрихкод");
		Компонента.УстановитьПараметр("Extra", ИнтентДанные);
		
		Компонента.УстановитьПараметр("BluetoothDevice", "BROADCAST");
		Компонента.УстановитьПараметр("StandardCategory", "NONE");
		Компонента.УстановитьПараметр("StandardAction", "NONE");
		Компонента.УстановитьПараметр("StandardExtra", "NONE");
		
		Компонента.Подключить("Штрихкод");
		
	Иначе
		Сообщить("Компонента для сканера штрихкодов подключена");
	КонецЕсли;
Показать




В модуле приложения пытаюсь отловить:

Сообщить(Событие);
Сообщить(Источник);
Сообщить(Данные);
13. serg33rus 32 10.06.24 17:35 Сейчас в теме
(12) Даже не знаю. Визуально вроде все ОК.
1С вылетает и никакие сообщения не показываются?
А на устройстве бродкасты включены? Хотя все-равно вылетать не должна.
А это мобильное приложение или клиент? Как оно на устройство попадает? Через http? Тогда посмотреть чтобы в веб-сервере были разрешены миме-типы apk и so.
Хотя опять же, без них просто не установится компонента.
Даже не знаю что еще посоветовать :-(
14. PaulSparrow 10.06.24 17:39 Сейчас в теме
(13) Тестил установку компоненты - она вроде как ставиться. Это мобильное приложение. Ставлю через отладку по кабелю (апк не собирал). Бродкасты тоже включены, там стороннее приложение похожее работает - все ок (там код к сожалению не глянуться). Понял, спасибо
15. witaway 17.09.24 07:19 Сейчас в теме
(14) День добрый. Вчера весь день мучался с той же самой проблемой. Перепробовал всё на свете, даже по adb читал logcat системы. =)

В общем. Вы через Новый создаёте экземпляр класса. Это отлично. А потом вы выходите из функции, и этот экземпляр очищается из памяти. Сразу же. Поскольку 1С использует для сборки мусора подсчёт ссылок.

Потом вы сканирует ШК и перед тем, как передать в 1С, его сначала обрабатывает ваша компонента. Но обрабатывать уже некому. Неожиданная ситуация. По участку памяти, который ожидает система, уже ничего нет. Segmentation Fault.

Сохраните полученный экземпляр где нибудь в глобальном контексте. БПО, например, в модуле приложения хранит структуру с инициализированными драйверами. Вам, может быть, хватит и просто глобальной переменной.

Тогда счётчик количества ссылок никогда не обнулится и ваш экземпляр класса никуда не испарится.
16. witaway 17.09.24 07:27 Сейчас в теме
(15) Вообще, само появление Segmentation Fault при такой ситуации — свидетельство того, что драйвера для БПО писали рептилоиды.

Перед очисткой объекта, созданного из внешней компоненты, 1С вызывает у него деструктор. Вот в этом деструкторе, по-хорошему, должна была произойти отписка от событий.

Если бы это было сделано именно так, вместо полного вылета 1С вы (и я) просто не получали бы никаких событий.

Но работаем с тем, что есть.
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот