Разработка приложения под 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С v8.3 1С:Конвертация данных Платные (руб)

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

13200 руб.

27.12.2021    38196    108    161    

201

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

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

3000 руб.

03.12.2018    59291    192    103    

172

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

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

2000 руб.

22.04.2019    97225    586    189    

321

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

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

3450 руб.

28.04.2023    9469    15    0    

9

Мобильная разработка Платформа 1С v8.3 Конфигурации 1cv8 Финансовые услуги, инвестиции Управленческий учет Платные (руб)

Мобильное приложение и конфигурация 1С для автоматической торговли на бирже через API Тинькофф банка. Достаточно задать настройки, нажать «Пуск», и робот сам торгует ежедневно.

7000 руб.

25.05.2022    4644    1    0    

6

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

Экспериментальный релиз и простенький скрипт к нему закрывает потребности в любых видах синхронизации между устройствами Simple и между Simple и бек-системами (например 1С). По сути – это очень простой python-скрипт, который можно запустить на доступной машине, сервере или VPS и он будет связывать клиентские устройства между собой и с 1С или другими бек-системами. В самой платформе появилось для этого множество доработок для поддержки стабильного постоянного соединения, докачки больших файлов и работе в фоне. Дополнение к основной статье https://infostart.ru/1c/tools/1153616/

1 стартмани

23.08.2024    1215    6    informa1555    1    

13

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

В этом релизе собрано много нового из области интерфейса, связи, хранения и важные новые способы управления. Дополнение к основной статье https://infostart.ru/1c/tools/1153616/

1 стартмани

25.06.2024    2607    29    informa1555    0    

33
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. pasha_2001 22.12.18 09:10 Сейчас в теме
Спасибо за статью. Жду продолжения
2. mrgrigorov 18 22.12.18 12:45 Сейчас в теме
(1) Доброе утро! Я думаю, что продолжение увидит свет или в воскресенье, или в понедельник вечером
3. dreamadv 156 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 156 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 156 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. Идальго 234 27.01.19 01:02 Сейчас в теме
Даёшь продолжение! ))))
Оставьте свое сообщение