Представлена компонента для получения широковещательных оповещений и управления буфером обмена в ОС Андроид.
Широковещательные оповещения
Продолжение статьи автора о внешних компонентах для мобильных приложений, в которой представлен развернутый пример компоненты получения широковещательных оповещений в андроиде (broadcasts). Идею ее создания подсказала работа //infostart.ru/public/587908/, в которой был предложен универсальный получатель сообщений от сканеров, но решение выполнено через сервис, хотя ничто не мешает оформить его в виде компоненты. Архитектурный выигрыш несомненный, но главные удобства получает пользователь, которому нужно будет установить только приложение 1С без дополнительного ПО.
Для подключения компоненты используем стандартный код:
// Component - имя макета, в котором находится компонента
ПодключитьВнешнююКомпоненту("ОбщийМакет.Component", "Broadcasts", ТипВнешнейКомпоненты.Native);
Компонента = Новый("AddIn.Broadcasts.UniversalBroadcast");
Так как решение полностью выполнена по стандарту 1С (устройство ввода), установка параметров выполняется методом «УстановитьПараметр», включение и выключение — «Подключить» и «Отключить» соответственно. Параметр, который обязательно нужно установить — «FilterName«, это имя оповещения. Для сканеров его необходимо взять из документации. Также можно использовать любые системные броадкасты, например отсюда. В примере конфигурации к статье представлен способ получения информации о батарее устройства. Следующий важный параметр — «CaptureData«. В него следует передать XML строку с описанием извлекаемых дополнительных данных оповещения. Для удобства ее можно получить, вызвав метод «ПолучитьШаблонОписанияДанных», который возвращает строку:
<?xml version="1.0" encoding="utf-8"?>
<dataExtra name="%1" arrayToString="%2" dataType="%3" />
Она содержит три параметра в формате %n, чтобы ее было удобно использовать в методе «ПодставитьПараметрыВСтроку» из БСП. Первый параметр — имя дополнительных данных. Второй должен иметь значения true или false и используется только для обработки массива байт или символов (см. ниже). Третий параметр — число, тип извлекаемых данных в соответствии с таблицей:
| Значение параметра | Тип данных |
|---|---|
| 0 | строка |
| 1 | массив строк |
| 2 | short |
| 3 | массив типов short |
| 4 | long |
| 5 | массив типов long |
| 6 | int |
| 7 | массив типов int |
| 8 | float |
| 9 | массив типов float |
| 10 | double |
| 11 | массив типов double |
| 12 | символ |
| 13 | массив символов |
| 14 | байт |
| 15 | массив байтов |
| 16 | булево |
| 17 |
массив типов булево |
|
|
|
|
|
(Типы последних двух строк могут возвращаться, если параметр CaptureData не задан, об этом режиме работы см. ниже).
Для массивов типов байт или символ параметр attayToString может быть установлен в true. В этом случает при получении дополнительных значений, они будут преобразовываться в строку. Это может пригодится для работы с некоторыми сканерами, которые возвращают результат в виде набора байтов. Покажем код установки параметров перед включением компоненты:
ШаблонДанных = Компонента.ПолучитьШаблонОписанияДанных();
health = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонДанных,"health",XMLСтрока(Ложь),XMLСтрока(6));
Компонента.УстановитьПараметр("CaptureData",health);
tech = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонДанных,"technology",XMLСтрока(Ложь),XMLСтрока(0));
Компонента.УстановитьПараметр("CaptureData",tech);
present = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонДанных,"present",XMLСтрока(Ложь),XMLСтрока(16));
Компонента.УстановитьПараметр("CaptureData",present);
level = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонДанных,"level",XMLСтрока(Ложь),XMLСтрока(6));
Компонента.УстановитьПараметр("CaptureData",level);
Какие данные необходимо получить мы определяем последовательными вызовами установки параметра CaptureData. Удалить или изменить этот набор после установки невозможно, для этого необходимо пересоздать объект компоненты.
Параметр «Category» позволяет добавить к намерению отбор по категориям. Его также можно устанавливать перед стартом отслеживания броадкастов несколько раз, если требуется отбор по нескольким категориям. Очистка набора категорий возможна только при пересоздании объекта компоненты.
После включения компонента, как и любое устройство ввода, возвращает данные через внешнее событие 1С. Первый параметр события — серийный номер устройства, второй параметр имеет значение «UniversalBroadcastEvent», а третий — текст в формате XML примерно такого вида:
<?xml version="1.0" encoding="utf-8"?>
<MessageData>
<FilterName>Имя оповещения, заданного параметром FilterName</FilterName>
<FilterData name="имя очередного параметра CaptureData">Значение дополнительных данных</FilterData>
<FilterData name="имя очередного параметра CaptureData">
<ArrayValue>элемент 1 массива данных</ArrayValue>
<ArrayValue>элемент 2 массива данных</ArrayValue>
</FilterData>
</MessageData>
Как можно догадаться из примера, значения одиночных дополнительных данных возвращаются в тексте элемента <FilterData>, а массивов элементами <ArrayValue>.
Начиная с релиза 1.1.4 компонента поддерживает автоматическое определение всех возможных фильтров и возвращаемых типов данных. Чтобы включить такой режим, необходимо оставить параметр CaptureData пустым. При возникновении события xml тэг MessageData не будет возвращать значений, но будет включать числовой атрибут datatype в соответствии с приведенной выше таблицей. Если событие будет иметь данные с пустым значением, тип которого невозможно определить, атрибут будет равен 19. Сложным типам, необрабатываемым компонентой, будет присвоен индекс 18.
<?xml version="1.0" encoding="utf-8"?>
<MessageData>
<FilterName>Имя оповещения, заданного параметром FilterName</FilterName>
<FilterData name="имя очередного параметра CaptureData" datatype="число - индекс типа из таблицы"/>
<!-- любое число тэгов FilterData -->
</MessageData>
Приведем пример xml, возвращаемого батареей (android.intent.action.BATTERY_CHANGED) в режиме определения фильтров:

Пользователи могут использовать конфигурацию из статьи для определения значений фильтров любых событий, если вручную отредактируют имя намерения и вызовут событие.
Буфер обмена
В версии 1.1 компоненты добавлена работа с буфером обмена Андроида (clipboard). Буфер позволяет выполнять операции вставки и извлечения (Copy/Paste) и может содержать данные типов текст, гиперссылка и намерение. Свойство СодержимоеБуфера возвращает их в текстовом представлении. Метод УстановитьСодержимое передает в буфер любой текст. Компонента также в состоянии передать в 1С оповещение об изменении буфера любой программой или службой.
Подключение объекта буфера:
КомпонентаБуфер = Новый("AddIn.Broadcasts.Clipboard");
Объект Clipboard тоже реализован по стандарту устройства ввода. Соответственно, имеет методы Подключить и Отключить. После подключения компонента передает в 1С внешнее событие с именем ClipboardEvent при изменении содержимого буфера. Третий параметр внешнего события содержит текстовое представление данных или пустой, если буфер очищен. Независимо от подключения, разработчик может использовать свойство компоненты СодержимоеБуфера (ClipboardContent) доступное только для чтения, которое возвращает содержимое буфера обмена и метод УстановитьСодержимое (SetContent) с двумя параметрами (данные и метка — строки) для его модификации.
Примечание: Если компонента буфера подключена методом Подключить, помещение данных через УстановитьСодержимое породит внешнее событие ClipboardEvent, неотличимое от любого другого изменения. Нужно либо отключать компоненту перед изменением буфера либо фильтровать такие события по данным, если стоит задача их проигнорировать.
О примере
Макет компоненты из конфигурации, прилагаемой, к статье не содержит дополнительных разрешений (permissioms). Если они требуются для получения конкретных оповещений, их можно добавить в архив макета компоненты (включить файл android_manifest_permissions.xml) и собрать приложение.
Конфигурация и внешняя компонента предназначены для работы с релизом мобильной платформы не ниже 8.3.15.59. Допускается также работа с релизами, начиная с 13-го, но для этого необходимо вручную отредактировать манифест компоненты в архиве и удалить поддержку 64-битный платформ.
-
30.09.2011, 06:41
#1

Пришел за помощью
Ошибка внешней компоненты ПРИ ПЕЧАТИ ШТРИХ-КОДА
Доброго времени суток !
Имеется 1С:Предприятие 8.2 (8.2.13.219) Конфигурация Управление торговлей, редакция 11.0 (11.0.6.9)
Проблемы заключается в следующем: Необходимо распечатать этикетку со штрих-кодом. И при печати появляется «ошибка внешней компоненты» если кликнуть подробно то появлется сие сообщение:
{Обработка.ПечатьЭтикетокИ Ценников.МодульМенеджера(24 5)}: Ошибка при установке значения атрибута контекста (РазмерШрифта)
ВнешняяКомпонента.РазмерШ� �ифта = ПараметрыШтрихкода.Размер� �рифта;
по причине:
Ошибка внешней компонентыВот такие дела. Кто с таким сталкивался и как победил ? Заранее спасибо !
Последний раз редактировалось VDIGIT; 30.09.2011 в 06:41.
Причина: Опечатка
-
07.10.2011, 19:59
#2

Помогает людям

А компонента 1С: Печать штрихкода установлена? если нет, то такая есть на диске ИТС
-
10.10.2011, 06:33
#3

Пришел за помощью

Сообщение от AVS300
А компонента 1С: Печать штрихкода установлена? если нет, то такая есть на диске ИТС
Установлена (причем вариантов компоненты немерено было переставлено). «Ошибка» в самой конфигурации, а точнее в размере шрифта. Слегка изменил саму конфигурацию (и само формирование и печать) и все заработало как надо ! Только надо немного доделать, чтобы было на «автоматическом» уровне, а то лезть и править конфигурацию не есть гут ! как сделаю выложу !
-
29.01.2012, 19:46
#4

Гость форума

Сообщение от VDIGIT
Установлена (причем вариантов компоненты немерено было переставлено). «Ошибка» в самой конфигурации, а точнее в размере шрифта. Слегка изменил саму конфигурацию (и само формирование и печать) и все заработало как надо ! Только надо немного доделать, чтобы было на «автоматическом» уровне, а то лезть и править конфигурацию не есть гут ! как сделаю выложу !
блин! будь другом! подскажи как вышел из ситуёвины!… клинит напроч что-то…
-
09.04.2012, 06:36
#5

Гость форума
Сабж
Столкнулись с такой же проблемой: при печати созданного в 1С Розница 8.2 штрихкода выводилось сообщение: . При переходе в конфигуратор выдавалось более подробное описание:
Ошибка времени выполнения:
{Обработка.ПечатьЭтикетокИ Ценников(256)}: Ошибка при установке значения атрибута контекста (РазмерШрифта) в модуле Обработка.ПечатьЭтикетокИ� �енников, строка 256..
При этом созданная «этикетка по умолчанию», содержащая шрихкод, прекрасно выводилась на печать до тех пор пока не изменялся ее размер. Изменение параметров штрихкода-картинки («растянуть», «реальный размер», «пропорционально») никакого эффекта не давали.
Победить проблему не удалось, зато удалось ее «замаскировать»:
1. В конфигураторе был задействован режим отладки: меню Отладка Остановка по ошибке ставим галочку в пункт Останавливаться по ошибке и сохраняемся (Сделайте бекап базы и/или конфигурации на всякий пожарный случай)
2. Запускаем одновременно с конфигуратором (можно прямо из него) 1С и повторяем событие ошибки.
3. Нас перебрасывает в конфигуратор на нужную нам строку в которой как-раз и стоит параметр «размер шрифта»
4. Закомментируем (то есть «спрячем» от исполнения программой) эту строку кода: перед строкой впереди поставим два слэша — \ (строка поменяет цвет текста на зеленый)
5. Сохраняем конфигурацию и перезапускаем 1С
6. В 1Ске делаем следующее: открываем шаблон нашей этикетки и видим, что рядом с надписью: «Тип кода (выборка) EAN13» чуть правее стоит галочка в пункте «Отображать текст». Снимаем галочку.
7. Теперь сформированный штрихкод будет отображаться просто как штрихкод, без записи его значения в цифровом отображении (с размером шрифта этих цифр и происходит сбой при выводе на печать).
8. Создаем свою этикетку, правим ее, вставляем штрихкод и растягиваем его как нам нужно.
9. Если кроме штрихкода вам нужны еще и цифры составляющие его, то ниже/выше/рядом со штрихкодом вставьте еще один, но уже в текстовом виде (при вставке штриха 1С вас спросит – вставить ли его как картинку – откажитесь и получите штрихкод в цифровом символьном виде) и отредактируйте что бы оба штриха были у вас рядом и выглядели так как вам нужно.
Это конечно не решение проблемы, но это поможет вам сделать этикетку на печати нужного вам вида и размера.P.S. Для тех кто мучается с выводом текста этикетки на печать (этикетка печатается со смещением от края/ распечатывается кусками на 4-6 наклеек/ печатается криво и не позволяет менять размер шрифта и пр.): не забудьте что в 1С 8.2 есть в верхнем левом углу меню Файл Параметры страницы так же отвечающие за вывод текста на печать (а так же есть настройки отображения при печати в самом драйвере принтера – щелкните по принтеру правой клавишей мыши и настройте).
Всем удачи.
I have an apk that installs fine on all my devices except on an old Samsung Galaxy J5 (and on a Huawei Y3).
I had copy the APK on the device via USB and try to install it with the «my files» app. The log is as follows:
02-08 11:36:56.226 1647-1674/? D/ActivityManager: Launching com.google.android.packageinstaller, updated priority
02-08 11:36:56.226 1647-1647/? D/GameManagerService: NotifyRunnable. pkg: com.google.android.packageinstaller, type: 4, isMinimized: false, isTunableApp: false
02-08 11:36:56.226 1647-1647/? D/GameManagerService: unexpected mPrevNotiType: -1
02-08 11:36:56.246 1647-1836/? W/ContextImpl: Calling a method in the system process without a qualified user: android.app.ContextImpl.sendBroadcast:843 com.android.server.policy.PhoneWindowManager.notifyToSSRM:9071 com.android.server.policy.PhoneWindowManager.access$2100:330 com.android.server.policy.PhoneWindowManager$PolicyHandler.handleMessage:1268 android.os.Handler.dispatchMessage:102
02-08 11:36:56.246 19954-19954/? W/PackageInstaller: Parse error when parsing manifest. Discontinuing installation
Did anybody come across something like that as well?
I´ve checked the option that I can install APK from unknown sources so that can´t be the problem. And I´ve tried to install it from SD-card or internal memory with no success.