IE2017

Пример создания мобильного приложения в 1С с нуля

Программирование - Мобильные приложения

В данной статье мы создадим мобильное приложение для повышения продуктивности по «помидорной» технологии под ОС Android и ОС iOS. По ходу создания, мы реализуем таймер средствами 1С, реализуем программный вывод анимированной диаграммы на форму («Поле диаграммы» управляемой формы), также работу с PUSH-уведомлениями на мобильном устройстве, показ рекламы в приложении и работу со встроенными покупками.

Позволю напомнить - метод Pomodoro заключается в делении вашего рабочего времени на 25-минутные отрезки, называемые «помидорами», между которыми вы можете позволить себе отдых в течение 5 минут. Вы должны работать без отвлечения 25 минут, затем 5 минут отдохнуть и приниматься за следующий рабочий «помидор». После четырёх таких отрезков — отдых на целых 15 минут.

Описание «Помидорной» техники несколько странное, но стоит её попробовать, и Вы убедитесь, что это отличный способ повышения продуктивности работы.

Здесь вы можете скачать файл конфигурации, приложение для ОС Android расположено на сайте http://www.mykib.org/article/primer-sozdaniya-mobilnogo-prilozheniya-v-1s-s-nulya и в Google Play https://play.google.com/store/apps/details?id=org.mykib.pomodoro

Создание конфигурации для мобильного приложения

Создадим новую «пустую» базу. Дадим имя конфигурации «Pomodoro». Обязательно укажем свойство «назначение использования» - «Мобильное приложение»

Укажем свойство «назначение использования» - «Мобильное приложение»

а в свойстве «Требуемые разрешения мобильного приложения» установим флажки «Локальные уведомления» и «Встроенные покупки»

Требуемые разрешения мобильного приложения

Создадим регистр сведений, в котором будет храниться информация о «полученных» помидорах (количество законченных отрезков времени, в течение которого пользователь продуктивно работал)

Создадим регистр сведений, в котором будет храниться информация о «полученных» помидорах

Таймер средствами 1С

В обработке можно запустить таймер и дождаться окончания его работы, либо остановить таймер. В первом случае пользователь получит PUSH-уведомление о том, что он заработал очередной помидор (запись в регистр сведений «Помидоры»), во втором случае PUSH-уведомление о том, что помидор не получен (запись в регистр не производится).

Также на форме в процессе работы таймера будет показан индикатор, выполняться обратный отсчет и показываться текущее время и время окончания работы таймера

Создадим обработку Таймер и основную форму

Обработка Таймер

Для формы создадим команду «Запустить таймер», обработчик действия (нажатие):

&НаКлиенте
Процедура ЗапуститьТаймер(Команда)
	
	Элементы.ФормаОстановитьТаймер.Доступность = Истина;
	Элементы.ФормаЗапуститьТаймер.Доступность = Ложь;
	
	КоличествоМинут = 25;
	
	МаксимальноеЗначение = КоличествоМинут * 60;
	
	Элементы.Индикатор.МинимальноеЗначение = 0;
	Элементы.Индикатор.МаксимальноеЗначение = ЭтотОбъект.МаксимальноеЗначение;
	
	ЭтотОбъект.Начало = ТекущаяДата();
	ЭтотОбъект.Конец = Начало + МаксимальноеЗначение;
	
	ЭтотОбъект.ТекущаяДата = 		ТекущаяДата();
	
	ПодключитьОбработчикОжидания("ВыполнитьОтсчет",1);
	
КонецПроцедуры
И команду «ОстановитьТаймер», обработчик действия (нажатие):
&НаКлиенте
Процедура ОстановитьТаймер(Команда)
	
	Элементы.ФормаОстановитьТаймер.Доступность = Ложь;
	Элементы.ФормаЗапуститьТаймер.Доступность = Истина;
	
	ОтключитьОбработчикОжидания("ВыполнитьОтсчет");
	
	#Если МобильноеПриложениеКлиент Тогда
	Уведомление = Новый ДоставляемоеУведомление;
	Уведомление.Заголовок = "К сожалению, Вы не получите помидор.";
	Уведомление.Текст = "К сожалению, Вы не получите помидор.";
	Уведомление.ЗвуковоеОповещение = ЗвуковоеОповещение.ПоУмолчанию;
	ДоставляемыеУведомления.ДобавитьЛокальноеУведомление(Уведомление);
	ДоставляемыеУведомления.ПодключитьОбработчикУведомлений("ПриПолученииУведомления");
	#Иначе
	Сигнал();
	Сообщение = Новый СообщениеПользователю;
	Сообщение.Текст = "К сожалению, Вы не получите помидор.";
	Сообщение.Сообщить();
	#КонецЕсли
	
КонецПроцедуры

В этих процедурах подключается (либо отключается) обработчик ожидания «ВыполнитьОтсчет», а также выполняется работа с PUSH-уведомлениями

Уведомление = Новый ДоставляемоеУведомление;

Код процедуры обработчика ожидания ВыполнитьОтсчет»:

&НаКлиенте
Процедура ВыполнитьОтсчет()
	
	Если ЭтотОбъект.ТекущаяДата <= ЭтотОбъект.Конец Тогда
		
		ЭтотОбъект.Индикатор = ЭтотОбъект.ТекущаяДата - ЭтотОбъект.Начало;
		
		ЭтотОбъект.ТекущаяДата = 		ТекущаяДата();
		
		ОсталосьАбсолютно = ЭтотОбъект.МаксимальноеЗначение - ЭтотОбъект.Индикатор;
		
		ЭтотОбъект.Осталось = "" + Формат(Цел(ОсталосьАбсолютно/60), "ЧЦ=2; ЧН=00; ЧВН=") + ":" + Формат(ОсталосьАбсолютно - Цел(ОсталосьАбсолютно/60)*60, "ЧЦ=2; ЧН=00; ЧВН=");
		
		ЭтотОбъект.ОбновитьОтображениеДанных();
		
	Иначе
	
		ЭтотОбъект.Индикатор = МаксимальноеЗначение;
		ЭтотОбъект.ТекущаяДата = ЭтотОбъект.Конец;
		ЭтотОбъект.Осталось = Формат(0, "ЧЦ=2; ЧН=00; ЧВН=") + ":" + Формат(0, "ЧЦ=2; ЧН=00; ЧВН=");
		
		#Если МобильноеПриложениеКлиент Тогда
		Уведомление = Новый ДоставляемоеУведомление;
		Уведомление.Заголовок = "Вы собрали еще один помидор.";
		Уведомление.Текст = "Вы собрали еще один помидор. Отдохните " + ПолучитьКоличествоМинутОтдыхаНаСервере(ЭтотОбъект.ТекущаяДата) + " минут.";
		Уведомление.ЗвуковоеОповещение = ЗвуковоеОповещение.ПоУмолчанию;
		ДоставляемыеУведомления.ДобавитьЛокальноеУведомление(Уведомление);
		ДоставляемыеУведомления.ПодключитьОбработчикУведомлений("ПриПолученииУведомления");
		#Иначе
		Сигнал();
		Сообщение = Новый СообщениеПользователю;
		Сообщение.Текст = "Вы собрали еще один помидор. Отдохните " + ПолучитьКоличествоМинутОтдыхаНаСервере(ЭтотОбъект.ТекущаяДата) + " минут.";
		Сообщение.Сообщить();
		#КонецЕсли
		
		
		Элементы.ФормаОстановитьТаймер.Доступность = Ложь;
		Элементы.ФормаЗапуститьТаймер.Доступность = Истина;
		
		ОтключитьОбработчикОжидания("ВыполнитьОтсчет");
		
	КонецЕсли;
	
КонецПроцедуры

&НаСервере
Функция ПолучитьКоличествоМинутОтдыхаНаСервере(Дата)
	
	//Занесем запись в регистр
	РС = РегистрыСведений.Помидоры.СоздатьМенеджерЗаписи();
	РС.Активность = Истина;
	РС.Количество = 1;
	РС.Период = Дата;
	РС.Записать();
	
	//по умолчанию 5 минут
	//после каждого 4-го помидора в день - 15 минут
	Запрос = Новый Запрос;
	Запрос.Текст = "ВЫБРАТЬ
	|	СУММА(Помидоры.Количество) КАК Количество
	|ИЗ
	|	РегистрСведений.Помидоры КАК Помидоры
	|ГДЕ
	|	Помидоры.Период МЕЖДУ НАЧАЛОПЕРИОДА(&Период, ДЕНЬ) И КОНЕЦПЕРИОДА(&Период, ДЕНЬ)";
	
	Запрос.УстановитьПараметр("Период", Дата);
	
	Результат = Запрос.Выполнить().Выгрузить();
	
	Если Результат.Количество() > 0  Тогда
		
		Сумма = Результат[0].Количество;
		
		Если Цел(Сумма/4) = (Сумма/4) Тогда
			
			Возврат 15;
			
		КонецЕсли;
		
	КонецЕсли;
	
	Возврат 5;
	
КонецФункции

Вывод PUSH-уведомлений реализуется так:

&НаКлиенте
Процедура ПриПолученииУведомления(Уведомление, Локальное, Показано) Экспорт
	Если Локальное Тогда
		Сообщить(Уведомление.Текст);
	КонецЕсли;
КонецПроцедуры

В коде выполняется управление доступностью кнопок запуска и остановки таймера в зависимости от его состояния (запущен таймер, либо остановлен) – осталось установить первоначальную видимость этих кнопок при открытии формы:

&НаКлиенте
Процедура ПриОткрытии(Отказ)
	
	Элементы.ФормаОстановитьТаймер.Доступность = Ложь;
	Элементы.ФормаЗапуститьТаймер.Доступность = Истина;
	
КонецПроцедуры

Статистика – диаграмма

Создадим обработку Статистика и основную форму

Обработка Статистика

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

Инициализация:

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	
	Для Каждого Стр Из ТипДиаграммы Цикл
		Элементы.ВидДиаграммы.СписокВыбора.Добавить(Стр, Стр, , );//Статистика
		Элементы.ВидДиаграммыПродуктивность.СписокВыбора.Добавить(Стр, Стр, , );//Продуктивность
	КонецЦикла;
	
	//Статистика
	Период.Вариант = ВариантСтандартногоПериода.ЭтаНеделя;
	Периодичность = "ДЕНЬ";
	
	ВидДиаграммы = ТипДиаграммы.Изометрическая;
	
	ОбновитьДиаграмму();
	
	//Продуктивность
	ПериодПродуктивность.Вариант = ВариантСтандартногоПериода.ЭтаНеделя;
	ПериодичностьПродуктивность = "ДЕНЬНЕДЕЛИ";
	
	ВидДиаграммыПродуктивность = ТипДиаграммы.Изометрическая;
	ОбновитьДиаграммуПродуктивность();
	
	
КонецПроцедуры

Вывод диаграммы:

&НаКлиенте
Процедура ВидДиаграммыПриИзменении(Элемент)
	ОбновитьДиаграмму();
КонецПроцедуры

&НаСервере
Процедура ОбновитьДиаграмму()
	
	// Очистить диаграмму, возможно ранее в нее уже выводились данные.
	Диаграмма.Очистить();
	
	//Диаграмма.ОбластьЗаголовка.Текст = "Статистика собранных помидоров";
	
	//Диаграмма.МаксимумСерий = МаксимумСерий.Ограничено;
	//Диаграмма.МаксимумСерийКоличество = 7;
	
	// Запретить обновление диаграммы на время вывода данных.
	Диаграмма.Обновление = Ложь;
	
	//Диаграмма.Анимация = АнимацияДиаграммы.Использовать;
	Диаграмма.ТипДиаграммы = ?(ВидДиаграммы <> Неопределено, ВидДиаграммы, ТипДиаграммы.ГистограммаОбъемная);//ТипДиаграммы.ГистограммаОбъемная;
	
	// Установить единственную точку.
	Диаграмма.КоличествоТочек = 1;
	Диаграмма.Точки[0].Текст = "Количество";
	
	Запрос = Новый Запрос;
	Запрос.Текст = "ВЫБРАТЬ
	               |	НАЧАЛОПЕРИОДА(Помидоры.Период, ДЕНЬ) КАК Период,
	               |	СУММА(Помидоры.Количество) КАК Количество
	               |ИЗ
	               |	РегистрСведений.Помидоры КАК Помидоры
	               |ГДЕ
	               |	Помидоры.Период МЕЖДУ &НачалоПериода И &КонецПериода
	               |
	               |СГРУППИРОВАТЬ ПО
	               |	НАЧАЛОПЕРИОДА(Помидоры.Период, ДЕНЬ)
	               |
	               |УПОРЯДОЧИТЬ ПО
	               |	Период";
				   
				   
	Запрос.Текст = СтрЗаменить(Запрос.Текст,"ДЕНЬ" , Периодичность);
	
	Запрос.УстановитьПараметр("НачалоПериода", Период.ДатаНачала);
	Запрос.УстановитьПараметр("КонецПериода", Период.ДатаОкончания);
	
	Результат = Запрос.Выполнить();
	Выборка = Результат.Выбрать();
	
	ФорматнаяСтрока = "ДФ=dd.MM.yyyy";
	
	Если Периодичность = "МЕСЯЦ" Тогда
		ФорматнаяСтрока = "ДФ=MMMM.yyyy";
	ИначеЕсли Периодичность = "ГОД" Тогда
		ФорматнаяСтрока = "ДФ=yyyy";
	КонецЕсли;
	
	Пока Выборка.Следующий() Цикл
		
		КоличествоСерий = Диаграмма.Серии.Количество();
		Диаграмма.КоличествоСерий = КоличествоСерий + 1;
		
		Диаграмма.Серии[КоличествоСерий].Текст = Формат(Выборка.Период, ФорматнаяСтрока);
		Диаграмма.УстановитьЗначение(0, КоличествоСерий, Выборка.Количество);
	
	КонецЦикла;
	
	Диаграмма.ОбластьЛегенды.Прокрутка = Истина;
	
КонецПроцедуры

Управление рекламой

Для управления рекламой используется свойство глобального контекста «ОтображениеРекламы»

Реклама будет выводиться в виде рекламного баннера вверху, либо внизу (свойство «ОтображениеРекламногоБаннера») окна приложения:

Управление рекламой

Включение показа рекламного баннера реализуем в Модуле управляемого приложения в процедуре ПриНачалеРаботыСистемы():

Процедура ПриНачалеРаботыСистемы()
	
	Если СлужебныйВызовСервера.ПоказыватьРекламу() Тогда
		#Если МобильноеПриложениеКлиент ИЛИ МобильноеПриложениеСервер Тогда
		ОР = ОтображениеРекламы;
		ОР.УстановитьИспользование(Истина);
		ОР.SetAdBannerID("ca-app-pub-1356011826682846/4780285411");
		ОР.УстановитьОтображениеРекламногоБаннера(ОтображениеРекламногоБаннера.Верх);
		#КонецЕсли
	КонецЕсли;
	
КонецПроцедуры

В строке ОР.SetAdBannerID("ca-app-pub-1356011826682846/4780285411") в параметре процедуры SetAdBannerID укажите Идентификатор рекламного блока, полученный в AddMod (https://apps.admob.com)

Идентификатор рекламного блока, полученный в AddMod

Управление покупками

Управление покупками выполняется в следующей последовательности:

		ВП = ВстроенныеПокупки;
		ВП.НачатьПриобретение();
		ВП.ИзрасходоватьПокупку();
		ОплатаПроизведена = ВП.НачатьПриобретение();

Скачать файлы

Наименование Файл Версия Размер
Файл конфигурации мобильного приложения Pomodoro
.cf 165,71Kb
19.08.16
46
.cf 165,71Kb 46 Скачать

См. также

Комментарии
1. Дмитрий Шерстобитов (DitriX) 2491 20.08.16 19:38 Сейчас в теме
У меня на курсах, что бы объяснить это - ушел не один час, особенно про AdMob и про push в iOS :)
А вы тут уложились в пару страниц :) Оставив все самое интересное и сложное - за занавесом :)
Не хорошо так статьи писать.
dj_serega; Andrew_1C; Dimtok; nomadon; Dach; +5 Ответить 1
2. Константин Соболевский (Константин С.) 491 23.08.16 16:54 Сейчас в теме
Оставив все самое интересное и сложное - за занавесом :)

(1) DitriX, за сложное ты берешь деньги. Автор выдал направление как делается. Реально это нужно 1 или менее процента, остальным для общего развития хвати и этого объема.
spiteful41; rpgshnik; headMade; +3 Ответить 1
3. Николай Зевеке (zekrus) 103 24.08.16 07:50 Сейчас в теме
Доброе утро!
Тема очень актуальная.
А нет подробного руководства для компиляции мобильного приложения под iOS?
С уважением
4. Михаил Беляев (METAL) 77 24.08.16 09:39 Сейчас в теме
5. Сергей Наколаев (a3a3elloxxxx) 24.08.16 10:07 Сейчас в теме
Вопрос к знатокам мобильной 1С. Возможен ли такой вариант использования 1С. Есть файловая база 1С. Кидаем ее на DropBox или яндекс диск и работаем то с мобилы то с планшета а то с десктопа. Понятно, что формы для мобилы и десктопа надо делать разные, главное что бы данные можно было набивать с разных устройств.
6. Ruslan Ruslan (flyer) 244 25.08.16 05:39 Сейчас в теме
(5) a3a3elloxxxx, зачем так усложнять? и для чего это необходимо. арендуете сервер и с него настраиваете подключение. база будет в облаке фактически а моб.приложение будет подключаться к ней.
7. Сергей Наколаев (a3a3elloxxxx) 25.08.16 14:57 Сейчас в теме
(6) flyer,
Арендовать сервер как раз сложнее и дороже чем кинуть пару файлов на диск.
Gorus; bow; +2 Ответить
8. Константин Соболевский (Константин С.) 491 31.08.16 09:10 Сейчас в теме
(5) a3a3elloxxxx, Нет одновременная работа с одной базой Мобайл - Десктоп нельзя. Нужно два приложение и далее на уровне обменов. Или как сказали ранее сервер + web, если на 1-2 пользователе ценав выделенного сервера на Линуксе в приемлема.
9. Дмитрий Шерстобитов (DitriX) 2491 11.09.16 00:01 Сейчас в теме
(2) Константин С., Никто же не говорит что я сама щедрость. Я просто к тому, что если уж и писать статьи, то не оставлять самое интересное закулисами. Я так статьи не пишу, между прочим, а стараюсь выжать максимум из темы.
А на счет того, что я беру деньги за самое интересное - это да, каюсь. Но вот только я еще и экономлю время и нервы:)
dj_serega; +1 Ответить
10. Ivan Khorkov (vano-ekt) 879 04.10.16 13:27 Сейчас в теме
самое интересное в конфигураторе и не напишешь...
да и политика по распространению приложений пока не вдохновляет писать даже учетные программки на 1С для этих ваших Плэймаркетов/Аппсторов
где-то же они озвучивали, что начиная от 50 пользователей/скачек распространение возможно только по соглашению с 1С
такшта АндроидСтудио пока наше всё
11. Василий Казьмин (awk) 679 04.10.16 13:38 Сейчас в теме
(5) a3a3elloxxxx, Нет. Такой вариант невозможен.
12. Алексей Апанасович (Aphanas) 108 05.10.16 04:47 Сейчас в теме
Как этот .cf в телефон затолкать, непонятно
13. Vovka Bo (VovkaBo) 06.10.16 17:46 Сейчас в теме
(12) Aphanas,
cf никак. Ищи сборщик мобильных приложений, загружай туда cf, собирай мобильное приложение, получишь apk. Его и кидаешь в телефон.
14. q q (silver_a) 16.02.17 08:05 Сейчас в теме
Интересное приложение. Но только вот при блокированном экране и при свёрнутом режиме приложения - локальные сообщения выходят через раз или просто вибрирует без вывода сообщений. Так должно быть или это ошибка? Конфа эта без изменений, версия мобильной платформы 8.3.9.74.
15. q q (silver_a) 16.02.17 08:49 Сейчас в теме
(12) как вариант - установить мобильную платформу на смартфон, установить апач, опубликовать cf-ку и таким образом загрузить. я так использую. Вот тут есть пошаговое описание.
16. Виктория Гусакова (user754495) 14.06.17 13:27 Сейчас в теме
Скажите пожалуйста как сделать чтобы у графика рядом с точкой выводить значение ?
Оставьте свое сообщение