gifts2017

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

Опубликовал Владимир Лучинский (Luchik) в раздел Программирование - Мобильные приложения

В данной статье мы создадим мобильное приложение для повышения продуктивности по «помидорной» технологии под ОС 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 31
.cf 165,71Kb
19.08.16
31
.cf 165,71Kb Скачать

См. также

Подписаться Добавить вознаграждение

Комментарии

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

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