Разработка мобильных
приложений на
1С:Предприятие 8.3
Модуль 4
Исследование новых объектов в мобильной
платформе
Проект Курсы-по-1С.рф
2016
Курсы-по-1С.рф Профессиональные курсы по 1С
по всей России, в любое время
Оглавление
Мультимедиа. Сканирование штрих-кодов ......................................................................................................... 4
Сканирование штрихкодов. Android ..................................................................................................................... 5
Менеджер контактов .............................................................................................................................................. 6
СредстваТелефонии................................................................................................................................................ 8
Электронная почта ................................................................................................................................................ 10
Календари ............................................................................................................................................................. 11
Геопозиционирование ......................................................................................................................................... 20
Уведомления ......................................................................................................................................................... 27
Глобальные уведомления .................................................................................................................................... 34
Сервис GCM ....................................................................................................................................................... 34
Сервис APN ........................................................................................................................................................ 41
Сервис уведомлений от 1С............................................................................................................................... 41
Нововведения в интерфейсе ............................................................................................................................... 41
Приложение 1. Маска ввода ................................................................................................................................ 42
Домашнее задание ................................................................................................................................................... 45
Задание 4.1 Маршрут ........................................................................................................................................... 45
Задание 4.2 Журнал звонков ............................................................................................................................... 46
Страница 2 из 46
Как было сказано ранее, у мобильной платформы есть ряд новых объектов, которые позволяют
взаимодействовать как с программным обеспечением, так и с аппаратной начинкой устройства. В
предыдущем модуле были исследованы только два объекта:
Страница 3 из 46
Пройдемся поэтапно и определим с точки зрения кода, что нам дает реализовать сама 1С.
Основная функция – это показ результат сканирования, в котором есть четыре параметра:
заголовок, подписка на событие сканирования, подписка на событие закрытия окна сканирования,
последний параметр отвечает за то, какие штрихкоды вы хотите сканировать (одномерные,
двумерные или и те, и другие).
Как видите, тут есть четыре параметра. В первом – само значение штрих-кода, второй и третий
параметр связаны: третий параметр позволяет вывести некое сообщение на окно сканирования, а
Результат позволяет определить, каким цветом это сообщение будет выдано – красным (Ложь) или
зеленым (Истина), т.е. эти параметры мы сами задаем. Ну а последний параметр – это обычный
параметр для подписок.
Ну и вторая подписка, которая вызывается только один раз, при отмене сканирования, выглядит вот
так:
Процедура ОбработкаОтказаСканирования(Сообщение)
Сообщить(Сообщение)
КонецПроцедуры
Страница 4 из 46
Тут, в параметр функции мы получаем то сообщение, которое мы указали третьим параметром при
определении подписки ОпОтказСканирования, т.е. в нашем случае – это будет просто строка "Отказ
сканирования".
Вот и все, что мы можем сделать с функциями, которые нам предоставляет 1С.
Или нужно четко понимать, какой тип был просканирован, вдруг используется УТ10, и есть такие
штрих-коды, которые по значению идентичны, но у них разные типы?
Для полноценной работы нам нужно мобильное приложение Zxing. Кстати говоря, именно эту
библиотеку использует и 1С для обработки штрих-кодов, однако 1С сканирует в среднем хуже, чем
это приложение отдельно.
Если мы пытаемся сделать то, что нам позволяет сделать 1С, но средствами Android, то мы почти
всегда получаем немного больше, так и в этом случае.
А что если требуется уметь генерировать штрихкоды? А почему бы и нет, ведь это хороший способ
обмена информацией между разными устройствами. Например, на одном устройстве открывается
документ, собирается товар, и теперь руководитель может просто просканировать со своего
устройства штрих-код, сгенерированный на нашем устройстве, и таким образом провести документ,
а не искать его в списке. Или просто обмен любой текстовой информацией между устройствами без
наличия сети между ними. Ну и как самый последний вариант – это генерация штрих-кода с
дальнейшей его распечаткой.
Страница 5 из 46
Менеджер контактов
Менеджер контактов – это новый объект в 1С, который отвечает за работу с контактами. Т.е.
создание, поиск, редактирование, удаление и т.д. Вначале давайте попробуем ответить на вопрос:
для чего может пригодиться этот объект?
1. Получить учетные записи телефона. Что это такое и где их найти? Все просто: если зайдем в
настройки телефона (в Android до 5 версии) или в настройки телефона Аккаунты, то увидим вот
такой список:
Это и есть учетные записи устройства. Именно к ним и прикрепляются контакты. Ну и есть еще одна
– Локальная Учетная Запись. Так как чаще всего именно она и используется, то 1С, вероятнее всего,
вывели специальную функцию для её получения – ПолучитьЛокальнуюУчетнуюЗаписьКонтактов(). Это
запись, которая есть по умолчанию везде, и именно ей присваиваются все созданные контакты, если
вы не создали аккаунты или не указали их.
В ответ мы получаем массив учетных записей, с которым нам делать особо нечего.
2. Можно найти некий контакт, однако тут надо понимать, что в случае с поиском контактов, мы в
ответ получаем не сам контакт, а его ЛокальныйКлюч. Что такое ЛокальныйКлюч? Обратимся к
справке 1С:
Страница 6 из 46
ЛокальныйКлючКонтакта (LocalContactKey)
Описание:
Ключ, используемый для получения или изменения данных контакта в мобильном устройстве.
Доступность:
Мобильное приложение(клиент).
МК = Новый МенеджерКонтактов;
Сообщить("Всего найдено: " + МК.ПолучитьКоличествоКонтактов() + " контактов");
НайденыеКонтакты = МК.НайтиКонтакты();
Для Индекс = 0 По НайденыеКонтакты.Количество() – 1 Цикл
ЛокальныйКлюч = НайденыеКонтакты[Индекс] ;
Контакт = МК.ПолучитьКонтакт(ЛокальныйКлюч);
Если ЗначениеЗаполнено(Контакт.ДанныеКонтакта.Имя) Тогда
Сообщить("Имя : " + Контакт.ДанныеКонтакта.Имя);
КонецЕсли;
КонецЦикла;
На что здесь следует обратить внимание? Во-первых, мы должны определить менеджер контактов,
далее – найти контакты при помощи метода:
НайденыеКонтакты = МК.НайтиКонтакты();
В ответ получаем массив локальных ключей контактов, и только потом при помощи этого ключа мы
можем получить сами контакты:
Контакт = МК.ПолучитьКонтакт(ЛокальныйКлюч);
Самое печальное тут то, что мы не можем понять и как-то идентифицировать, сохранить и т.д. этот
самый локальный ключ. Т.е. если мы посмотрим на переменную ЛокальныйКлюч в момент её
определения, то увидим только тип данных, который нельзя ни поместить в хранилище, ни
сериализовать.
Теперь сделаем один важный промежуточный вывод – с контактами надо работать только в текущей
сессии, их не надо хранить в базе, делать соответствия между контрагентом и ключом его данных.
Почему? Существуют некоторые подозрения, которые связаны с тем, как в Android получают
контакт. В прошлом модуле мы рассматривали контент-провайдеры: как выглядит ссылка на
контактные данные, а именно – что в ней есть только номер контакта, который в разные моменты
времени может принадлежать теоретически разным контактам. Вероятно, поэтому в 1С так и
сделали, чтобы у программистов не было соблазна хранить столь непостоянную информацию в
базе.
3. Получив контакт, можем его изменить или даже удалить. Тут говорить особо не о чем.
4. А вот создание контакта стоит немного прояснить. Так как именно тут мы и применяем метод
получения учетной записи устройства, и именно к нему мы и привязываем этот контакт.
Создание контакта выглядит следующим образом. Вначале необходимо создать новый объект:
Страница 7 из 46
Этот объект описывает всю информацию о контакте, например, имя, номер телефона, почту и т.д.
Следует обратить внимание на то, что номера телефонов (и не только) – это массивы, и массивы не
просто самих номеров (значений номеров), но и вида номера (мобильный, домашний и т.д.).
Поэтому если мы хотим добавить номер телефона, то делать это нужно так:
После того, как мы заполнили все данные, нужно опять определить менеджер контактов, так как
через него мы должны получить запись устройства, в нашем случае – это локальная запись, но
можно использовать и запись Google аккаунта устройства, так как иначе вы ее можете и не увидеть
(зависит от настроек телефона).
МК = Новый МенеджерКонтактов;
НовыйКонтакт = Новый ДанныеКонтактаУчетнойЗаписи(ДанныеКонтакта,
МК.ПолучитьЛокальнуюУчетнуюЗаписьКонтактов());
МК.ДобавитьКонтакт(НовыйКонтакт);
И после того, как создан новый контакт учетной записи, добавляем его в менеджер контактов.
Идеальным был бы вариант, если бы была возможность создавать учетную запись от приложения
1С. Тогда мы могли бы привязывать к ней все контакты, и в случае удаления 1С удалялись бы все
контакты, кроме этого, тогда видно было бы, откуда взялся этот контакт и т.д. Вот, например, как это
делает Viber или Skype: установили, подключили – контакты есть, удалили – контактов нет. Но,
может, такой функционал появится в будущем, поэтому – будем ждать.
СредстваТелефонии
СредстваТелефонии – еще один новый объект в 1С, который отвечает уже именно за операции
телефонии, т.е. звонки, SMS и т.д.
Начнем со звонков.
Страница 8 из 46
Тут все очень просто: проверяем, есть ли вообще смысл набирать номер (может, мы с планшета
работаем, где модуля связи вообще нет), а после этого набираем нужный номер, причем в двух
режимах:
1. Выводим окно с набором номера (мы уже такое с вами делали средствами Android, но не
одним же Android’ом пользуются, поэтому лучше все-таки использовать данную функцию)
2. Непосредственный набор. А вот эту функцию советуем вообще никогда не использовать!
Почему? Все очень просто: может случиться такая ситуация, что вы набрали номер случайно,
причем номер может быть коротким, а может, вы просто случайно нажали кнопку вызова в 1С,
в этом случае произойдет следующее: Android начнет делать вызов, в фоне будет уничтожать
1С, так как она на слабых устройствах отъедает много памяти, а в этот момент идет еще
работа с модулем телефонии, в общем, пока телефон будет «тормозить» уже может пройти
секунд 10, прежде чем удастся сбросить вызов. А в случае открытия окна набора – Android
сможет спокойно убить приложение 1С, отобразить окно с номером, и пользователь без
проблем может или отменить вызов, или набрать клиент.
Кроме того, что 1С умеет звонить, 1С умеет еще и отправлять SMS, и даже их получать. Вот таким
простым кодом можно отправить SMS с телефона пользователя, причем опять-таки в двух режимах,
как с уведомлением пользователя, так и без его уведомления:
СМС = Новый SMSСообщение();
СМС.Текст = ТекстСМСДляОтправки;
СМС.Получатели.Добавить(НомерПолучателя);
СредстваТелефонии.ПослатьSMS(СМС, ВидОтправкиСМС);
&НаКлиенте
Процедура ПолучениеСообщения(Сообщение, ДополнительныеПараметры) Экспорт
ОтправительСМС = Сообщение.Отправитель;
КоличествоВложенийСМС = Сообщение.Вложения.Количество();
ДатаПринятогоСМС = Сообщение.ДатаПолучения;
ТекстПринятогоСМС = Сообщение.Текст;
КонецПроцедуры
Необходимо обратить внимание на то, что мы можем получать даже вложения MMS, и
обрабатывать их. Кстати, вложения состоят из самих данных, и отдельно можно получить тип
данных – MIME тип. Тут же можно добавить, что 1С не умеет читать SMS, которые пришли вне
включенной подписки. Т.е. прочитать все ваши SMS 1С не сможет – только те, которые будут
приходить в тот момент, когда 1С включит режим подписки на прием SMS.
Страница 9 из 46
Электронная почта
Работа с электронной почтой, в данном случае подразумевает работу с объектом
ИнтернетПочтовоеСообщение. По большому счету этот объект является универсальным как для
стационарной 1С, так и для мобильной. Разница лишь в том, что в мобильной появился еще один
новый объект:
СредстваПочты (MailTools)
Методы:
ПоддерживаетсяОтправка (SendingSupported)
Послать (Send)
Описание:
Менеджер средств встроенной почты мобильной платформы.
Доступность:
Мобильное приложение(клиент).
В чем же принципиальное отличие от привычного нам объекта – ИнтернетПочта? Все очень просто:
чтобы отправить письмо старым способом, нам необходимо указать авторизационные данные, что
делать в случае с мобильной платформой иногда не имеет смысла. Почему? Потому что у вас с
вероятностью 99% уже установлена некая почта, она просто обязана быть, чтобы вы могли
пользоваться Google Play, но вот на WinPhone ее нужно подключать. Поэтому возникает резонный
вопрос: если у меня уже есть подключенная почта и я хочу через нее отправлять данные, то почему
бы ее не использовать?
Очевидно в 1С подумали так же и реализовали отдельный объект. Выглядит это вот так:
Т.е. вначале мы спрашиваем систему, поддерживает ли она отправку почты таким образом. Если да,
то формируем сообщение и отправляем. В момент отправки нужно будет определиться, при помощи
чего отправить письмо, после этого откроется программа с письмом, и мы должны будем сами
отправить его.
Страница 10 из 46
НовВз.Тип = "text/plain";
НовВз.Приложение = "com.google.android.gm";
НовВз.ИмяКласса = "com.google.android.gm.ComposeActivityGmail";
Календари
С календарями все намного интереснее и сложнее. Большинство пользователей не используют
календари, в основном, по трем причинам:
Для начала определимся – что такое календарь? Календарь – это некий аналог записной книжки, в
которую можно вносить разные события, как повторяющиеся, например, проверку релизов 1С, так и
однократные, например, встречу с клиентом или просто созвон с ним.
Но календари – это не просто записная книжка, так как, во-первых, они могут синхронизироваться
между разными устройствами, что логично и понятно, во-вторых, вы можете создавать как личные
календари, так и общие.
Страница 11 из 46
Например, у меня есть напарники, и у нас с ними есть общий календарь встреч с клиентами, т.е.
любой из нас пишет туда, когда, где и с кем встреча, и остальные это видят. С другой стороны, у
меня есть календарь планирования встреч. Т.е. я туда фиксирую только факт того, что в этот
промежуток я буду занят, и ключевые клиенты имеют доступ к этому календарю, они его открывают,
смотрят, когда я свободен, планируют встречу и потом звонят мне с четким понимаем того, когда я
свободен, и просто ставят перед фактом – вот тогда и тогда у нас с вами встреча. После этого я
вношу встречу в календарь (а некоторые клиенты могут и сами вносить встречи) и все остальные
понимают, что в назначенное время я занят.
Данные в календарь могут вноситься и считываться как из мобильной 1С, так и со стационарной, и
даже обычными календарями на телефоне или через браузер.
МК = Новый МенеджерКалендарей;
МассивУчеток = МК.ПолучитьУчетныеЗаписиКалендарей();
Страница 12 из 46
Как видите, тут не только календари, это все те же аккаунты на вашем устройстве, просто
потенциально каждый из них может быть календарем. Но в 1С есть отдельная команда, которая
позволит нам получить именно календари:
МК = Новый МенеджерКалендарей;
СписокКалендарей = МК.НайтиКалендари();
Каждый из этих календарей имеет набор свойств, они представлены на этом скриншоте:
Страница 13 из 46
1. Локальный ключ календаря – по нему мы можем внутри системы определить, что это за
календарь, это, по сути, UID календаря
2. Данные календаря – тут описывается информация о том, кому принадлежит календарь, и его
цвет. Эта же информация дублируется и в графе ИсходныеДанные. Разница в том, что в этой
графе находятся исходные данные в том виде, в каком их дает сама система, а вот уровень
выше – это уже конвертированные данные в виде 1С.
3. Ну и учетные записи – в них находится информация о том, к какой именно учетной записи
привязан данный календарь.
Страница 14 из 46
Как видите, в случае iOS реквизиты Цвет и Имя остались, а вот в исходных данных система нам
дает намного больше информации. Поэтому если вы планируете использовать данные из этой
области, то тогда учитывайте, что на разных ОС они разные. А вот те, что дает 1С – одинаковые.
Календари без возможности работать с событиями не имеют смысла. Разве что кроме ситуаций,
когда нам нужно только получать данные. И вот тут возникает вопрос: как узнать, можно
редактировать календарь или нельзя?
Страница 15 из 46
МК = Новый МенеджерКалендарей;
Локаль = ПолучитьЛокальныйКлючПоИмени(ИмяКалендаря);
ПроверкаДоступаКИзменению = МК.ПоддерживаетсяИзменениеСобытий(Локаль);
В результате данных действий мы получим ответ Да или Нет, т.е. поддерживается изменение
календаря, или же нам доступен только режим чтения.
И вот тут мы наблюдаем первое неудобство, которое заключается в том, что мы не можем просто
так взять и проверить календарь, так как все операции делаются с локальным ключом, который
невозможно нигде толком сохранить или получить. Поэтому требуется каждый раз по имени
календаря получать его локальный ключ и только после этого – проверять доступность работы с
календарем:
&НаКлиенте
Функция ПолучитьЛокальныйКлючПоИмени(Имя)
МК = Новый МенеджерКалендарей;
НайденныеКалендари = МК.НайтиКалендари(Имя);
Если НЕ НайденныеКалендари.Количество() Тогда
Возврат Неопределено;
Иначе
Возврат НайденныеКалендари[0]
КонецЕсли;
КонецФункции
Страница 16 из 46
Страница 17 из 46
Страница 18 из 46
Как видите, ИсходныеДанные отличаются между системами, а вот общие данные, которые
конвертирует 1С, идентичны.
Тогда возникает следующий вопрос: как их создавать? Посмотрим на пример простейшего варианта
создания события:
Страница 19 из 46
Итого требуется создать новый объект – данные события календаря, обязательно указать период,
указать тему и описание, и добавить событие в менеджер календарей.
МК = Новый МенеджерКалендарей;
ВсеСобытия = МК.НайтиСобытия(,ПолучитьЛокальныйКлючПоИмени(ВыбранныйКалендарь));
КоличествоСобытийКалендаря = ВсеСобытия.Количество();
Т.е. вызывая метод НайтиСобытия, мы получаем все события, а если нам нужно, то можем сделать
и отборы, они передаются первым параметром:
Тема(Subject)
Начало(Start)
Конец(End)
Место(Location)
Описание(Description)
ВесьДень(AllDay)
Организатор(Organizer)
ЧасовойПояс(TimeZone).
Геопозиционирование
Что такое геопозиционирование? Это всего лишь определение ваших координат, и ничего более.
Т.е. обычно, когда кто-то, кто ранее с геопозиционированием не работал «изнутри», слышит это
слово, то сразу представляет себе карту с данными, с которыми можно производить действия.
Страница 20 из 46
Однако, в реальности геопозиционирование – это всего лишь получение координат, и ничего более.
А вот как и где их отобразить – это уже отдельная тема.
Получить координаты можно из разных источников, таких как GPS, сетевые вышки и т.д. И источник,
даже правильнее будет сказать – определитель, координат называется провайдером.
Т.е. у нас есть несколько провайдеров, по которым мы можем определить наши координаты. Раз их
несколько, то значит, между ними есть какая-то разница, это логично, иначе достаточно было бы
одного. Основная разница между ними – это сотношение точности определения координат к
потребляемой мощности.
Чудес не бывает, поэтому самый точный провайдер потребляет больше энергии батареи, причем
зависимость нелинейная, т.е. при увеличении потребляемой энергии в несколько раз, точность
может увеличиться незначительно.
Получить список доступных провайдеров (обратите внимание: именно доступных, а не всех, которые
есть на устройстве) можно при помощи следующего кода:
Провайдеры = СредстваГеопозиционирования.ПолучитьПровайдеров();
Для Каждого Провайдер Из Провайдеры Цикл
Сообщить(Провайдер.Имя);
КонецЦикла;
Этот код выведет имена доступных провайдеров. Что значит доступных – рассмотрим в видеоуроке.
А пока идем дальше – получили провайдеров, но что это за провайдеры? Из названия ясно, что GPS
– это навигация по спутникам, а вот Cell/network – по сети.
Страница 21 из 46
GPS – работа ведется с GPS, со спутниками. Плюсы – не нужен интернет (но может использоваться
если есть), высокая точность (до единиц метров на открытой местности и несколько хуже в
застройке); минусы – большое энергопотребление и низкая скорость получения координат, старт
может быть очень долгим.
Network/Cell – получаем координаты через интернет. Причем неважно, будет это мобильный
интернет или Wi-Fi. Плюсы – быстро определяет координаты, не нужен включенный GPS. Если
интернет все равно нужен, например, для синхронизации, то можно считать, что минусов нет, хотя
точность будет хуже, чем у gps.
Но когда, что и как выбирать? Т.е. есть же телефоны и без GPS, или GPS может быть выключен –
как выбрать самый точный провайдер? Или наоборот, самый экономный, ведь в случае, если речь
идет о маршруте на машине, то +\- 50 метров значения не имеют . И тут мы можем использовать
специальные методы в 1С:
СамыйТочный = СредстваГеопозиционирования.ПолучитьСамогоТочногоПровайдера();
Если ЗначениеЗаполнено(СамыйТочный) Тогда
Сообщить("Самый точный:" + СамыйТочный.Имя);
Иначе
Сообщить("Не найден точный провайдер!");
КонецЕсли;
СамыйЭкономный =
СредстваГеопозиционирования.ПолучитьСамогоЭнергоЭкономичногоПровайдера();
Если ЗначениеЗаполнено(СамыйЭкономный) Тогда
Сообщить("Самый экономичный:" + СамыйЭкономный.Имя);
Иначе
Сообщить("Не найден экономный провайдер!");
КонецЕсли;
Страница 22 из 46
Впрочем, ничего неожиданного, однако если бы GPS был выключен, то самым точным провайдером
был бы Cell. А вот если бы навигация была выключена на устройстве, то на всех ОС вернулось бы
Неопределено. И даже на Android. В случае Android нам был бы доступен провайдер passive, но он
буферный, поэтому по нему мы не можем обновить координаты.
Перейдем к теме получения координат. Координаты можно получить двумя путями:
1. Получить текущее местоположение
2. Получить последнее местоположение.
В чем разница: получая текущее местоположение, мы обновляем координаты, т.е. опрашиваем
спутники или сеть, а это требует дополнительного времени и энергии от батареи. Однако каждый
провайдер хранит в себе последние полученные координаты и дату их обновления. Таким образом,
если не нужно получать координаты с интервалом 5 секунд, то можно просто получить последние
координаты из провайдера, посмотреть время, и если нас устроит интервал, то применить их. А
откуда они там берутся? Ну все просто, есть множество программ, которые постоянно опрашивают
ваше местоположение, например, навигаторы. Поэтому нет смысла постоянно дополнительно
опрашивать местоположение, если это уже делает другая программа.
Обратимся к коду:
Провайдеры = СредстваГеопозиционирования.ПолучитьПровайдеров();
Для каждого Провайдер Из Провайдеры Цикл
Данные =
СредстваГеопозиционирования.ПолучитьПоследнееМестоположение(Провайдер.Имя);
Если НЕ ЗначениеЗаполнено(Данные) Тогда
Сообщить("Не удалось получить координаты!");
Возврат;
КонецЕсли;
КонецЦикла;
Страница 23 из 46
Или, если мы хотим получить последние координаты, нужно выполнить такой код:
Провайдер = СредстваГеопозиционирования.ПолучитьСамогоТочногоПровайдера();
Если СредстваГеопозиционирования.ОбновитьМестоположение(Провайдер.Имя,"10") Тогда
Сообщить("Данные получены!");
иначе
Сообщить("Ошибка обновления данных!");
КонецЕсли;
Обратите внимание на последний параметр – он ставит таймаут на получение координат, так как
данные со спутника программа может получать очень долго, причем не факт, что получит, особенно,
если вы находитесь в помещении. Так что при тестировании GPS обязательно подходите к окну,
иначе может ничего не произойти.
Когда мы с вами разобрались с тем, как получить координаты, надо понять, как их можно
отобразить.
&НаКлиенте
Процедура СформироватьСписокКоординат(Команда)
ПоказатьНаКарте(СформироватьСписокКоординатНаСервере());
КонецПроцедуры
&НаСервере
Функция СформироватьСписокКоординатНаСервере()
Показать на карте можно список значений, выглядеть это будет на Android вот так (учтите, в
скомпилированной версии приложения, если вы не указали ключ API функций работы с Google
картами, это работать не будет):
Страница 24 из 46
Но получать координаты по одной – затея не очень удобная, именно поэтому, если необходимо
собрать трек, лучше всего использовать специальную функцию, которая для этого и предназначена:
Страница 25 из 46
&НаКлиенте
Процедура ВключитьАвтоЗаписьКоординат(Команда)
Провайдер = СредстваГеопозиционирования.ПолучитьСамогоТочногоПровайдера();
Оп = Новый ОписаниеОповещения("ОбработкаОповещенияПровайдера",ЭтаФорма, "Некая
строка");
СредстваГеопозиционирования.ПодключитьОбработчикИзмененияМестоположения(Оп,
Провайдер.Имя, 100,10);
КонецПроцедуры
&НаКлиенте
Процедура ОбработкаОповещенияПровайдера(ИмяПровайдера,ДанныеМестоположения,
ДопПараметр) Экспорт
ЗаписатьПуть(ДанныеМестоположения);
КонецПроцедуры
&НаКлиенте
Процедура ОтключитьАвтоЗаписьКоординат(Команда)
СредстваГеопозиционирования.ОтключитьОбработчикИзмененияМестоположения();
КонецПроцедуры
Итак, что мы делаем в этом коде? Во-первых, создаем оповещение, в котором указываем, какая
процедура будет слушать изменение координат. А далее уже – подключаем обработчик изменения
местоположения. И тут обратите внимание на последние два параметра. Эти параметры ставят
ограничение на обновление координат, а именно:
Это все значит, что если мы поставим ограничение в 1 км, то функция отработает событие, только
если преодолеть расстояние более 1 км от последней полученной точки. А таймаут – это частота, с
которой будет обновляться провайдер. Причем провайдер могут обновлять и другие приложения, не
забывайте об этом.
Ну и самое последнее, что осталось, – это возможность получить координаты по адресу и адрес по
координатам, однако для работы этой функции необходим интернет. Посмотрим на примеры того,
как работать с этими функциями:
&НаКлиенте
Процедура ПоискАдресаПоКоординате()
Адрес = ПолучитьАдресПоМестоположению(Новый ГеографическиеКоординаты(Широта,
Долгота));
Сообщить(?(Адрес = Неопределено, "Не удалось получить адрес",
Адрес.Представление));
КонецПроцедуры
Страница 26 из 46
&НаКлиенте
Процедура ПолучитьКоординатыПоАдресу()
Структура = Новый
Структура("Страна,Регион,Город,Улица,Дом,Индекс,Представление","Россия","","Санкт-
Петербург г","Добровольцев ул","1","190000","190000, Санкт-Петербург г, Москва, Добровольцев ул,
дом № 1");
Адрес = Новый ДанныеАдреса(Структура);
Координаты = ПолучитьМестоположениеПоАдресу(Адрес);
Если Координаты = Неопределено Тогда
Сообщить("Не удалось получить координаты");
Иначе
ПоказатьНаКарте(Координаты);
КонецЕсли;
КонецПроцедуры
Ничего сложного, однако есть неудобства, такие как доступ к интернету и доступность только на
мобильном устройстве. Хотя, если бы адреса или координаты можно было получать на
стационарной 1С, это было бы не плохим дополнением.
Уведомления
С недавних пор в 1С появился новый механизм – это механизм уведомлений. Проще всего его
представить в виде будильника с напоминанием для себя – это локальные уведомления, либо SMS
от друга – это глобальное уведомление.
Зачем нужны локальные уведомления? Специфика мобильных ОС такова, что как только вы из
приложения выходите, это приложение как бы «замораживается», в случае iOS – так вообще
помещается в «криогенную камеру», так как оно не работает, пока находится в неактивном
состоянии. Однако 1С – это такое приложение, которое требует работы с периодическими задачами,
например, синхронизацией, но если приложение находится в стазисе, то оно не может просто само
себя вызвать, поэтому устанавливается специальная служба, которая может периодически «будить»
1С.
Страница 27 из 46
Но есть еще и глобальные уведомления. Отличие их от локальных в том, что они отправляются
извне, например, со стационарной 1С. Когда это нужно? Представим себе, что у нас 500 торговых
агентов, и нам нужно настроить с ними синхронизацию документов и остатков.
Вместо этого можно настроить механизм таким образом, чтобы центральная база проверяла, для
каких торговых есть изменения, и оповещала их устройства о том, что необходимо сделать
синхронизацию.
Как выглядит работа с локальными уведомлениями? Все очень просто: нужно создать вначале
уведомление, а потом добавить его к локальным.
&НаКлиенте
Процедура ЛокальноеУведомление(Команда)
Уведомление = СоздатьУведомление();
ДоставляемыеУведомления.ДобавитьЛокальноеУведомление(Уведомление);
КонецПроцедуры
&НаКлиенте
Функция СоздатьУведомление()
Уведомление = Новый ДоставляемоеУведомление;
Уведомление.Заголовок = ЗаголовокСообщения;
Уведомление.Текст = Текст;
Уведомление.Данные = Данные;
Уведомление.ДатаПоявленияУниверсальноеВремя = ?(ДатаПоявления = Дата(1,1,1),
УниверсальноеВремя(ТекущаяДата()) + 10, ДатаПоявления);;
Уведомление.ИнтервалПовтора = ИнтервалПовтора;
Уведомление.ЗвуковоеОповещение = ЗвуковоеОповещение.ПоУмолчанию;
Уведомление.Наклейка = 1;
Возврат Уведомление;
КонецФункции
Но так как это уведомления, то они отображаются только в том случае, если вы сейчас не
работаете с 1С, т.е. или приложение свернуто, или же экран заблокирован.
Страница 28 из 46
Страница 29 из 46
Страница 30 из 46
На экране уведомлений:
Но, если вы обратили внимание, есть еще и такой параметр, как наклейка. Наклейка – это число, и
проявляется оно вот в таком виде на Android:
Кроме этого, мы можем задавать периодичность уведомлений, но не чаще, чем раз в минуту.
Подробнее про интервал можно почитать в справке 1С, на удивление, там написано все достаточно
четко и понятно.
Страница 31 из 46
Кроме этого, мы можем и просто так устанавливать наклейки, без уведомлений. И даже получать их
значение:
&НаКлиенте
Процедура УстановитьНаклейку(Команда)
ДоставляемыеУведомления.УстановитьНаклейку(Наклейка);
КонецПроцедуры
&НаКлиенте
Процедура ПолучитьТекущуюНаклейку(Команда)
ТекНаклейка = ДоставляемыеУведомления.ПолучитьНаклейку();
КонецПроцедуры
Допустим, в наклейке можно указывать количество задач, которые надо закрыть агенту, или
документов сбора, которые надо собрать кладовщику, ну и т.д.
ДоставляемыеУведомления.ОтменитьЛокальныеУведомления();
Однако стоит еще раз отметить, что уведомления – это не push сообщения!
А раз это не push сообщения, то, значит, у них другой функционал. И самый приближенный объект
из уже знакомых нам, это:
Т.е. у нас есть некая процедура, которую мы запускаем с неким интервалом или же однократно, и за
счет того, что у нас есть дата, с какого момента начать оповещение, оповещения взяли еще немного
от регламентных заданий. Ну и плюс они выполняются в фоне.
А значит, нужно уметь обрабатывать вызовы. Выполняется это при помощи следующего кода:
&НаКлиенте
Процедура ПодключитьОбработчикУведомлений(Команда)
Оп = Новый ОписаниеОповещения("ОбработчикЛокальныхУведомлений", ОбщиеФункции,
"Этот обработчик вызван из формы");
ДоставляемыеУведомления.ПодключитьОбработчикУведомлений(Оп);
КонецПроцедуры
Страница 32 из 46
&НаКлиенте
Процедура ОтключитьОбработчикУведомлений(Команда)
Оп = Новый ОписаниеОповещения("ОбработчикЛокальныхУведомлений", ОбщиеФункции);
ДоставляемыеУведомления.ОтключитьОбработчикУведомлений(Оп);
КонецПроцедуры
В общем модуле ОбщиеФункции, клиентском и неглобальном, вот такая функция, но она может быть
и в форме:
&НаКлиенте
Процедура ОбработчикЛокальныхУведомлений(Уведомление,Локальное,Показано, ДопПараметр)
Экспорт
ТекстСообщения = "";
ТекстСообщения = ТекстСообщения + "Дата: " + ТекущаяДата() + Символы.ПС;
ТекстСообщения = ТекстСообщения + "Вызов из: " + ДопПараметр + Символы.ПС;
ТекстСообщения = ТекстСообщения + "Текст: " + Уведомление.Текст + Символы.ПС;
Следует обратить внимание на то, что если подключено несколько обработчиков, то доходить
оповещение будет только в первый подключенный – это первое, и второе – все пропущенные
оповещения придут сразу, как только вы объявите функцию их обработки.
Отдельно стоит поговорить про звуковое оповещение, как вы заметили – у оповещений есть такой
параметр как ЗвуковоеОповещение, и он может иметь два значения, которые соответствуют
стандартному сигналу на устройстве, или же без звукового оповещения. Однако этот параметр
может быть и строкой, в этом случае нужно прикрепить звуковые файлы к компилированному
приложению и указать строкой их полное имя. Этот подход не работает в мобильной платформе для
разработчика, это ограничение ОС, которое заключается в том, что иконку оповещения и звук можно
брать только из самого приложения. Звук в 1С реализовали, осталось дело за иконкой.
Страница 33 из 46
Глобальные уведомления
К глобальным уведомлениям относятся уведомления, которые были сделаны вне контекста
текущего мобильного устройства, т.е. были вызваны извне.
Это все очень грубо, но передает основную суть, а именно: сервер должен иметь выход на сервер
этих служб, мобильное устройство должно иметь выход в интернет к этим службам, и последнее, но
самое главное – совсем не важно, какой у вас интернет на мобильном устройстве – wi-fi или
мобильный, динамический у вас IP или статический, белый или нет – все неважно.
Сервис GCM
Сервис GCM (Google Cloud Message) используется в устройствах на базе Android.
Теперь поэтапно рассмотрим все пункты, которые необходимо выполнить, чтобы получить
желаемый результат:
1. Переходим в консоль разработчиков Google. Это можно делать под любым аккаунтом. Но в
реальных проектах надо использовать специальный аккаунт той фирмы, для которой вы
разрабатываете решение.
2. Необходимо создать новый проект, в нашем случае – проект можно представить как аналитику
учета, т.е. по проекту мы можем видить статистику отправлений и т.д., поэтому, если вы
планируете разрабатывать несколько решений, то лучше всего будет под каждое решение
создавать свой проект. И так, создаем проект:
Страница 34 из 46
Страница 35 из 46
Страница 36 из 46
6. Нажимаем на проект и ищем номер проекта, в нашем случае это номер 896392358441. Для
каждого проекта генерируется свой номер. Именно этот номер мы и будем указывать в
мобильной 1С, для того чтобы получить идентификатор приложения.
Но это не все, теперь нам необходимо включить возможность отправки сообщений, т.е. работы с API
функциями.
Страница 37 из 46
8. В результате должно открыться меню с разными сервисами, ищем среди них такое меню и
нажимаем на нужную нам опцию:
И включаем ее:
Страница 38 из 46
После этого нас спросят, для кого мы хотим сгенерировать ключ? В нашем случае отправлять
данные будет именно сервер, поэтому для него и генерируем:
Далее необходимо указать имя ключа и IP сервера, откуда мы можем использовать данный ключ:
Страница 39 из 46
Если у нас динамический IP сервера, но мы знаем в каких пределах, то можно указать это тут, если
он статический, то просто указываем IP сервера (не забываем про тестовые сервера и резервные).
Но в нашем случае, так как это тестовый пример, мы просто укажем диапазон 0.0.0.0/0, что
соответствует любому IP адресу.
Т.е. при отправке сообщений со стационарной 1С, нам необходимо будет указывать ключ:
AIzaSyCkA5qHGw_TuhsuKvb8UIAVcROYEWoiQQU
А для получения ID устройства, нам надо будет указать в мобильном устройстве ID проекта, т.е.:
896392358441
Запомните это и не путайте их. Кроме этого – данная информация является конфиденциальной.
После того, как мы сделали это – мы можем протестировать все следующим кодом:
Страница 40 из 46
Сервис APN
Этот сервис используется на устройствах под управлением iOS. Однако следует учесть, что для
работы с ним необходимо иметь купленную лицензию для разработчиков, без неё ничего не выйдет.
Сервис уведомлений от 1С
Этот сервис сам по себе не доставляет уведомления, он создаёт прослойку между GCM и APN и
использует их данные. Для того что бы воспользоваться этим сервисом, необходимо выполнить все
действия, которые мы уже рассмотрели ранее.
Нововведения в интерфейсе
Как уже упоминалось ранее, в мобильной платформе работа с формами немного отличается, и в
этой теме разберем большую часть нового функционала, появившегося в мобильной платформе и
только в ней.
Страница 41 из 46
Что такое маска и для чего она нужна? Давайте представим себе такую задачу: у нас есть некоторое
текстовое поле, например – основание выдачи, куда мы должны внести некие данные. К примеру,
есть сотрудник, который выдает некий товар, но чтобы он его выдал, ему нужно ввести основание
выдачи, которое выглядит таким образом:
Конечно, можно сделать и отдельные три поля, но смысла в этом нет, так как эти сведения по
отдельности не несут никакой аналитической информации, а создание трех отдельных полей лишь
займет место, которое нам и так нужно.
Что же тут можно сделать? Просто использовать маску ввода. Давайте обратимся к справке:
Расширение поля формы для поля ввода. Маска (Form field extension for a text box.Mask)
Маска (Mask)
Использование:
Чтение и запись.
Описание:
Тип: Строка.
# – допустимо ввести произвольный символ цифры или – (знак минус) или + (знак плюс) или пробел
U – допустимо ввести любые алфавитно-цифровые символы (буквы или цифры) и любой введенный
символ преобразуется в верхний регистр
Страница 42 из 46
@ – допустимо ввести любые алфавитно-цифровые символы (буквы или цифры) в верхнем регистре
или пробел.
При помещении значения из поля ввода с маской в текстовый реквизит, связанный с этим полем
ввода, происходит следующее преобразование: на тех позициях, где в маске стоит символ @, а в
строке пробел, пробел удаляется. Если в маске из специальных символов используются только
символы @, то все символы текста, соответствующие символам маски, не являющимся
специальными символами, удаляются после последнего непустого блока из символов @. Например,
при маске @@.@@.@@. текст 41. 2. . преобразуется в 41.2.
Для того чтобы использовать в маске один из специальных символов, нужно ставитьь перед ним
символ \.
Допускается указание нескольких масок в одном параметре. Маски разделяются символом ;. В этом
случае использоваться будет та маска, к которой подходит введенный текст.
Тут, опять-таки, полужирным выделены те части, которые могут меняться, и после того, как вы
введете данную маску в поле маски:
Страница 43 из 46
В режиме предприятия вы увидите, что все, что не касалось спецсимволов, отобразилось в виде
подсказки:
И удалить эти данные вы уже не сможете, но, как только вы их начнете сюда вводить, курсор сам
выровняется в нужные места. Вот так работает маска. Однако, я думаю, что многие согласятся со
мной, что приведенный выше пример – слишком уже надуманный. А где можно реально применить
это? Особенно в мобильной платформе?
Например, когда вносятся контактные данные, номер телефона – это идеальный кандидат на
использование маски. Возьмем интернациональную компанию, которая работает в Украине и в
России, или мы просто пишем приложение для нескольких стран. И кроме этого – номер телефона
может указываться как некий внутренний, что особенно актуально для IP телефонии. Ну и куда же
без некоего добавочного номера?
В чем может быть проблема? Ну, во-первых, посмотрим, как выглядят номера телефонов в разных
странах.
+7 9хх ххх-хх-хх
Где «+7» – код страны, «9хх» – код мобильного оператора, ну а дальше – номер абонента.
+380 хх ххх-хх-хх
Где «+380» – код страны, далее две цифры кода оператора или региона, а потом – номер телефона.
Однако принятый формат – (0хх) ххх-хх-хх.
(999) 999-99-99, т.е. в таком формате и будут записываться все номера, однако, что делать, если
нужно использовать добавочный номер?
В таком случае мы можем применить несколько масок, судя по данным из справки, по такому типу:
Однако из-за того, что маски очень схожи, программа не сможет их обработать, поэтому идеальный
вариант – где-то хранить массив масок и подставлять нужную в нужный момент. Так как данное
свойство поля формы доступно как для чтения, так и для записи.
Страница 44 из 46
А если быть точнее, то первая девятка в скобках, так как «9», в данном случае – это спецсимвол,
который обозначает любое число, в первом случае «\9» означает что «9» будет нередактируемая, а
во втором случае – там будет пусто, и пользователь должен ввести некое число.
Было бы отлично, если бы маску вынесли в оформление, это более логично, тогда мы могли бы
настраивать по правилам, какую маску когда использовать, а так – есть только туманное объяснение
из справки 1С: «В этом случае использоваться будет та маска, к которой подходит введенный
текст».
Относительно мобильной платформы следует отметить, что в каждой минорной версии есть некий
уникальный баг с масками, например, если в 8.3.7.39 указать маску вида: (999) 999-99-99, то вы не
сможете ввести два последних символа, а если указать (999) 999/99/99, то все будет отлично. То же
самое касается разделителя в виде «=», но если поставить пробел, то опять-таки не сможете ввести
два последних символа. Поэтому, если вы все-таки используете маски, с выходом минорных версий
тестируйте этот функционал во избежание проблем.
В заключение: наверное, все выше описанное – и есть та причина, по которой разработчики очень
редко пользуются масками.
Практические задания
Задание 4.1 Маршрут
Соберите координаты за некоторое время и постройте по ним маршрут.
Страница 45 из 46
Страница 46 из 46