Начальные договоренности
По ряду причин не будем говорить о работе мобильной платформы на iOS-устройствах – хотя бы просто в контексте того, что я не являюсь по ним специалистом. Тем более что тот функционал, о котором я буду сейчас рассказывать, на iOS не доступен. Все, о чем будем говорить, касается именно Android.
Разрушители мифов
Изначально я хочу разрушить сразу несколько крепко засевших мифов, которые искоренить не получается. Даже на курсах люди все равно задавали мне эти вопросы.
- Первый вопрос, который интересовал практически всех – почему из мобильного приложения нельзя печатать? Печатать можно. Но для того, чтобы это делать, надо понимать суть архитектуры Android. Сама печать производится элементарно: создается HTML-документ, посылается специальное приложение, которое настроено для печати и печатается. И это помимо уже существующего мехнизма печати в 8.3.6, который, увы, поддерживают далеко не все принтеры.
- Далее – работа только в 8.3. Почему-то все решили, что раз мобильная платформа стала доступна только в 8.3, значит, если мы хотим обмениваться с центральной базой данных, то она тоже должна быть на 8.3. Нет. Центральная база может быть на чем угодно, хоть на 7.7 – без разницы.
Саму мобильную конфигурацию вы действительно можете разработать только на 8.3.х, но обмениваться она может с какой угодно базой данных – хоть с 7.7. Единственное, что это, конечно же, будет немного сложнее. - Далее – ждем, пока уберут дублирующий заголовок, добавят запрет поворота экрана и т.д. Это все можно сделать самим – на курсах я рассказывал, как. Если в двух словах, то там надо просто поменять всего лишь пару строчек в xml-файлике, и, таким образом, вы убираете дублирующие заголовки, запрещаете поворот экрана и т.д.
- Четвертый миф – 1С сама найдет и исправит баги. Тут все грустно. Потому что даже тот сервис по логированию и документированию ошибок, который они предоставляют, страдает тем, что там пишут только решенные ошибки. Для ошибок, которые зарегистрированы, но еще не решены, можно увидеть только номер без описания, чаще всего. И это приносит некоторый дискомфорт, потому что когда появляется проблема, ты не понимаешь, или ты ошибся, или в 1С баг. К сожалению, в мобильной платформе пока багов хватает, хотя их стало значительно меньше.
Основной корень проблем
Теперь о проблеме. Она заключается в том, что когда люди садятся программировать мобильную платформу, они сразу начинают считать себя Android-разработчиками или iOS-разработчиками. И в этом - огромнейшая ошибка, потому что они до сих пор мыслят в контексте стационарной платформы, а здесь надо мыслить совершенно по-другому. В частности, надо понимать, как устроен Android, как там происходит взаимодействие между программами:
- Допустим, мы в стационарной 1С привыкли к тому, что если нам надо где-то учитывать счетчик посетителей, то у нас есть какая-то программка, которая выгружает эти данные в XML-файлик, а мы его потом по регламенту в 1С подгружаем.
- А в Android это придется сделать по-другому (хотя, конечно, можно и так). В частности, вызвав намерение и т.д. – об этом мы чуть позже поговорим.
Я это говорю к тому, что если компания собирается серьезно развивать направление создания мобильных приложений (создавать какие-то адекватные решения), то ей однозначно нужен Android-программист. И это даже не оговаривается. Тут надо выбирать меньшее зло, или учить Андроид программиста - 1С, или 1С программист будет получать консультации от Андроид программиста.
Что можно сделать в мобильном приложении 1С?
Что же можно сделать на мобильном приложении 1С из того, что люди думают, что нельзя?
- Можно сделать полноценную фотографию при помощи встроенного приложения.
Это сейчас очень актуально, потому что для мобильных приложений возникла большая проблема с фотографиями. В частности, отделы OTK требуют, чтобы торговые агенты фотографировали выкладку товара в магазине, и из-за этого у всех возникла проблема с размером и качеством фотографий (непонятно, как их настроить, и можно ли повернуть или обрезать снимок). А на самом деле, для этого можно просто вызывать из 1С какое-то встроенное в мобильное устройство приложение, которое позволяет сделать со снимком все, что угодно. Кроме этого, приложение вам возвращает сразу же маленькую превью этой фотографии (320х320) и путь к полноценной фотографии (той, которую вы сделали, с теми настройками, которые вам нужны). И это сделать реально. - Отправить файл по почте – тоже не проблема. 1С это уже сделала на 8.3.5. Также файл можно отправить по скайпу, записать на гугл диск и т.д.
- Найти контакт, получить его URI, открыть – можно и это делать. Кстати говоря, у 1С до сих пор осталась проблема: получить URI контакта можно, но сделать с ней в 1С ничего нельзя. Поэтому тут спорная ситуация.
В результате возникает вопрос – а что же дальше? Почему для мобильных приложений 1С нет возможности сделать push-сообщение (push-notification), чтобы вы, когда опускаете шторку, видели уведомление от сервера? Это же, по сути, один из основных моментов – оповещение пользователя о чем-нибудь (например, о том, что выполнен обмен данными, пришел новый заказ, пришла накладная на сборку товара для кладовщика, который работает с терминалами сбора данных на Android и т.д.). Этой возможности у нас пока что нет. И даже то, что появилось в 8.3.6 - локальные уведомления - они не перерывают это, потому что они только уведомляют 1С, а не пользователя. Если у вас 1С свернуто, то да, пользователь увидит сообщение, а если открыта - то будьте добры, и обработайте сообщение сами, так как пуша вы не увидите.
И вот вопрос – а можно ли это сделать с помощью стороннего приложения по тому же принципу, что и фотографию? А для того, чтобы объяснить нам, почему так нельзя сделать, нам и нужен Android-программист.
Сравнение возможностей 1С по внутренней передаче данных и по работе с внешними Android-приложениями
Если перевести это все в контекст 1С, то в качестве примера можно привести работу с модальными окнами. Как это происходит? В контексте старой парадигмы, а не по принципу оповещений, хотя, стоит отметить - в Андроид используется именно принцип оповещений, чаще всего, просто 1С не умеет еще с ним работать.
- Мы делаем вызов какой-то формы. Например, подбора товара.
- Далее – делаем некую обработку данных в этой форме (например, выбираем в табличную часть документа товары, которые есть на остатке). Причем, если по выбранному в документе складу на остатке ничего нет, то мы можем просто даже не открывать эту форму – сразу передать в 1С, что ничего на остатке нет.
- А потом при закрытии формы подбора мы возвращаем в табличную часть документа выбранный результат.
А теперь возникает вопрос – как из встроенного языка 1С мы можем работать с внешними Android-приложениями? Для такого взаимодействия была выбрана интересная модель – по сути, мы делаем что-то вроде глобального оповещения.
Все знают, что в 1С есть функция «Оповестить» – с одной стороны мы оповещаем, а с другой стороны у нас висит обработчик оповещения. Соответственно, когда происходит какое-то событие, мы видим, кто инициатор этого события, и в зависимости от этого можем сделать те или иные вещи.
Приблизительно то же самое происходит и в 1С на мобильной платформе, когда мы, например, хотим отправить файл:
- Мы в 1С запускаем специальную команду – отправить файл с помощью стороннего приложения (по сути, эта команда соответствует глобальному оповещению).
- В этот момент вступает Android. Он проверяет тип сообщения (анализирует, что за намерение вы хотите сделать).
- Дальше он подбирает соответствующий этой задаче софт. Причем, если для выполнения этого действия может быть предусмотрено 10 различных приложений, то он выставит список из 10 наименований, а если там одна программа, то он сразу же ее запустит. Например, как в случае работы с фотографией – если вы запустите эту функцию у себя, то, вероятнее всего, он откроет какое-то предустановленное на вашем телефоне приложение для камеры, и вы с ним будете работать. А если у вас таких приложений несколько, вы сможете выбрать одно из них.
- Потом идет открытие приложения.
- И главное, после того, как все это отработает, идет возврат в 1С результатов работы. При этом нам надо четко понимать, что в данный момент на самом деле произошло – сделал человек фотографию или нет? Может, он просто нажал на кнопку «Отмена»? Это все нам надо каким-то образом отследить.
Здесь на слайде показано, как можно сделать фотографию средствами Android. Как видите, ничего сложного:
- Мы указываем путь, куда будет сохранена оригинальная версия фотографии с полным разрешением.
- Дальше мы говорим, что хотим вызвать некое намерение (сделать IMAGE_CAPTURE).
- После этого мы добавляем некие данные в так называемые Extras'ы (сообщаем приложению некие дополнительные данные). В данном случае, мы говорим, что хотим полноценный файл сохранить по тому пути, который указали выше.
Кстати, то же самое можно сделать и с видео. Причем в случае видео мы также можем передать, какого качества мы хотим сделать его сжатие. - И после этого мы просто делаем запуск приложения с помощью «Нов.Запустить(Истина)» – вот здесь в скобочках передается значение параметра «Ожидать», которое может быть либо «Истина», либо «Ложь» (по сути, мы задаем модальный или немодальный вызов).
- Если здесь будет стоять «Ложь» – значит, мы запустили приложение и пошли исполнять код дальше.
- Если здесь стоит «Истина» – тогда 1С ждет выполнения.
- Также анализируем результат:
- Допустим, если мы здесь нажимаем «Отмена», то у нас вернется результат «0» (ничего не было сделано). Или если вызов приложения окажется неудачным, то также вернется результат «0».
- А вот если приложение вернет фотографию (вы сделаете правильные действия, и приложение отработает нормально), то у вас здесь вернется обычный результат «-1».
- В результате фотография сохранится по выбранному пути, и вы сможете ее открыть встроенным приложением при помощи «ЗапуститьПриложение(ФайлКартинки)».
Вы видите, что «ЗапуститьПриложение» и «ЗапускПриложенияМобильногоУстройства» – это две разные функции.
- Суть в том, что «ЗапуститьПриложение» выполняется независимо – мы запускаем его выполнение, но не ожидаем никакого результата.
- А в случае «ЗапускПриложенияМобильногоУстройства» мы можем ожидать результат, а можем и не ожидать.
Ну это так, очень грубо, так как разница между ними все же более значительная.
Как видите, наличие у меня знакомых Android-программистов позволило мне эту функцию сделать в течение пяти минут. А на Инфостарте мне, например, много раз задавали вопрос: а как же это можно сделать? Это я к тому, что опять-таки, если вы собираетесь разрабатывать какие-то приложения на мобильной платформе, то у вас должен быть Android-программист.
Более подробно про эти функции можно почитать по выше указанным ссылкам.
Попытка создания плагинов к мобильному приложению 1С
Теперь, у нас появляется некоторый новый вариант плагинов к мобильной платформе 1С. Потому что если мы знаем, что можем вызвать любое приложение, передать в него параметры и получить от него ответ, то, значит, мы таким образом можем написать свое приложение, которое может делать все, что нам надо – в частности, push-сообщения, toast-сообщения, виджеты, вибрацию – что угодно. Мы теперь не ограничены тем, что нам дает 1С. Нам 1С не дало виджеты – да и ладно, сами напишем. Не дало push-сообщения – тоже сами напишем.
Но в 1С «ЗапускПриложенияМобильногоУстройства» доступен только на клиенте. Поэтому весь ряд задач мы должны разбивать на две части – клиент и сервер.
- К примеру, push-сообщения имеет смысл выполнять на сервере – например, когда у вас прошел обмен данными. А есть ли смысл выводить его на клиенте или нет? Ведь если человек на текущий момент работает с 1С, то это значит, что он, по сути, может и так увидеть сообщения.
- С другой стороны, toast-сообщение (это такое маленькое, всплывающее на экране сообщение) нет смысла выполнять на сервере. Например, у человека в кармане телефон, а тут ему приходит сообщение о том, что выполнен обмен с базой данных – он его не увидит, потому что такое сообщение показывается пару секунд буквально и не задерживается там. Но, если он в этот момент работает с 1С, мы можем ему, например, с помощью toast-сообщения сказать, что этого товара на остатке нет – и тогда это будет уместно. Не выскочит никакого модального окна на весь экран, которое надо судорожно закрывать, возвращаться к списку из 3000 позиций, которые загружаются пару секунд.
- А некоторые вещи, например, вибрация, - может быть и на клиенте, и на сервере.
- И звуковые оповещения – тоже на клиенте и на сервере.
К чему я веду? Зачем я разбивал это все на клиент и на сервер? Ответ простой – это принцип работы плагинов.
Мы, получается, пишем некое API, которое должно взаимодействовать с мобильным приложением 1С и на клиенте, и на сервере, чтобы мы могли его вызывать доступными методами в 1С. Кроме этого, мы обязательно должны получить от этих действий какой-то ответ (конечно, push-сообщение мы можем вывести и без ответа, но сделать фото – нам обязательно нужен ответ). Для этого API мы можем использовать два механизма, которые доступны в 1С. Это:
- Веб-сервер
- И Интенты – это и есть те самые намерения, которые мы с вами вызываем с помощью «ЗапускПриложенияМобильногоУстройства» из 1С. Но они доступны только на клиенте.
Для этих двух механизмов я здесь привел табличку.
Получается, что если мы на телефоне Android поднимем какой-то элементарный веб-сервер, то в этом случае мы сможем вызывать все то, что показано на предыдущем слайде, прямо с сервера: например, когда к нам с сервера приходят данные, мы можем сделать push-сообщение непосредственно через веб-сервер, установленный на самом телефоне.
- Кроме этого, получается еще дополнительная фишка – это внешний вызов, минуя 1С. Ведь когда мы говорим о том, что, например, пришло push-сообщение о новом заказе для торгового агента, мы подразумеваем, что у нас в этот момент запущена 1С и, как минимум, выполняется какой-то фоновый обмен данными с центральной базой. А если Android вдруг решит, что 30 Мб памяти для свернутого приложения – это много, то он может просто выкинуть 1С из своей памяти. А раз 1С не работает, обмен не выполняется, то и этого push-сообщения никто не получит.
- А если у нас на телефоне стоит веб-сервер, мы можем непосредственно с нашей центральной базы (если она находится в локальной сети, либо мы знаем четкий IP-адрес этого мобильного устройства) послать push-сообщение, оповестить виджет, сделать вибро- или звуковое оповещение. И теперь не мобильное приложение 1С будет постоянно опрашивать центральную базу, а сама центральная база будет отсылать сообщения только тем пользователям, которым необходимо.
Иначе база просто физически может задохнуться из-за того, что ее каждую минуту будет опрашивать большое количество пользователей (например, если у вас 1000 агентов бегает). Поэтому гораздо логичнее отсылать сообщения непосредственно из самой базы: произошло событие для конкретной группы людей (допустим, для 10 людей), и база послала эти данные туда. - Этот функционал 1С развили в 8.3.6 и сделали его более логичным, но он не всегда применим в таком контексте, потому что в этом случае - у вас должны все устройства иметь выход в интернет и должны быть подключены учетки Google.
Формы на Android
Многие не любят мобильную платформу 1С, в частности, из-за того, что у нее формы «кривые», так было в 8.3.5. В новой версии 8.3.6 - 1С основательно переработало формы, и теперь мы получили новый мобильный интерфейс и даже всякие мобильные плюшки. Мы с вами уже говорили о том, что можем вызвать фотокамеру и ею фотографировать. А что нам мешает нарисовать свою форму полностью на Android и вызывать ее из 1С? Не форму 1С, а свою форму, написанную на Android уже так, как мы хотим, по всем канонам Android. По сути, нам совершенно ничего не мешает.
Мы можем сделать для Android вот такую вот форму. Можем передавать туда данные из 1С, и при выборе какого-то товара забирать оттуда данные в 1С. Т.е. мы не ограничены только тем, что дает нам 1С. Опять таки, в стационарной версии мы привыкли, что если нам надо нечто этакое, то мы можем просто создать некий скрипт на vbs или js, и сделать некоторые действия. Но, почему-то, никто не думает, что то же самое можно сделать и в мобильной 1С. Ах ну да, все потому что - у вас, скорее всего, просто нет андроид программиста :)
Линейка складских терминалов на платформе Android
Более подробно про терминалы - вы можете узнать тут - http://acode.pro/.
Кроме этого, стоит вопрос о том, на чем работать. Многие люди говорят: «давайте мы для склада вместо терминала возьмем телефон и сканер bluetooth». Или: «давайте мы будем сканировать, делать инвентаризацию 10 тысяч товаров на пяти паллетах видеокамерой телефона, ведь 1С это позволяет». Переубеждение этих людей ничего не дает до тех пор, пока они сами не попробуют это сделать.
Но на данный момент рынок терминальных устройств начинает развиваться – как видите, появился уже ряд моделей терминалов на Android версии 4.0, 4.1, 4.2.
И по этому пути идут все современные компании, которые занимаются производством оборудования - Motorola, Honeywell, Datalogic, Cipherlab. Однако, стоимость их устройств на Андроиде - далеко за 1000$, а те которые не очень далеко за 1000$ - очень слабые для полноценной работы 1С.
Однако, в этой категории присутствуют и достаточно бюджетные модели, которые далеко не за 1000 долларов, а в районе 500, 700, 800. Это адекватные цены, адекватное оборудование, адекватно работает с 1С. Вы можете разрабатывать свои оригинальные решения и стать первыми на этом рынке – все для этого уже есть: информации на тему мобильной платформы в Интернете уже много, терминалы на Android уже есть, значит, можно приступать к работе.
Acode Tools – расширение возможностей мобильной платформы 1С
А чтобы подстегнуть ваше желание работать, я предлагаю вам обратить внимание на Acode Tools:
Acode Tools - позволяет из 1С делать все то, что я здесь написал, и даже больше. Вы можете скомпилировать свой произвольный код, написанный на Android, передать параметры из 1С и получить оттуда ответ. Как видите, это сделать вполне реально. И убедиться в этом вы можете сами. Там вам доступны:
- Виджеты;
- Push-сообщения;
- Вибро;
- Работа с Bluetooth-сканерами в режиме Serial Port (поддерживается Motorola и Cipherlab). Не надо мучиться с тем, что у 1С баг с активными элементами (в последних версиях платформы мы не можем указать активность элементов), и нам приходилось что-то придумывать, когда нам надо было вернуть активность поля, чтобы просканировать туда товар (или сидеть на платформе 8.3.4.17, где этого бага еще не было). Пожалуйста – подключились через серийный порт и работаем.
- Проигрывание звуков;
- GPS-трекинг. Как известно, 1С в Android запускается не как сервис, поэтому иногда она вылетает. И если она вылетает, то, соответственно, в этот момент весь GPS-трекинг у нас обрывается, и из-за этого мы можем получить координаты только с того момента, когда 1С работало (только после того, как Android решил ее выкинуть). В данном случае работает специальная программа, которая поднимает свой фоновый сервис, поэтому выключить ее просто так не получится (только если жестко остановить). Кроме этого, на эту программу не работает fake location (псевдо геоданные).
- Также доступна запись данных в logcat. Я думаю, многие из тех, кто разрабатывает под мобильную платформу, долго расстраивались, что нереально отловить какие-то данные в серверных процедурах (в тех, которые выполняются в контексте &НаСервере). Теперь мы можем просто записать данные в logcat и в той же программе открыть и посмотреть, что сейчас выполняется, и какая отладочная информация там есть.
- Работа с FTP;
- Возможность заархивировать файлы в ZIP. Кстати говоря, напоминаю, что XSLX-файл (файл формата Microsoft Excel 2007) – это, по сути, ZIP-архив, и благодаря функции ZIP-архива вы можете создавать свои XSLX-файлы. И соответственно, обмениваться ими так, как вашей душе будет угодно.
- Работа с NFC;
- И т.д. (подробнее на слайде)
Все то, что вы здесь видите, работает в двух ключах: в варианте клиента (через запуск Интентов), и в варианте работы через веб-сервер. Например, если у вас есть два телефона, вы можете поставить на них эту программку, в каждом из них прописать IP-адрес другого телефона и его ID (там для этого есть специальная опция), и таким образом сможете посылать push-сообщения (или вибро) с одного телефона на другой. И это реально – это не миф.
Поэтому - хочу еще раз напомнить про андроид программиста - он вам однозначно нужен, и тут - без вариантов. Либо пусть ваши 1С программисты проходят курсы по андроиду,
P.S. И отдельно хочу добавить, что мобильный мир не ограничивается только мобильной платформой, потому что в стационарной платформе делают тоже новые функции, которые помогают "влиться" в существующий мир мобильных решений. Например, если нужно сделать отчет для руководителя, то необязательно его делать на 1С, есть куча уже готовых решений, которые нацелены именно на визуальзацию данных, а не на их обработку. Например, можно использовать Microsoft Power BI.
**************
Данная статья написана по материалам доклада, прочитанного автором на Конференции Инфостарта IE 2014 29-31 октября 2014 года.
Приглашаем вас на новую конференцию INFOSTART EVENT 2019 INCEPTION.