Android Java и NativAPI C++ внешняя компонента для широковещательных сообщений (отправка и прием). Подключаем сканер ШК и клавиатуру к "1С мобильное приложение"

13.04.21

Разработка - Разработка внешних компонент

Подключаем сканер ШК и клавиатуру к "1С мобильное приложение", на терминале сбора данных "ATOL Smart.Lite android 7.0". Работаем с буфером обмена. В архиве к теме; 1. исходник компоненты (папка package готовый zip); 2. исходник "AccessibilityService" для перехвата клавиатуры (папка package готовый apk); 3. cf - тестовая конфигурация

Скачать исходный код

Наименование Файл Версия Размер
компонента, сервис, цф и исходники
.zip 11,57Mb
118
.zip 11,57Mb 118 Скачать

 

На чем я работал:

1. Android Studio 3.6.2

2. Мобильное приложение 1С 8.3.16.142

3. 1С:Предприятие 8.3 (8.3.17.1386)

Начнем с описания функционала:

// Описание: Функция создает класс Broadcast
// Параметры:
//Обязательные.
//	Фильтр- строка. Фильтр входящих или исходящих сообщений.
//Не обязательные.
//  Представление - строка. если заполнено тогда в процедуре ВнешнееСобытие(Источник, Событие, Данные) встанет в событие = Представление  //                                                                        иначе  Событие = Фильтр;
//Возвращает указатель на класс тип строка
Указатель = Компонента.CreateBroadcast(Фильтр, Представление)

// Описание:  Процедура добавляет расширения для сообщения Broadcast
// Параметры:
//  обязательные.
//	Указатель- строка. Указатель на класс Broadcast созданный функцией CreateBroadcast;
//  Расширение- строка. Имя расширения сообщения; 
//  Значение - строка,число,булево,число с точкой . Для приема сообщений типизирует значение расширения и является значение по умолчанию если в раширении нет или не тот тип данных. Для отправки сообщений является значением расширения и типизирует его.
// Не обязательные.
//  Представление - строка. если заполнено тогда в процедуре ВнешнееСобытие(Источник, Событие, Данные) Данные это JSONСтрока где ключом является либо имя расширения либо его представлением.
Компонента.AddStringExtra(Указатель, Расширение, Значение, Представление)

// Описание: Процедура запускает процесс перехвата сообщений и отправки во "ВнешнееСобытие(Источник, Событие, Данные) "
// Параметры:
//  обязательные.
// Указатель- строка. Указатель на класс Broadcast созданный функцией CreateBroadcast;
Компонента.Listen(Указатель)

// Описание: Процедура отправляет Broadcast  сообщение
// Параметры:
// обязательные.
// Указатель- строка. Указатель на класс Broadcast созданный функцией CreateBroadcast;
Компонента.Send(Указатель)	

// Описание: Процедура удаляет класс Broadcast;
// Параметры:
// не обязательные.
// Указатель- строка. Указатель на класс Broadcast созданный функцией CreateBroadcast;
// если не заполнен удаляются все созданные классыBroadcast
Компонента.DeleteBroadcastEvent(Указатель);


// Описание: Процедура получает данные настройки класса Broadcast;
// Параметры:
// обязательные.
// Указатель- строка. Указатель на класс Broadcast созданный функцией CreateBroadcast;
// JSONСтрока - строка. данные в JSON.
JSONСтрока = Компонента.GetBroadcastInfo(Указатель)

// Описание: Процедура создает ВнешнееСобытие
// Параметры:
// обязательные.
// Текст - строка. 
// результат выполнения ВнешнееСобытие("MALutilities", "EchoExternalEvent", Текст)
Компонента.EchoExternalEvent(Текст); 

// Описание:Положить текст в буфер 
Компонента.CopyToClipboard(Текст);

// Описание:Получить текст из буфера 
Текст = Компонента.PasteFromClipboard();

// Описание:тост - всплывающее сообщение с текстом.
Компонента.Toast(Текст)

// Описание: Количество созданных классов Broadcast 
Число = Компонента.CountBroadcastEvent;

// Описание: Данные об устройстве
//DeviceInfo	"{"RELEASE":"7.0","SDK":24,"BOARD":"ATOL_Smart.Lite","BOOTLOADER":"unknown","BRAND":"ATOL","DEVICE":"ATOL_Smart.Lite","DISPLAY":"B0881_C1_ATOL_V1.1.2_20190927","FINGERPRINT":"ATOL\/full_rlk6580_we_c_n\/ATOL_Smart.Lite:7.0\/NRD90M\/1569593541:user\/release-keys","HARDWARE":"mt6580","HOST":"BuildServer","ID":"NRD90M","MANUFACTURER":"ATOL","MODEL":"ATOL Smart.Lite","PRODUCT":"ATOL_Smart.Lite","RADIO_VERSION":"","TAGS":"release-keys","TIME":1569593514000,"TYPE":"user","USER":"Android13","AddIn1cInfo":{"JTHIS_PTR":"ru.mal.malutilities.DeviceClass@52963cd","JACT_PTR":"com.e1c.mobile.App@3f1b108","CPP_PTR":2382015200,"REVISIOV":109,"LOCAL_PACKEGE_NAME":"com.e1c.mobile"}}"
JSONСтрока = Компонента.DeviceInfo;

// Описание:отладка можно посмотреть версию
JSONСтрока = Компонента.InfoString;

Приступим к тестированию.

На чем я тестировал: ТСД "ATOL Smart.Lite android 7.0". Мобильное приложение 1с 8.3.15.62. IIS

1. Подключение стандартное ниже на скрине (не делал проверку при подключении.).

Важно:

Во время настройки Web-публикации следует провести следующее действие. В настройках http-сервера необходимо добавить типы MIME для следующих расширений:

  • .so
  • .apk

Тип MIME: application/octet-stream

 

2. Сделал кнопку для вкл/выкл описали события. (не судите за логику, она не важна главное это тестирования как можно большего функционала);

Код:


&НаКлиенте
Процедура Включить(Команда)
	
	Если Не глНативКомпонента.CountBroadcastEvent Тогда
		//Тост, всплывающее сообщение. 1 параметр текст сообщение. второй параметр: долгое - истина или короткое - ложь
		глНативКомпонента.Toast("Начинаем!", Ложь);
		глНативКомпонента.CopyToClipboard("Время открытия: " + ТекущаяДата());

		//Вызывает ВнешнееСобытие("MALutilities","EchoExternalEvent","Проверка");
		глНативКомпонента.EchoExternalEvent("Проверка"); 
		
		
	Иначе 
		// CountBroadcastEvent - количество Broadcast
		Доочистки = глНативКомпонента.CountBroadcastEvent;
		// Очищает все Broadcast, если передать параметр то удалит только этот. пр. DeleteBroadcastEvent(ЭвентУказатель);
		глНативКомпонента.DeleteBroadcastEvent(); 
		ТекстТоста = "Очистка: " + Доочистки + " : " + глНативКомпонента.CountBroadcastEvent
					+ " >> " + глНативКомпонента.PasteFromClipboard();
		глНативКомпонента.Toast(ТекстТоста, Ложь);

	КонецЕсли;	
	
КонецПроцедуры

&НаКлиенте
Процедура ВнешнееСобытие(Источник, Событие, Данные)
	
	Если Источник = "MALutilities" Тогда
		// получили эхо от функции   EchoExternalEvent("Проверка"); 
		Если (Данные = "Проверка" И Событие = "EchoExternalEvent") Тогда 
			
			// Создаем BROADCAST для считывателя штрих кода
			ЭвентУказатель = глНативКомпонента.CreateBroadcast("com.xcheng.scanner.action.BARCODE_DECODING_BROADCAST", "ЭтоШтрихкод");
			глНативКомпонента.AddStringExtra(ЭвентУказатель,"EXTRA_BARCODE_DECODING_DATA","","Штрихкод");
			глНативКомпонента.AddStringExtra(ЭвентУказатель,"EXTRA_BARCODE_DECODING_SYMBOLE","");
			глНативКомпонента.Listen(ЭвентУказатель);
			// посмотрим данные BROADCAST для считывателя штрих кода
			ДанныеКласса = ОбщийМодульКлиент.СоздатьСтруктуруИзAndroid(глНативКомпонента.GetBroadcastInfo(ЭвентУказатель));
			
			// Создаем BROADCAST для считывателя клавиш событие выдает AccessibilityService
			ЭвентУказатель = глНативКомпонента.CreateBroadcast("ru.mal.malutilities.onKeyEvent.1");
			глНативКомпонента.AddStringExtra(ЭвентУказатель,"Code",-256,"Код");
			глНативКомпонента.AddStringExtra(ЭвентУказатель,"Action",-256);
			глНативКомпонента.AddStringExtra(ЭвентУказатель,"Flags",-256);
			глНативКомпонента.Listen(ЭвентУказатель);
			
			// Создаем BROADCAST для AccessibilityService проверка на работу
			ЭвентУказатель = глНативКомпонента.CreateBroadcast("ru.mal.malutilities.CONFIG_SERVICE.1.ECHO", "ТестСервер");
			глНативКомпонента.AddStringExtra(ЭвентУказатель,"TEXT","");
			глНативКомпонента.AddStringExtra(ЭвентУказатель,"NAME","");
			глНативКомпонента.Listen(ЭвентУказатель);
			
			//выдаем BROADCAST для AccessibilityService проверка на работу
			ЭвентУказатель = глНативКомпонента.CreateBroadcast("ru.mal.accessibilityservice.CONFIG_SERVICE.1");
			глНативКомпонента.AddStringExtra(ЭвентУказатель,"ECHO","Сервер работает");
			глНативКомпонента.Send(ЭвентУказатель);
			//Удаляем выданый BROADCAST для AccessibilityService
			глНативКомпонента.DeleteBroadcastEvent(ЭвентУказатель); 
		КонецЕсли;		
		
		//Получили ответ от AccessibilityService значит работает
		Если (Событие = "ТестСервер") И ОбщийМодульКлиент.СоздатьСтруктуруИзAndroid(Данные).TEXT = "Сервер работает" Тогда 

			// Создаем BROADCAST для AccessibilityService настраеваем его
			СтруктураДанных = ОбщийМодульКлиент.СоздатьСтруктуруИзAndroid(Данные);
			ЭвентУказатель = глНативКомпонента.CreateBroadcast("ru.mal.accessibilityservice.CONFIG_SERVICE.1", "ТестСервер");
			//
			глНативКомпонента.AddStringExtra(ЭвентУказатель, "ACTION_TYPE", 0); 
			//выдаем 2 BROADCAST для AccessibilityService на настройку и удаляем его можно в одном пакете
			глНативКомпонента.Send(ЭвентУказатель);
			глНативКомпонента.AddStringExtra(ЭвентУказатель, "FLAGS", Истина); 
			глНативКомпонента.Send(ЭвентУказатель);   
			глНативКомпонента.DeleteBroadcastEvent(ЭвентУказатель); 
			
		КонецЕсли;	
		//Получили события от клавиатуры или клавиш
		Если (Событие <> "ТестСервер") И (Событие <> "EchoExternalEvent") Тогда 
			
			СтруктураДанных = ОбщийМодульКлиент.СоздатьСтруктуруИзAndroid(Данные);
			ВнСообщения = Данные + Символы.ПС + Событие;
			
		КонецЕсли;	
		
	КонецЕсли;	
	
КонецПроцедуры

3. Посмотрим точки останова.

После выполнения глНативКомпонента.EchoExternalEvent("Проверка") возникает внешнее событие. В котором мы настроим все нужные нам классы и спросим у сервиса работает он или нет.

Сервис отвечает что он работает:

После обработки ответа от сервиса, настроим его:

// какое событие ловим Если  -1 тогда будут приходить данные в Action
//case "ACTION_DOWN":TypeAction = 0; break; Нажали
//case "ACTION_UP":TypeAction = 1; break; Отпустили
//case "ACTION_UP_DOWN":TypeAction = -1; break; Или нажали Или опустили
//1 - По умолчанию настроен сервис
глНативКомпонента.AddStringExtra(ЭвентУказатель, "ACTION_TYPE", 0);  

// нужны ли дополнительные флаги к кнопкам Если не Истина тогда будут приходить данные в Flags
//ложь - По умолчанию настроен сервис
глНативКомпонента.AddStringExtra(ЭвентУказатель, "FLAGS", Истина); 

глНативКомпонента.Send(ЭвентУказатель); 

Теперь посмотрим события от кнопок(создает сервис) и сканера ШК:

Как видно обмен идет в двух направлениях. Теперь остановим все.

 

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

В Архиве исходники на сервис,  компоненту и сf. В папках package уже готовые файлы. Сервис нужно устанавливать, как apk, а запускать в Настройки-Спец. возможности.

Все исходники написаны под Android Studio 3.6.2. Все, что нужно, само подгрузится. 

P.S. Доработал версию добавил переменную: 

// Описание: (чтение и запись) Если Истина тогда возникает события при изменении данных в буфере обмена.
Булево = Компонента.ClipboardEvent;
Компонента.ClipboardEvent = Булево;

См. также

Автоматический заказ поставщику в 1С: загрузка прайсов и анализ цен поставщиков для УТ 10.3, УТ 11, КА2, УНФ, УПП, ERP, Розница 2

Бюджетирование и планирование Оптовая торговля Розничная торговля Логистика, склад и ТМЦ Анализ продаж Пользователь Платформа 1С v7.7 Платформа 1С v8.3 1С:Комплексная автоматизация 1.х 1С:Управление торговлей 10 1С:Розница 2 1С:Управление производственным предприятием 1С:Управление нашей фирмой 1.6 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Розничная и сетевая торговля (FMCG) Оптовая торговля, дистрибуция, логистика Беларусь Украина Россия Казахстан Управленческий учет Платные (руб)

Система управления запасами для 1С помогает работать с запасами правильно: автоматически рассчитывает потребность и делает заказ поставщику, загружает прайсы, перемещает товары по филиалам, анализирует продажи и позволяет управлять ассортиментом.

28500 руб.

21.04.2017    92086    116    40    

206

ККТ-ОНЛАЙН 54-ФЗ: Обработка для работы онлайн касс АТОЛ, ШТРИХ, VIKI PRINT и т.д. МАРКИРОВКА (Разрешит. режим) + ЭКВАЙРИНГ + БЕСПЛАТНЫЙ ДЕМО

ККМ Кассовые операции Розничная торговля Системный администратор Программист Платформа 1С v8.3 1С:Комплексная автоматизация 1.х 1С:Бухгалтерия 2.0 1С:Управление торговлей 10 1С:Розница 2 1С:Управление производственным предприятием 1С:Бухгалтерия государственного учреждения 1С:Бухгалтерия 1.6 1С:Бухгалтерия автономного учреждения 1С:CRM ПРОФ, КОРП Россия Платные (руб)

Универсальная обработка для обслуживания любых фискальных регистраторов (ККТ), в том числе Веб сервер АТОЛ. Работает в соответствии с 54-ФЗ. (ФФД 1.0, ФФД 1.05, ФФД 1.1). Подключайте любую онлайн кассу к практически любой конфигурации. Нет необходимости обновлять 1С. Можно бесплатно скачать и протестировать. Может работать одновременно с несколькими онлайн-кассами, либо одной с разных рабочих мест. (через RDP, TCP\IP или веб-сервер) Позволяет разделить один чек сразу на несколько ККТ или на несколько систем налогообложения. Поддерживает разрешительный режим. Можно настроить собственный шаблонов чека. Можно использовать эквайринг там, где он не поддерживается. Работает на LINUX и Windows ЭМУЛЯТОР + ЭКВАЙРИНГ + МАРКИРОВКА + ПОДДЕРЖКА ФФД 1.2

6000 руб.

27.02.2017    775622    4710    9505    

2804

ЕГАИС++. Опт, производство, импорт

Оптовая торговля Розничная торговля Обмен с ГосИС Бухгалтер Платформа 1С v8.3 1С:Управление торговлей 10 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 Розничная и сетевая торговля (FMCG) Оптовая торговля, дистрибуция, логистика Рестораны, кафе и фаст-фуд Россия Бухгалтерский учет Управленческий учет Акцизы Платные (руб)

Полнофункциональное расширение (ранее известное как Модуль 1С-ЕГАИС) для взаимодействия типовых конфигураций 1С и ЕГАИС, предоставляющее максимум возможностей по работе с УТМ. Получение и отправка ТТН, отправка акта о постановке на баланс и акта о списании. Получение остатков. Загрузка и сопоставление номенклатуры и контрагентов. Оправка в ЕГАИС отчетов о производстве и импорте.

8970 руб.

15.12.2015    167403    728    362    

391

Обмен с системой ЦРПТ (Универсальная конфигурация ХамелеонЦРПТ + маркировка табака, обуви, одежды, лекарств, фото, молока, духов(парфюма), питьевой воды, велосипедов и шин)

Оптовая торговля Розничная торговля Обмен с ГосИС Программист Бухгалтер Пользователь Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Розничная и сетевая торговля (FMCG) Оптовая торговля, дистрибуция, логистика Россия Бухгалтерский учет Управленческий учет Платные (руб)

Данная публикация создана для помощи разработчикам, интеграторам и другим заинтересованным лицам по настройке системы маркировки обуви, одежды, лекарств, табака, фото, молока, духов(парфюма), питьевой воды, велосипедов и шин. Смело задавайте нам вопросы по работе с ЦРПТ, GS1, ЭДО, Национальным каталогом, мы накопили достаточно большую базу знаний по данным темам и готовы ответить на все Ваши вопросы.

5000 руб.

18.03.2019    111161    27    114    

179

Загрузка номенклатуры в УТ11, КА 2, ERP 2, Розница 2 из Excel. Дополнительные реквизиты и сведения, характеристики, картинки, цены, остатки

Загрузка и выгрузка в Excel Розничная торговля Логистика, склад и ТМЦ Ценообразование, анализ цен Прайсы Системный администратор Программист Платформа 1С v8.3 1С:Комплексная автоматизация 1.х 1С:Розница 2 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Управленческий учет Платные (руб)

Загрузка номенклатуры из файлов Excel (xls, xlsx, ods, csv, mxl) в УТ11, КА 2, ERP 2, Розница 2. Задействованы все возможности конфигурации - заполнение реквизитов номенклатуры, дополнительных реквизитов и сведений, характеристики, доп.реквизиты и сведения характеристик. Дополнительные обработки для расширения возможностей.

10560 руб.

29.10.2014    212959    635    526    

448

"Штрихкод-информер" 1С (штрих-код-чекер) - мобильный ТСД и прайс-чекер в смартфоне

Мобильная разработка Сканер штрих-кода Терминал сбора данных Управляемые формы Мобильная платформа 1С:Розница 2 1С:Управление нашей фирмой 1.6 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Управленческий учет Платные (руб)

Сбор заказов, инвентаризация, проверка ценников, просмотр полной информации об остатках и ценах со смартфона Онлайн - все это содержит в себе решение 1С "Штрихкод-информер" (штрих-код чекер). Отправка данных со смартфона выполняется либо напрямую в открытую форму документа, отсканировав QR-код, либо в общую корзину учетной системы, не подходя к компьютеру. Кассир или оператор сможет просмотреть список присланных данных и загрузить в любую форму, поддерживающую работу с ТСД. Для работы с мобильным приложением требуется опубликовать HTTP-сервис из поставляемого расширения.

2880 руб.

03.12.2018    55957    168    103    

164

Интеграция 1С со СберМаркетом для 1С:Розница 2.3/3.0, УНФ 3.0, УТ 11.4/11.5, КА 2.4/2.5

Розничная торговля Маркетплейсы Программист Платформа 1С v8.3 1С:Розница 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Розничная и сетевая торговля (FMCG) Россия Управленческий учет Платные (руб)

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

25000 руб.

14.10.2022    8049    8    13    

7
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
101. PrinzOfMunchen 83 13.11.22 20:19 Сейчас в теме
(100)
Что значит пустое сообщение (пустая строка или что - уточните)?

Значит, что сообщение приходит, когда подписываюсь именно на "onKeyEvent.1". Но значений в сообщении нет. В предыдущем моем комментарии сообщение показывал.

Настройку сервиса делали по средствам броудкастов (ru.mal.accessibilityservice.CONFIG_SERVICE.1)?

Пробовал и так, как вы написали, и вообще весь код из статьи - нет оповещений.Внешнее событие не срабатывает по "ru.mal.accessibilityservice.CONFIG_SERVICE.1".
102. SanyMaga 68 14.11.22 10:28 Сейчас в теме
(101)
В исходнике (там кода 4 строчки) используется класс KeyEvent и функция getKeyCode() можно погуглить почему она возвращает ноль.
Попробуйте настроить ru.mal.accessibilityservice.CONFIG_SERVICE.1 - "ACTION_TYPE" = 1.

Попробуйте пересобрать сервис под ваш андроид.
103. PrinzOfMunchen 83 16.11.22 06:03 Сейчас в теме
(102) Разобрался. Проблема не в сервисе. С помощью другой компоненты по отлавливанию броадкастов всё получилось.
99. SanyMaga 68 10.11.22 17:24 Сейчас в теме
Настройку сервиса делали по средствам броудкастов (ru.mal.accessibilityservice.CONFIG_SERVICE.1)?
104. sir 18 09.10.23 12:36 Сейчас в теме
Не смог установить драйвер, пишет Возможно отсутствует компонента для используемого клиентского приложения.

Специально попробовал собрать на релизе мобильного приложения 8.3.16 , но не помогло, единственно осталось проверить на 10-ке андроид apk на старом релизе 1С.
105. SanyMaga 68 09.10.23 17:39 Сейчас в теме
(104)
Возможно отсутствует компонента для используемого клиентского приложения.

Разрядность(32/64) у всех одинаковая?
106. sir 18 11.10.23 16:09 Сейчас в теме
(105) а данная компонента под какую версию заточена ?

п.с. в этой же конфигурации у меня есть другая компонента для чтения штрих кодов, она понимается без проблем.
108. SanyMaga 68 11.10.23 18:17 Сейчас в теме
(106)На 32
Текст из манифеста:
<?xml version="1.0" encoding="UTF-8"?>

<bundle name="ru_mal_utilities" xmlns="http://v8.1c.ru/8.2/addin/bundle">

<component arch="ARM" type="native" codeType="c++" path="libru_mal_utilities.so" os="Android" name="libru_mal_utilities"/>

<component arch="ARM" type="native" codeType="java" path="ru_mal_utilities.apk" os="Android" name="libru_mal_utilities"/>

</bundle>
Показать

наверно нужно на ARM64 пересобрать
107. SanyMaga 68 11.10.23 18:17 Сейчас в теме
(106)
На 32
Текст из манифеста:
 <?xml version="1.0" encoding="UTF-8"?>

<bundle name="ru_mal_utilities" xmlns="http://v8.1c.ru/8.2/addin/bundle">

<component arch="ARM" type="native" codeType="c++" path="libru_mal_utilities.so" os="Android"  name="libru_mal_utilities"/>

<component arch="ARM" type="native" codeType="java" path="ru_mal_utilities.apk" os="Android" name="libru_mal_utilities"/>

</bundle>
Показать

наверно нужно на ARM64 пересобрать или не арм вобще
109. sir 18 11.10.23 18:26 Сейчас в теме
(107) не догоняю в чем дело может быть, выгрузку конфигурации сделал из под 32-х клиента 1с.
пересобрал, в ..arm.apk и ..arm64.apk та же проблема.

пересобрать под ARM64 - хорошая идея )
Оставьте свое сообщение