вылетает мобильное приложение 1с

Проблемы с разработкой мобильного приложения

Всем привет! Написал мобильное приложение, Интернет-магазин текстильной одежды.
Возникло несколько проблем и пожеланий заказчика, которые к сожаление пока что не удалось решить, может быть кто-нибудь на этом форуме сталкивался с такими же проблемами:

1) Периодически приложений вылетает, на некоторых смартфонах с ошибкой, на некоторых без:
[url=http://itmages.ru/image/view/4689852/4d2a4dd1][img]http://storage3.static.itmages.ru/i/16/0805/s_1470395841_5187443_4d2a4dd18c.jpg[/img][/url]
Чаще всего вылетает в момент переключения категории товаров или смены ориентации экрана.

2) Заказчик попросил убрать верхнюю панель с надписью «Рабочий стол»:
[url=http://itmages.ru/image/view/4689906/154f5e2e][img]http://storage3.static.itmages.ru/i/16/0805/s_1470396328_5079472_154f5e2ea4.jpg[/img][/url]
Искал в интернете, как же можно убрать эту панель, кто-то писал что надо подкорявить манифест приложения, но то имено подкорявить, так и не написали.

(13) Мобильная 1С прекрасно подходит для чего задумывалась: средство для влезания 1С на мобильный рынок.

Все остальное пока в процессе ))

(18) Можно и в сторону JavaScript подумать сча это проще Android Java и универсальнее.
Причем даже писать сразу на android без большого компа можно https://habrahabr.ru/post/301442/ ))

Но есть/будут и свои недостатки https://habrahabr.ru/company/ifree/blog/214531/ у такого подхода. Зато для кто веб-разработку (html/css/js) уже знает оно в разы быстрее и удобнее. На java только «эмулятор браузера» свой или готовый юзается для fullscreen.

(25) Картинки я вывожу, программно создавая элементы формы и прописывая путь к данным строк табличной части. Вот код:

Источник

Ошибки при работе с мобильным клиентом в 1С: Управление торговлей. Скажите в чем может быть причины таких ошибок и какие есть пути их устранения?

Здравствуйте. У нас возникают непонятные ошибки в работе мобильного клиента на ТСД. На складской площади организации сотрудники работают с терминалами сбора данных (ТСД), на которых установлен мобильный клиент 1С для работы с конфигурацией 1С: Управление торговлей. Периодически на разных операциях возникают данные ошибки:
Самые часто-встречающиеся ошибки:
1.Ошибка http при обращении к серверу unexspected end of stream on com.android.okhttp.Adress*
вылетает мобильное приложение 1с. вылетает мобильное приложение 1с фото. картинка вылетает мобильное приложение 1с. смотреть фото вылетает мобильное приложение 1с. смотреть картинку вылетает мобильное приложение 1с.
Документы, на который возникает ошибка: Расходный ордер на товары, Приходный ордер на товары
Операции, на которых возникает ошибка: Сканирование товара, Ввод количества, Завершение работы с документов, Создание документа, Поиск документа. Т.е. не зависит от программной реализации.
2. Ошибка http при обращении к серверу unexpected Java io.eofexception(рисунок2)
вылетает мобильное приложение 1с. вылетает мобильное приложение 1с фото. картинка вылетает мобильное приложение 1с. смотреть фото вылетает мобильное приложение 1с. смотреть картинку вылетает мобильное приложение 1с.
Документы, на который возникает ошибка: Расходный ордер на товары, Приходный ордер на товары
Операции, на которых возникает ошибка: Сканирование товара, Ввод количества, Завершение работы с документов
Другие ошибки:
1. Ошибка http при обращении к серверу Software caused connection abort
вылетает мобильное приложение 1с. вылетает мобильное приложение 1с фото. картинка вылетает мобильное приложение 1с. смотреть фото вылетает мобильное приложение 1с. смотреть картинку вылетает мобильное приложение 1с.
Документы, на который возникает ошибка: Расходный ордер на товары, Приходный ордер на товары
Операции, на которых возникает ошибка: Сканирование товара, Ввод количества, Завершение работы с документом
2. Ошибка HTTP
вылетает мобильное приложение 1с. вылетает мобильное приложение 1с фото. картинка вылетает мобильное приложение 1с. смотреть фото вылетает мобильное приложение 1с. смотреть картинку вылетает мобильное приложение 1с.
Возникает при попытке входа в программу

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

Скажите в чем может быть причины таких ошибок и какие есть пути их устранения?

Технические и программные характеристики, используемого оборудования:
Программное обеспечение сервера: Apache/2.4.18
Версия конфигурации 1С: Предприятия: 8.3.17.1549
Версия мобильного клиента 1С: 8.3.17.76
Версия конфигурации 1С: Управление торговлей: 11.4.13.57
Терминал сбора данных (ТСД): UROVO DT40 ANDROID 9.0 / 1.8 GHZ / 8ХCORE, CORTEX A53 RAM 2 GB ROM 16

Источник

На Android начали вылетать приложения? Найдено решение проблемы

вылетает мобильное приложение 1с. вылетает мобильное приложение 1с фото. картинка вылетает мобильное приложение 1с. смотреть фото вылетает мобильное приложение 1с. смотреть картинку вылетает мобильное приложение 1с.

Пользователи смартфонов и планшетов на базе Android по всему миру столкнулись с неприятной проблемой — некоторые приложения перестали запускаться или вылетают сразу после запуска. Проблема массовая, не зависит от производителя и модели устройства или версии Android и возникает в основном с приложениями, в которых задействованы сервисы Google.

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

Как решить проблему:

Запустите Play Маркет и обновите Android System WebView и браузер Chrome. Если в настройках магазина активировано автоматическое обновление приложений, можно не спешить — скоро они сами обновятся без вашего участия.

вылетает мобильное приложение 1с. вылетает мобильное приложение 1с фото. картинка вылетает мобильное приложение 1с. смотреть фото вылетает мобильное приложение 1с. смотреть картинку вылетает мобильное приложение 1с.

В том случае, если обновления Android System WebView и Chrome пока недоступны, а последние версии этих приложений были выложены в Play Маркете до 22 марта, можно воспользоваться временным решением: перейдите «Настройки» → «Приложения» → в меню с тремя точками включите отображение системных приложений, найдите в поиске Android System WebView и нажмите «Удалить обновления». Если кнопки для удаления обновлений нет, можно попробовать удалить и заново установить Chrome.

Как сообщают пользователи, после установки свежих версий Android System WebView и Chrome приложения перестают вылетать и работают нормально.

Источник

Реверсим мобильную 1с под андроид. Как добавить немного функциональности и угробить несколько вечеров

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

Так что обращаюсь к тем кто надеется увидеть применение деобфускаторов, использование Frida/Xposed, другого хитрого софта — ничего интересного вы для себя не найдете. Тут мы просто будем использовать apktool, baksmali, apksigner, adb, jadx, консоль, текстовый редактор, javac, d8 и все.

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

С чего все началось

Немного расскажу с чего мне вообще вдруг пришла идея как-то влезать в работу мобилки на 1с. На данный момент я вот уже скоро год как занимаюсь нативной разработкой под андроид, но до этого я проработал 4 года 1с программистом, причем последние года полтора мы часто работали именно с мобильной платформой. Несмотря на то что основные потребности она удовлетворяла, было у нее так же и очень много минусов (помимо языка программирования). В частности нельзя было по-человечески встроить какую нибудь внешнюю библиотеку, по крайней мере штатными средствами и с нашим тогдашним багажом знаний. Так же все было очень грустно, например, с функциональностью отображения меток на карте. Вся возможность ее настройки заключалась в указании текста для меток когда по ним тапаешь. На тот момент единственным способом как-то это обойти было использование специального объекта «ПолеHTMLДокумента», но с ним были свои проблемы. На время работы с 1с все мои знания в нативной разработке под андроид заключались в паре HelloWorld, так что идеи реверсить мобилку 1сную даже в голову не приходило, разные вопросы от заказчиков по нестандартному расширению возможностей 1с мы либо не решали никак, либо пилили очень простые нативные приложения ставившиеся рядом и криво/косо с 1с интегрировали (да и лицензионное соглашение 1с вроде запрещает правки в самой платформе).

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

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

Первые шаги

вылетает мобильное приложение 1с. вылетает мобильное приложение 1с фото. картинка вылетает мобильное приложение 1с. смотреть фото вылетает мобильное приложение 1с. смотреть картинку вылетает мобильное приложение 1с.

Как можно видеть на скриншоте выше — минификации приложение почти не подвергалось (в плане переименования классов и методов). Плюс видно что кода на java очень немного и почти все место занимают so библиотеки.

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

вылетает мобильное приложение 1с. вылетает мобильное приложение 1с фото. картинка вылетает мобильное приложение 1с. смотреть фото вылетает мобильное приложение 1с. смотреть картинку вылетает мобильное приложение 1с.

Список методов и их сигнатуры внушали надежду что все будет очень просто, и я решил заглянуть в smali код, после чего сильно напрягся и пошел читать список команд smali, и как его читать/писать. Впрочем, именно на этом моменте я решил что дело обещает быть несложным и недолгим, а соответственно вот он, повод поиграться с реверсингом. Приняв для себя решение посвятить этому пару вечеров (как же жестоко я ошибался), пошел со спокойной душой спать ложиться.

Строю планы

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

Ну, хорошо хоть с первым пунктом у меня проблем не возникло. Скачал бесплатную учебную версию платформы, скачал мобильную платформу, развернул все это у себя на компьютере (1С, сделайте вы уже версию учебную для linux, у меня как раз очередной порыв уйти с винды, а тут приходится часть работы в ней делать). Конфигурация очень простая, при запуске вызывает функцию ПоказатьНаКарте() в которую передает две точки на карте. Все.

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

Перепаковываю приложение без изменений кода

и получил каталог unpacked в котором лежала куча файлов, с ними в будущем предстояло работать. Запаковал apk обратно командой

Попытавшись установить его на эмулятор

я получил следующую ошибку:

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

мне удалось запустить приложение. Правда вместо карты с двумя точками меня ждал серый экран с подписью google внизу. Почесав репу я решил что дело в том что используется ключ для гугл карт от 1с, который с моей подписью не работает. Поэтому пойдя в консоль разработчика на сайте google я создал новый проект для работы с api google карт на андроиде, получил api key, который указал в res/values/strings.xml в google_maps_key строке, а так же добавил свой дебажный ключ в разрешенные для проекта. Перепаковал и переподписал apk, запустил, и наконец все снова работало.

Добавляю свои логи

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

Сначала я нагуглил и попытался воспользоваться утилитами jadx или dex2jar, чтобы не мучиться с чтением smali, а читать более привычный код на java, но по какой-то причине они не работали (в дальнейшем jadx все таки завести удалось каким то шаманством). Пришлось разбирать smali, благо это оказалось не так ужасно как я боялся.

В E1cApplication ничего интересного к сожалению обнаружить не удалось, все что там происходит — установка своего хендлера на крэши.

А вот в двух других классах, Starter и App информации было гораздо больше и оказалась она довольно полезной. Метод App.onCreate(Landroid/os/Bundle;)V довольно большой, так что приводить его целиком не буду, приведу только заинтересовавшие меня части.

Запустил из 1с десктопной 1с мобильную и получил следующие логи

Как видим — есть вся необходимая информация для автоматизации запуска приложения через adb. Правда к этому моменту я словил двойной фейспалм. Во-первых, наконец подобрал ключи с которыми jadx осилил перевод в java (понятно что писать все равно в smali бы пришлось, но все же). А вторым фейспалмом оказалось то что я осознал что зря я мучаю платформу разработчика (нужна только для разработки и отладки конфигураций), правильнее было бы реверсить сборку релизов 1сных приложений, причем там есть полу готовые gradle проекты для сборки, есть файл с перечнем зависимостей и другие плюшки. Я немного по этому поводу погрустил — и решил все таки закончить с тем что начал. Все равно ради фана делаю все это, а не ради практической пользы.

Запуск платформы через adb

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

Перечисленной выше последовательностью команд мы устанавливаем apk, даем установленному приложению разрешение на чтение диска, копируем конфигурацию 1с на устройство, и даем команды на запуск 1с и загрузку конфигурации. Работает это кстати не на всех версиях андроида, но я тестировал на api 28, и соответственно на нем эта последовательность делает все корректно. На младших версиях могут быть проблемы с выдачей прав.

Внедряюсь в обработку данных от 1с и модифицирую метки

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

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

Используя jadx для декомпиляции в java нашел в декомпилированном коде метод отвечающий за их заполнение

Соответственно у класса MapImplExtension добавил метод ArrayList[] kN(String[] titles, double[] coordinates) который в первом элементе массива вернет список который нужно будет поместить в Xj, а во втором список для Xk.

Скомпилировал следующими командами сначала в class, затем в dex, затем декомпилировал в smali чтобы потом упаковать вместе с остальными файлами

Добавил в MapImpl.smali поле extension типа нашего нового класса, и добавил его инициализацию

А также заменил обработку в классе MapImpl данных от 1с на обработку в классе MapImplExtension

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

Добавление новой функциональности

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

вылетает мобильное приложение 1с. вылетает мобильное приложение 1с фото. картинка вылетает мобильное приложение 1с. смотреть фото вылетает мобильное приложение 1с. смотреть картинку вылетает мобильное приложение 1с.

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

Подводя итоги — опыт был довольно интересный. По крайней мере для меня. Помог разобраться с некоторыми инструментами, узнал немного лучше о работе андроида и формате байткода для dalvik/art, опыт ковыряния минифицированного кода тоже будет полезен (уже был случай когда в релизной версии R8 вырезал поля класса которые на самом деле использовались, в тот раз только методом тыка разобрался, сейчас бы это проблем не доставило).

Если кому-то интересно самому все повторить и возможно расковырять еще больше — я выложил на github все исходники вместе с кривым gradle скриптом осуществляющим сборку из исходного apk модифицированного.

Источник

Сказ о том, как мы мобильное приложение писали. Часть 2. Обработка долгого нажатия

А сегодня мы расскажем, как в 1С отловить событие долгого нажатия на строку табличной части. Для простоты будем называть его долгим тапом, или просто тапом (от слова tap – касание). По сравнению с первой частью эта статья уже более техническая, поэтому здесь не будет веселых фотографий розовых контейнеров. Ну а что вы хотели – мы в первую очередь разработчики, а не маркетологи. 🙂

Проблема

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

вылетает мобильное приложение 1с. вылетает мобильное приложение 1с фото. картинка вылетает мобильное приложение 1с. смотреть фото вылетает мобильное приложение 1с. смотреть картинку вылетает мобильное приложение 1с.

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

Не может? Ой, да шо вы говорите!

Решение

Как известно, при обычном нажатии на строку срабатывает событие Выбор, и строка открывается. Если строку просто выделить, то сработает событие ПриАктивизацииЯчейки. Казалось бы – что мешает поместить наш код в это событие? Не всё так просто – оно срабатывает не только при выделении, но и при нажатии. Когда мы нажимаем на строку – она на мгновение выделяется (это можно увидеть невооруженным глазом), а потом уже открывается.

Итак, что мы имеем? При долгом тапе отрабатывает только ПриАктивизацииЯчейки, при коротком – ПриАктивизацииЯчейки и Выбор. Вывод напрашивается сам собой – если сработали оба события – значит это Выбор, если сработала только Активизация – значит это долгий тап.

Как мы будем это определять? Напрашивается простой вариант – у формы завести переменную ДолгийТап с типом булево, в событии ПриАктивизацииЯчейки устаналивать ее в Истину, а в Выборе в Ложь. При этом в Активизации подключить Обработчик ожидания, который через полсекунды проверяет – если ДолгийТап = Истина, тогда показываем пользователю меню, если Ложь – тогда ничего не делаем.
Сказано – сделано. Пишем код:

Открываем форму на телефоне – и при открытии сразу же выскакивает наше предупреждение. Как так, мы ведь даже ничего не нажали? Это связано с тем, что при открытии формы первая строка таблицы активизируется и 1С думает, что это долгий тап.
Есть еще один неприятный эффект – долгий тап не срабатывает для уже выделенной строки. То есть если тапнуть по строке, откроется меню, пользователь его закроет и снова тапнет – то второй раз меню не откроется. Такое происходит потому, что событие ПриАктивизацииЯчейки не вызывается второй раз для выделенной строки.

Впрочем, даже в таком варианте этим пользоваться можно. Но “можно” нас не устраивает, поэтому мы продолжаем эксперименты.

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

Проверяем – первая проблема осталась. При открытии формы первая строка всё равно остается выделенной (и срабатывает долгий тап), как будто вызов процедуры принудительной очистки строк игнорируется платформой. Причем то же поведение наблюдается и в настольной версии.

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

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

Запускаем на телефоне – работает!

Причем обратите внимание – можно не только определить свой обработчик долгого тапа, но и установить время задержки перед его срабатываем (второй параметр процедуры ПодключитьОбработчикОжидания).

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

Вывод

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

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

Послесловие

Я не удивлюсь, если первым комментарием к этой статье будет фраза “Мсье знает толк. ” А что поделаешь – именно так выглядит программирование под мобильную платформу 1С, если хочется выжать из нее немножко больше, чем 100%. Впрочем мы уверены, что оно того стоит, и наше приложение Контейнер – тому пример.

Мы не прощаемся, и в следующей статье расскажем про наши прекрасные диаграммы расходов и платежей. Оставайтесь с нами!

Вадим Невзоров
ХВОЯ интегра, Одесса

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *