Позволю напомнить - метод 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)
Управление покупками
Управление покупками выполняется в следующей последовательности:
ВП = ВстроенныеПокупки;
ВП.НачатьПриобретение();
ВП.ИзрасходоватьПокупку();
ОплатаПроизведена = ВП.НачатьПриобретение();