Разработка приложения под Android для работы с веб-сервисами 1С. Часть 1

21.12.18

Разработка - Мобильная разработка

В первой части данного цикла Вы ознакомитесь с основными проблемами разработки приложений под Android, которые должны взаимодействовать с веб-сервисом 1С.

Введение

Доброго времени суток, уважаемые читатели. Во введении мне хотелось бы сказать, что код, который Вы встретите в данном цикле статей, не претендует на использование в качестве примера "Это есть хорошо", служит он лишь для ознакомительных целей и разбора необходимых моментов.

Так же, я не являюсь профессиональным Java-разработчиком, поэтому программный код может иметь определенные недочеты и, разумеется, я уверен, что поставленную задачу можно было решить более элегантно. Тем не менее, тем, кто столкнулся со схожей задачей данная статья послужит хоть каким-никаким, но подспорьем в её решении.

 

Статья 1.

Проблемы, с которыми может столкнуться начинающий Android-разработчик.

 

Проблема 1. Не любите асинхронность? А придется полюбить. Ну или стерпеть.

И это не является шуткой или гиперболой. Рассмотрим в качестве примера любую конфигурацию. Асинхронность встречается в любой более-менее серьезной конфигурации, но используется там лишь в тех местах, где есть необходимость - к примеру, во время формирования сложных отчетов, где она служит для того, чтобы пользователь мог продолжить работу с программой во время этой операции.

В Android все немного по-другому. Так или иначе, но работая с Android-приложениями (по крайней мере, в нашем случае), мы все равно столкнемся с необходимостью хранения и получения данных.

Каждое Android-приложение имеет поставляемую "из коробки" базу данных SQLite 3. Имеются различные обертки, но мы будем рассматривать в качестве обертки Room Persistence Library от Google. Несмотря на возможность удобной работы с базой данных и отсутствие необходимости вручную писать запросы, изучая особенности SQLite 3, мы имеем одну большую проблему.

Пример 1.

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

Продолжаем рассуждать.

Любой 1С-разработчик скажет - Что тут сложного? Написал запрос, забрал данные и готово!, но здесь все немного иначе. Дело в том, что Android имеет один основной поток приложения, который, можно сказать, отдан под работу с UI. Вызвать оттуда какой-либо метод какого-либо класса, который запрашивает и возвращает данные для их дальнейшей обработки, просто так нельзя - в противном случае, наше приложение даже не соберется, а компилятор скажет нам, что было бы неплохо сначала заглянуть в документацию.

Суть данной проблемы заключается в том, что независимо от количества записей в таблице - даже если там всего одна запись - запрашивать эти данные необходимо в отдельном потоке во избежание блокировки UI.

Из этого вырастает потеря огромного количества времени на написание асинхронных задач и настройку взаимодействия между потоками и процессами приложения (IPC). Примерно по такой схеме будет происходить запрос некоторого количества записей из таблицы локальной базы данных нашего приложения:

 

 

Как видите, начинается всё с активности. Эта активность должна описывать заранее созданный интерфейс для реализации callback'а. В активности создается экземпляр класса асинхронной задачи, после чего данная задача начинает выполняться (после вызова соответствующего метода .execute()). При создании экземпляра класса, необходимо предусмотреть передачу в конструкторе экземпляра активности - именно через неё мы будем получать доступ к ресурсам приложения, а так же именно через экземпляр класса активности мы и получим возможность создать callback обратно к ней.

Класс асинхронной задачи должен содержать как минимум 3 обязательных перегруженных метода - onPreExecute(), который вызывается перед тем, как задача начнет выполняться, doInBackground(), в теле которого и происходит выполнение задачи и onPostExecute(), который вызывается непосредственно после выполнения задачи. Пока что можно не вдаваться в такие подробности, более подробно мы рассмотрим это в следующих статьях. В onPostExecute() вызывается полученный от экземпляра активности описываемый интерфейсом метод, который и служит нам для оповещения активности о завершении выполнения задачи и позволяет передавать результат без излишней возни.

 

Примечание 1.

Методы onPreExecute(), doInBackground() и onPostExecute() являются перегруженными, аналогично перегрузить необходимо и метод, который принимает сигнал о завершении задачи с результатом.

 

Примечание 2.

В конструктор нам необходимо передавать экземпляр активности по двум причинам. Во-первых, иначе нам не получить доступ к интерфейсу для организации callback'а, а так же именно через экземпляр активности мы сможем получить доступ к ресурсам приложения - в том числе, для поиска Views, строковых значений, контекстов приложения и активности.

 

Примечание 3.

Так же, мне хотелось бы заметить, что данное ограничение распространяется и на HTTP-запросы, которые мы будем использовать - их так же необходимо выполнять асинхронно.

 

Проблема 2. Думаете, что SOAP и Android - близкие друзья? Вы ошибаетесь.

Данная проблема заключается в том, что, несмотря на популярность SOAP, разработчики системы не позаботились о поддержке данного способа обмена данными. Реализовывать поддержку SOAP нам придется собственными силами, используя HTTP-запросы, предусмотренные в пакете java.net.

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

 

Примечание 1.

Собственно, отсутствие поддержки SOAP и натолкнуло меня на идею написания данного цикла статей. В сети присутствует множество статей-примеров для работы с SOAP из-под Android, но во всех найденных мной статьях используется библиотека android-ksoap2, а так же пытались использовать Apache. У меня не получилось заставить работать обмен данными ни с Apache, ни с android-ksoap2. К тому же, если имеется возможность реализовать что-то тремястами строками кода, не прибегая к подключению тяжелой библиотеки, - лучше поступить именно так.

 

Проблема 3. DEX 64K LIMIT.

А вот на этой проблеме я остановлюсь подробнее, нежели на второй. Если Вы ранее не сталкивались с данной проблемой, то поначалу она может поставить в тупик и отбить желание заниматься мобильной разработкой вообще. 

Во время сборки приложения, генерируется так же .dex-файл, который содержит в себе скомпилированные Java-классы. Вы не ограничены в количестве методов, которые могут быть описаны в Вашем приложении, но вот вызывать Вы можете только первые 65536 методов.

Это связано с ограничениями в размере поля, отведенного под описание методов в DEX-файлах.

Данная проблема способна действительно вогнать в ступор начинающего разработчика, так как изначально нельзя понять - что можно сделать для решения данной проблемы.

Перед тем, как начать расписывать решение данной проблемы, которое будем использовать мы с вами, я отвечу на логичный вопрос.

 

- У нас от силы будет около 200 методов, откуда превышение данного лимита?

Все дело в том, что, как бы то ни было, без использования библиотек в своем проекте не обойтись, и актуально это для проекта абсолютно любого размаха. Туда входят библиотеки обратной совместимости, библиотеки для работы с Google Play Services и прочее, и прочее. К слову, только Google Play Services может "съесть" около 20 тысяч методов - что уже довольно-таки весомая часть ограничения. К тому же, Android постоянно развивается - и даже системные библиотеки так или иначе растут в своем объеме, поэтому лучше изначально предусмотреть возникновение такой неприятной ситуации.

 

А теперь продолжим.

Для решения данной проблемы существует 3 способа - использование плагина для Android Studio, использование различных инструментов для чистки проекта от неиспользуемых библиотек и добавление поддержки MultiDex. Как бы ни заманчивы были первые два способа, я их могу назвать больше костылями, нежели путями для решения, поэтому мы остановимся на третьем варианте.

Что такое поддержка MultiDex? Как правило, это добавление возможности использовать не один DEX-файл, а нескольких, подгружая их в runtime. Но, тем не менее, я должен предупредить, что даже этот способ накладывает определенные ограничения - в том числе, на использование библиотек, поскольку нечаянно можно вызвать библиотеку до того, как она будет загружена (хотя компилятор это поймет и не соберет подобное приложение, это может добавить нервотрепки в и без того неприятную ситуацию). Подробное решение данной проблемы с поэтапным описанием вы сможете увидеть в следующих статьях данного цикла.

 

Послесловие.

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

Во второй части нашего цикла мы разберем с Вами работу с Room Persistence Lbrary, на пальцах и примерах научимся создавать простые и сложные модели данных, а так же менеджеры для работы с таблицами на примере создания основы для хранения данных соединений и уведомлений приложения, а так же познакомимся с реализацией асинхронных задач в Android на примере асинхронной работы с базой данных.

 

Я хотел бы ещё раз напомнить о том, что данная статья является пробой пера - поэтому здоровая критика и пожелания по улучшению качества статей только приветствуются.

См. также

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

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

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

2880 руб.

03.12.2018    54998    139    102    

162

SALE! 25%

Что нам стоит бота построить? Нарисуем - будет жить! Графический конструктор телеграм-ботов/Telegram

Мобильная разработка Мессенджеры и боты Платформа 1С v8.3 Платные (руб)

Теперь создать telegram-бота - элементарно. Достаточно просто нарисовать блок-схему телеграм-бота, и он сразу заработает. Это возможно при использовании Графического конструктора телеграм-ботов. Это единственный конструктор ботов для telegram, чье качество и функционал подтверждены фирмой 1С, есть сертификат 1С:Совместимо. Расширение в интерактивном режиме, с помощью блок-схем, позволяет с минимальными трудозатратами создать телеграм-ботов в любой конфигурации, работающей на платформе «1С:Предприятие 8.3».

13200 9900 руб.

27.12.2021    33752    82    159    

177

"Мобильный ТСД" - инвентаризация и сбор штрихкодов для iOS и Android

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

Простой мобильный терминал сбора данных для смартфонов на iOS и Android, не требующий сложных настроек и установки дополнительных программ. Обмен между Вашей 1С и мобильным приложением осуществляется через облачный сервис и расширение конфигурации. Работает с конфигурациями УТ 11, ERP, КА2, Розница 2, Розница 3, УНФ 1.6, УНФ 3.0. Полнофункциональный демо-доступ для своей конфигурации можно запросить в настройках мобильного приложения - все необходимое придет на почту автоматически.

2000 руб.

22.04.2019    92300    519    186    

296

Магазин 15 - приемка товара по штрихкодам или инвентаризация в торговом зале

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

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

12950 руб.

30.05.2023    3453    2    0    

4

Работа с графикой в браузере (SimpleWEB). Векторный редактор

Мобильная разработка WEB-интеграция Мобильная платформа Абонемент ($m)

В SimpleWEB добавились средства для работы с графикой и отслеживание событий мыши, в онлайн редактор https://seditor.ru:1555/ добавился «Векторный редактор» на этом API. Теперь можно нарисовать схемы складов на ПК, сделать карты (*.sug-файлы) для мобильной платформы SimpleUI, выводить данные из 1С в графическом виде. Таким образом, API для работы с векторными файлами теперь есть и в веб- и в мобильной платформе, а также средства для создания и редактирования векторных файлов есть тоже в обеих платформах.

1 стартмани

20.03.2024    1597    0    informa1555    1    

40

Зачем нам 1С:Элемент

Мобильная разработка Языки и среды Бесплатно (free)

Flutter может быть использован с 1С:Предприятием для разработки кроссплатформенных мобильных приложений, обеспечивая единый интерфейс и функциональность на устройствах под управлением iOS и Android. Это позволяет создавать приложения с высокой производительностью благодаря использованию собственного движка рендеринга Flutter. Интеграция Flutter с 1С:Предприятием позволяет создавать мобильные приложения любого уровня сложности, интегрировать их в корпоративные информационные системы, а также реализовывать бизнес-логику

19.03.2024    9070    ROk_dev    67    

41

JavaScript в Simple

Мобильная разработка Бесплатно (free)

В SimpleUI и SimpleWEB, наряду с обработчиками на python и онлайн (1С и т.д.) добавляется интерпретатор JavaScript. В андроид платформе он скорее играет на поле python, т.к. является оффлайновым решением для самостоятельной обработки и расширяет аудиторию разработчиков для разработки самостоятельных решений. Дополнение к основной статье https://infostart.ru/1c/tools/1153616/

12.02.2024    1685    informa1555    0    

25
Комментарии
Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. pasha_2001 22.12.18 09:10 Сейчас в теме
Спасибо за статью. Жду продолжения
2. mrgrigorov 18 22.12.18 12:45 Сейчас в теме
(1) Доброе утро! Я думаю, что продолжение увидит свет или в воскресенье, или в понедельник вечером
3. dreamadv 155 23.12.18 22:42 Сейчас в теме
Для SOAP есть библиотека https://code.google.com/archive/p/ksoap2-android/, использовать WEB-Сервис сейчас не актуально, лучше использовать HTTP-Сервис в 1С (в 1C можно использовать как родной JSON, так например эту библиотеку JSON https://github.com/legionwfz/1C-JSON если штатный не устраивает по каким-то параметрам) и общаться через JSON который родной из коробки для Android. В своих проектах как раз использую такую связку полет более чем нормальный :)
6. mrgrigorov 18 24.12.18 12:15 Сейчас в теме
(3) буду честен (да и в статье указывал), что подняться на ksoap2 не удалось, из-за чего пришлось повелосипедить.
7. dreamadv 155 24.12.18 21:44 Сейчас в теме
(6) могу посмотреть у себя, собирал тестовый проект с этой библиотекой и все работало как раз в связке с 1С
4. neikist 24.12.18 10:43 Сейчас в теме
По моему проблемы асинхронности очень неплохо решает RxJava + RxAndroid. Асинктаски и все остальное уж слишком много бойлерплейта требует и вероятность допустить ошибку несет.
Ну и я бы на SOAP особо не смотрел, как по мне для мобилки такой себе выбор, слишком тяжеловесный. Имхо, лучше взять ретрофит с гсон а с бека json возвращать.
dreamadv; +1 Ответить
5. mrgrigorov 18 24.12.18 12:14 Сейчас в теме
(4) к сожалению, перед началом разработки приложения уже имелся веб-сервис, с помощью которого работали и веб-сайты с возможностью заказов на Bitrix. К тому же, веб-сервисы 1С более близки к использованию XML Schema, нежели JSON, особенно если с их помощью уже навешана куча всего а-ля интернет-магазин.
8. dreamadv 155 24.12.18 21:47 Сейчас в теме
(5) С XML на Андройд все менее весело чем с JSON, а уж в 1С с найтивной реализаций JSON не все ли равно во что выгрузить объект "структура". Ничего не мешает опубликовать кроме веб сервиса, еще и HTTP-сервис.
10. mrgrigorov 18 19.01.19 01:52 Сейчас в теме
(8) к сожалению, задача ставилась именно по разработке приложения под существующий веб-сервис. Но парсинг XML становится интересным занятием, если поиграться с DocumentBuilderFactory.
9. ruslan_hut 18 25.12.18 12:34 Сейчас в теме
Странно, что с ksoap2 не завелось. Немного заморочно, но насколько помню совсем не сложно. Вот моя шпаргалка на связку 1С с Андроид через SOAP: тыц
11. mrgrigorov 18 19.01.19 01:58 Сейчас в теме
Дорогие друзья!
Я сожалею, что в нашем цикле образовалась пауза -- сказываются большой объем работы и болезнь, которая одолела перед Новым Годом и с последствиями которой воюю по сей день. Когда будут решены все эти вопросы, цикл будет продолжен и даже дополнен различной интересной информацией, поскольку чем больше погружаясь в разработку Android-приложений под веб-сервисы 1С, тем больше интересных моментов и проблем открывается.
12. Идальго 227 27.01.19 01:02 Сейчас в теме
Даёшь продолжение! ))))
Оставьте свое сообщение