Маленькая и скромная мобильная внешняя компонента

Публикация № 1141918

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

Внешняя компонента Мобильная платформа sleep пауза broadcast

Изваять простенькую мобильную компоненту на 1С для android не так-то просто. Посему назло отдельным супостатам, не желающим делится исходниками, представляю весь свой скромный труд на публичный суд.


Взявшись за непонятную задачу с почти полным отсутствием примеров можно убить ни один вечер, так ничего не добившись. Особенно когда речь заходит о труднособираемой и еще более трудноотлаживаемой внешней компоненте для мобильной платформы 1С. Кропотливые поиски  все же обязательно приведут к успеху и выдадут на-гора пару ценных ссылок:

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

1. Что из интересного в архиве компоненты:

  • Собранный zip с макетом компоненты с примерами вызова обычного метода, а также методы вызова внешнего события через Broadcast (может быть полезно для написания драйверов торгового оборудования);
  • Демо конфигурация.

2. API Компоненты

Список методов:

Delay/Пауза - останавливает выполнение кода на заданное число миллисекунд. Процессор в период простоя не грузится

Параметры:

  • миллисекунд - Число - число миллисекунд на которое нужно остановить выполнение кода.

StartScreenWatch/НачатьОтслеживаниеЭкрана - начинает мониторинг состояния активности экрана устройства. Параметры отсутствуют. Если устройство возвращают из спящего режима блокировки, то вызывается внешнее события со следующими параметрами:

  • Источник - org.ripreal.androidutils
  • Событие - LockChanged

StopScreenWatch/ОстановитьОтслеживаниеЭкрана - прекращает мониторинг активности экрана устройства. Параметры отсутствуют.

Список свойств:

DeviceInfo/ОписаниеУстройства (только чтение) - ID мобильного устройства

3. Как бонус на github:

  • sln проект для VS Studio 2019 и .idea проект (в каталоге android) для Android Studio 3.5
  • Проект .idea настроен на отладку c++ кода компоненты. Инструкция есть в Readme.MD

Скачать файлы

Наименование Файл Версия Размер
Скомпилированная компонента и демо конфигурация

.zip 4,16Mb
18.10.19
6
.zip 4,16Mb 6 Скачать

Специальные предложения

Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. capitan 1774 21.10.19 11:36 Сейчас в теме
2. Pawlick 10 22.10.19 11:49 Сейчас в теме
Честно говоря из статьи сложно понять природу вещи...
Чувствуется, что вещь нужная, но... Куча вопросов остается:
Это компонента для общения 1с с андройд?
Если да, то только три метода?
5. ripreal1 517 23.10.19 18:49 Сейчас в теме
(2) Не ставил цель охватить в этой статье весь жизненный цикл разработки внешней компоненты для мобильного приложения. Я лишь хотел поделится исходниками компоненты, которые можно легко открыть иотлаживать через Visual Studio и Android Studio а также использовать как начальный шаблон для разработки своей компоненты.
3. Region102 22.10.19 13:32 Сейчас в теме
Однозначно нужная статья! А то у меня все никак руки не дойдут до продолжения цикла видео на эту тему.
4. gamletspb 27 23.10.19 08:14 Сейчас в теме
В описании совершенно не раскрыта задача, которую ставил перед собой автор (если это конечно не написание мобильной внешней компоненты ради мобильной внешней компоненты).
6. ripreal1 517 23.10.19 18:51 Сейчас в теме
(4) С целью угадали. Я просто хотел выложить исходники компоненты, на базе которых легко начать разрабатывать свою компоненту.
7. Xershi 1045 23.10.19 18:58 Сейчас в теме
(6) так на ИТС же есть проект. Вопрос как начать его использовать, а не как его допиливать.
Fox-trot; +1 Ответить
8. ripreal1 517 27.10.19 21:06 Сейчас в теме
(7) На ИТС есть sln проект только для десктопной версии компоненты. Для мобильной компоненты проекта нет. Есть только исходники и bat-ник для сборки через cmake, который "завести" лично мне не удалось.
9. lokli 20.11.19 09:45 Сейчас в теме
Спасибо за исходник. Возник такой вопрос, а как в третьем примере передать данные в обработку внешних событий 1С?
У вас, там стоит nullptr...
Я пытаюсь разобраться на примерах, что бы попробовать свои силы в написании таких компонент.
10. ripreal1 517 20.11.19 14:05 Сейчас в теме
Этот кусок кода должен помочь:

extern "C"
JNIEXPORT void JNICALL
Java_org_biterp_bcdriver_MainApp_onBarcodeRead(JNIEnv *jenv, jobject thiz, jlong pObject, jstring jdata)
{
    std::wstring dataWString = Utils::jstring2wstring(jenv, jdata);
    IAddInDefBaseEx* pAddIn = (IAddInDefBaseEx*)pObject;
    if (pAddIn != nullptr) {
        pAddIn->ExternalEvent(s_EventSource, WcharWrapper(L"BarcodeRead"), WcharWrapper(dataWString.data()));
    }
}

Показать
11. lokli 20.11.19 15:17 Сейчас в теме
(10)

....
std::wstring dataWString = Utils::jstring2wstring(jenv, jdata);
....

Спасибо, я вроде в этом направлении и двигался. С преобразованием в строку сильно помогли.
Теперь глупый вопрос: Utils - это что?
12. ripreal1 517 20.11.19 17:21 Сейчас в теме
(11) Это отдельный метод

std::wstring Utils::jstring2wstring(JNIEnv* jenv, jstring aStr)
{
    std::wstring result;

    if (aStr)
    {
        const jchar* pCh = jenv->GetStringChars(aStr, 0);
        jsize len = jenv->GetStringLength(aStr);
        const jchar* temp = pCh;
        while (len > 0)
        {
            result += *(temp++);
            --len;
        }
        jenv->ReleaseStringChars(aStr, pCh);
    }
    return result;
}
Показать
13. lokli 22.11.19 08:28 Сейчас в теме
(12) Я понял про метод. Вопрос немного в другом. В текущем классе (MainApp) есть этот метод и он объявлен в private. Попытка вызвать его предложенным вами способом
...
std::wstring dataWString = MainApp::jstring2wstring(jenv, jdata);
...

приводит к ошибкам:

Ошибка (активно) E0245 нестатическая ссылка не член должна указываться относительно заданного объекта androidUtils
Ошибка (активно) E0265 функцию "MainApp::jstring2wstring" (объявлено в строке 122) недоступно androidUtils

Подскажите, пожалуйста, что не так?
14. ripreal1 517 25.11.19 08:53 Сейчас в теме
(13)
Это ошибка в синтаксисе из-за незнания C++. Нужно почитать хотя бы пару туториалов. Все равно ведь придется, а без этого компоненту, которая хотя бы что-то умеет кроме слипа не собрать.
15. lokli 25.11.19 12:38 Сейчас в теме
(14) Я нашел решение. Закинул объявление метода в public и сделал следующий вызов:

MainApp _MainApp;
std::wstring dataWString = _MainApp.jstring2wstring(jenv, jdata);


После этого получилось собрать компоненту. Просто был интересен ваш вариант решения этой проблемы. )
В любом случае, благодарю за предоставленный образец и консультацию.
16. michael512 24.01.20 09:29 Сейчас в теме
а не проще ли написать сразу нативное приложение? общение с 1С посредством xml (этим я и занимаюсь)
17. user1325921 01.05.20 22:23 Сейчас в теме
не заводится, хочу уточнить у автора и более опытных коллег, может кто-то подскажет, что я делаю не так. Для начала я решил не компилировать проект, а взять уже готовый билд (конфу и апп).
1. установил учебную версию 1с мобильная платформа 8.3.16 http://online.1c.ru/catalog/free/28765768/ (платформа 16й версии там, а мобильные приложения - 8.15)
2. в 1С открыл предложенную автором конфигурацию, загрузил в ОбщиеМакеты.Компонента zip-архив androidUtils.zip (там org_ripreal_androidutils-debug.apk, 2 манифеста и нативная so-либа под arm и x86 )
3. установил на смартфон (Андройд 10) приложения 1cem-arm.apk
4. опубликовал приложение 1С через Конфигурация-Мобильное приложение-Публиковать
5. в указанном каталоге (доступном так же через веб-сервер по адресу http://192.168.2.211/1с) появились файлы 1Cv8.1CM, 1cema.xml и папка Android с apk и so для двух архитектур
6. на мобильном приложении запустил 1С
7. создал новое приложение прописав путь http://192.168.2.211/1с
8. при попытке загрузить конфигурацию возникает ошибка "Ошибка разбора
18. user1325921 01.05.20 22:59 Сейчас в теме
Пытаюсь запустить проект с предоставленными скомпилированными библиотеками и конфигурацией и не получается:
1. Скачал androidUtils.zip и конфигурацию
2. Установил 1С Мобильная платформа (учебная) с 1С предприятие 8.3.16 и 1С 8.3.15 мобильными приложениями вот отсюда: http://online.1c.ru/catalog/free/28765768/
3. Установил 1С на комп
4. установил 1cem-arm.apk на пару Samsung-ов (один с 9м андройдом, другой с 10м)
5. Открыл конфигурацию
6. Опубликовал приложение через Конфигурация-Мобильное приложение-Опубликовать (http://192.../1c - доступен и там видны файлы 1Cv8.1.CL, 1cema.xml, папка Android c приложениями и so-библиотеками)
7. На смартфонах открыл 1C, создал приложения с url http://192.../1c
8. При попытке загрузить выскакивает ошибка «Неправильный формат конфигурации по причине: Ошибка разбора XML: - [1,55] Фатальная ошибка: Space required after the Public Identifier SystemID: file:///data/user/0/com.e1c.mobile/files/1C/1cem/1cema.xml
9. Думал, что это из-за 8.3.16 на сервере и 8.3.15 на клиенте. Установил на смартфоны apk из дистрибутива 8.3.16.142 мобильной платформы от 1с. Не помогло. Та же ошибка.
10. Пока всё это делал,
a. увидел, что синхронная инициализация внешних компонент запрещена (в вашей конфигурации), изменил «Режим использования синхронных вызовов расширений платформы и внешних компонент» на «Использовать» в конфигураторе.
b. Поиграл с ограничением совместимости (последовательно ставил 8.3.13, 14, 15, Не использовать)
11. Посмотрел на форуме – ошибка встречается, но нет явного понимания (в т.ч. в существующих топиках), что это за огреха и как её вылечить.
Если кто-то сталкивался, подскажите, плиз
19. user1325921 02.05.20 17:17 Сейчас в теме
В итоге я разобрался и смог загрузить приложение на мобильную платформу и даже отладку на него запустить в конфигурации. Но опять же, как ни колдовал с вот этими двумя вещами
a. увидел, что синхронная инициализация внешних компонент запрещена (в вашей конфигурации), изменил «Режим использования синхронных вызовов расширений платформы и внешних компонент» на «Использовать» в конфигураторе.
b. Поиграл с ограничением совместимости (последовательно ставил 8.3.13, 14, 15, Не использовать)
так и не смогу загрузить компоненту. Всё время ошибка "невозможно загрузить компоненту". в отладке всё падает на команде
	Если ПодключитьВнешнююКомпоненту("ОбщийМакет.Компонента", "BITERP", ТипВнешнейКомпоненты.Native) Тогда
20. user1325921 03.05.20 12:10 Сейчас в теме
Как ни проверял, внешняя компонента не подключается. Проверил доступы в apache - все файлы и директории доступны по прямым ссылкам...
22. ripreal1 517 03.05.20 20:26 Сейчас в теме
(20)
Мобильные внешние компоненты не работают в декстопе и «Режим использования синхронных вызовов расширений платформы и внешних компонент» никак на это не влияет. Кроме этого до версии 8.3.15, включая не работают 64 битные версии - это платформенная ошибка. И кроме того во многих сборка платформы есть ошибка при которой при отладке через конфигуратор компоненты просто не копируются на телефон и таким образом не запускаются.

Самый надежный способ убедится в работоспособности - это собрать конфигурацию через сборщик 1С и запустить на телефоне с 32 битной ОС.
(20)
user1325921; +1 Ответить
21. ripreal1 517 03.05.20 20:26 Сейчас в теме
23. user1325921 03.05.20 22:42 Сейчас в теме
сейчас я собрал без сборщика в конфигурации 8.3.16 (до этого всё время и в 8.3.15) и по логам апача проверил - файлы .so и .apk не копируются. была ошибочка в manifest.xml и надо было вместо
arch="ARM"

писать
arch="arm64"

После этого приложение загружается и по логам апача файлы .so и .apk загружаются. Тем не менее всё так же на строке
Если ПодключитьВнешнююКомпоненту("ОбщийМакет.Компонента", "BITERP", ТипВнешнейКомпоненты.Native) Тогда

формируется ложь и компонента не инициализируется...

Попробую по вашей рекомендации собрать через сборщик.
24. user1325921 03.05.20 23:26 Сейчас в теме
победил без сборщика. необходимо было использовать 1cem-arm.apk а не 64-х битную версию этого apk. версия мобильной платформы 8.3.16.142. Именно ваш последний комментарий и навёл на мысль о замене 64х битной версии на 32х. Спасибо
26. user1325921 15.05.20 10:54 Сейчас в теме
прочитал свои комменты, понял, что надо немного пояснить. Проект работает, важно следить за тем какой битности приложение копируете на устройство и какая там стоит мобильная платформа (1cem-....apk). если на устройство устанавливать 1cem-arm.apk то и в манифесте надо прописать "arm", а не "arm64".
Проверяйте логи апача - там эти ошибки вылезают как битые ссылки с 404й http ошибкой
27. user1080789 19.11.20 09:26 Сейчас в теме
(26)Здравствуйте. Вы можете по шагам описать как вы заставили работать внешние компоненты в мобильном клиенте без сборки мобильного приложения.
28. user1325921 19.11.20 18:09 Сейчас в теме
(27) Добрый день. Если честно, часть вещей просто забыл, а виртуальную машину уже удалил. Тем не менее, что я точно помню, это 2 проблемы:
1. Была проблема с тем, что на сервере создавались директории, но туда не попадали файлы приложения. Лечил удалением всех автоматически созданных директорий у apache и повторным деплоем приложения.
2. Была проблема, что я установил на телефон неверную версию мобильной платформы (1cem-...apk). После удаления и установки корректной версии, а так же поправки манифеста получил работающую компоненту.
Если напишите, на каком шаге и что именно не получается, постараюсь вспомнить свой опыт и подсказать.
29. AlexBar 51 19.11.20 21:35 Сейчас в теме
(28)Пытаюсь протестировать все на примере БПО для мобильного приложения. Копирую на планшет (Андроид 8) 1cem-arm.apk, устанавливаю мобильную платформу. На компе Запускаю конфигуратор БПО и публикую его на сервере (IIS). Запускаю на планшете 1С, добавляю базу, прописываю путь до каталога публикации. Мобильный клиент устанавливается без проблем. База сформировалась, захожу в нее и пытаюсь установить драйвера сканера. Получаю сообщение об обшибке что драйвера не установлены. Пытаюсь найти в инете информацию как вообще работают компоненты в мобильном клиенте без сборки APK. Вариант со сборкой мобильного приложения меня вообще не интересует. Я хочу иметь возможность оперативно вносить изменения в разрабатываемую конфигурацию и обновлять на планшетах. В zip архиве, который расположен в макете конфигурации БПО имеются и файлы apk и файлы so. Я понимаю что все должно быть намного проще, чем подтягивание файлов с сервера.. но вот что-то пока не могу разобраться.
30. user1325921 23.11.20 18:40 Сейчас в теме
(29) К сожалению, ваш путь отличается от моего прежде всего использованием IIS. Насколько я понял, этот сервер не рекомендуется для использования, нужно установить apache 2 и на него уже публиковать. Ну если оттуда всё скачивается, то это уже плюс.
Далее, насколько понимаю, мобильный клиент и мобильная платформа - это разные вещи. очень. Именно мобильная платформа требует компиляции вашей компоненты и/или приложения и повторной установки (если она нужна, допустим обновление) из каталога публикации. Обойти это я не пытался, да мне и не требовалось.
31. AlexBar 51 24.11.20 16:03 Сейчас в теме
(30)Мне в настоящий момент не ясно что меняется с компиляцией приложения в APK, ведь сами компоненты при этом не меняются. К сожалению нигде не могу найти подробную информацию как это все работает. Уверен что все можно решить проще, главное знать что с чем взаимодействует.
32. user1325921 24.11.20 19:02 Сейчас в теме
Давайте разберёмся в теминологии.
1. Есть приложение "мобильная платформа" которое уже собрано и предоставлено всем в виде 1cem-*.apk файлов
2. Есть ваше собственное приложение, написанное (разработанное) под мобильную платформу с помощью конфигуратора 1С
3. Есть нативная компонента, которая позволяет вашему приложению из пункта 2, запускаясь в приложении из пункта 1 осуществлять работу (вызовы) каких-то нативных возможностей устройства, на котором запущено (или вызывать другие приложения, или какой-то low-level code, или работа с датчиками/сенсорами и другими частями устройства которые 1С само по себе не видит (для которых не написаны вызовы разработчиками 1С).

Так вот нативную компоненту из п.3 вам надо писать на языке той платформы, на которой её будете запускать (Android - Java, iOS - ObjectiveC). После того, как вы напишите Java/ObjC код, вам его надо компилировать и добавлять в приложение из п.2 как внешний компонент, в виде zip-архива. В этом архиве будет манифест и нативная компонента скомпилированная в apk для Android или в ipa для iOS.

(31)
33. AlexBar 51 25.11.20 15:05 Сейчас в теме
(32)Вы подробно и точно все расписали, но все же имеются некоторые вопросы. Если мы рассматриваем вариант работы к примеру в виде обычного клиента, то все внешние компоненты выполнены в виде библиотек dll, их в принципе не требуется даже регистрировать в windows чтобы подключить, все работает нативно. Мы выполняем команду "ПодключитьВнешнююКомпоненту" и далее уже с ней работаем без проблем. В теории в мобильном клиенте все то же самое, то есть для работы с внешней компонентой мы так же используем команду "ПодключитьВнешнуююКомпоненту". Если исходить из того. что идет в поставке БПО, то в качестве внешней компоненты используются файлы so, которые являются кроссплатформенными библиотеками. Значит чтобы ее задействовать нам необходимо разместить соответствующую версию (исходя из разрядности среды запуска) компоненты в макет с типом двоичных данных и далее подключать по аналогии с десктопным вариантом. Но это в теории, на практике они не подключаются. Кроме того в поставке БПО идут еще и apk файлы.. драйверов? То есть сначала нужно установить программу из apk в качестве драйверов, и только затем в конфигурации подключать внешнюю компоненту в виде so?
34. user1325921 25.11.20 15:36 Сейчас в теме
Добрый день.
Кроме того в поставке БПО идут еще и apk файлы.. драйверов? Если вы о приложениях 1cem-*.apk то это приложение мобильной платформы для конкретного архитектуры процессора (ARM или x86) под Android. Назовём эти приложения "оболочкой" которую устанавливают на смартфон первой. После установки "оболочки" 1cem-*.apk вам надо запустить её и прописать, по какому адресу http://xxx:yyy/my_app можно скачать ваше приложение my_app

По сути всё это матрёшка:
1. 1cem-*.apk - самая большая матрёшка, в которой реализованы за вас уже все вызовы по рисованию форм, кнопок, загрузке данных и т.п.
2. ваше приложение - вторая матрёшка, поменьше. в ней вы реализуете уже конкретно вашу форму, пишите названия кнопок и где их отображать (вверху или внизу экрана и тп.)
3. внешняя компонента - самая маленькая матрёшка, которая будет частью вашего приложения, если вашему приложению не хватает того функционала, который дал вам как разработчику конструктор форм и кнопок из 1cem-*.apk и вы, допустим, хотите использовать возможности лидара или какого-то акселерометра, которые есть как датчики на смартфоне, но 1С (бяки такие) не дали вам метод типа ВключитьЛидар.ПолучитьСцену из "коробки", т.е. из 1й матрёшки

Кроме того в поставке БПО идут еще и apk файлы.. драйверов? То есть сначала нужно установить программу из apk в качестве драйверов, и только затем в конфигурации подключать внешнюю компоненту в виде so? Надеюсь, за счёт объяснения выше стало ясно, что хоть ваше рассуждение некорректно в деталях, в последовательности действий оно верно - сначала ставим 1cem-*.apk на телефон, далее пишите свое приложение под мобильную платформу, пакуете в него нужную вам компоненту и вперед, к звёздам.
35. AlexBar 51 25.11.20 17:55 Сейчас в теме
(34)Мне кажется вы немного перемудрили в пояснениях. Мы вроде давно с Вами разобрались в терминологии. Видимо вы не знаете что идет в поставке БПО в zip файлах. Тип apk имеет не только мобильная платформа "1С:Предприятие" из пункта 1, но и любое приложение, устанавливаемое на устройство под управлением Android. Я считаю что именно Вы в деталях моего запроса и не разобрались.
Оставьте свое сообщение

См. также

Внешние компоненты мобильной платформы 1С для ОС Андроид

Разработка внешних компонент Мобильная разработка v8::Mobile Абонемент ($m)

На трех простых примерах описана процедура разработки внешних компонент для Андроид. Статья написана по мотивам доклада на конференции INFOSTART 2018 EDUCATION.

31.01.2019    16837    IgorKissil    25