Бывает, что даже деньги не до конца мотивируют на выполнение каких-либо задач. И хочется найти дополнительный импульс. А тут есть возможность представить себя персонажем RPG-игры и прокачаться по полной.
Т.к. привык вести учет всего, что только можно в своей "самописке" на 1С (деньги, планирование, клиенты и т.д.) - решил добавить туда идею из приложения "RPG in real life".
Создал всего 2 справочника, 2 регистра сведений, один объект задач и форму. Получилось минималистично, но пока устраивает. В дальнейшем планирую добавить в конфигурацию чуть больше хотелок и перенести эту конфу на андроид.
Если нужно подробно, то:
1. Я использовал платформу 8.3.16.1148, там обещали новые "вкусности" по мобильной разработке, но до них я еще не дошел. Но в свойствах конфигурации поставил на будущее галку "Приложение для мобильной платформы".
Создаём справочник RPG_Навыки, в предопределенные можно сразу добавить - "Карьера и деньги", "Здоровье", "Обустройство дома", "Интеллект", "Спорт", "Помощь другим людям" и т.д. (настраивайте справочник проецируя на себя).
2. Я создал еще справочник "Клиенты", т.к. основная направленность миссий, думаю, будет по навыку "Карьера и деньги".
3. Добавим непериодический регистр сведений, не подчиненный регистратору RPG_СоответствияБалловИУровней. Измерения - Навык и УровеньНавыка, ресурс - НеобходимыйБалл. После заполнения он будет выглядеть примерно так:
4. Создадим задачу RPG_Миссии. Я добавил реквизиты ДатаИсполнения, СрокИсполнения, Клиент. И табличную часть "Навыки", т.к. одна миссия может усилить несколько навыков. Я создал ещё форму для активных задач, чтобы на рабочую область 1С вывести.
Далее, добавим регистр сведений RPG_Баллы. Измерения "Навык", Миссия" (тип ЗадачаСсылка.RPG_Миссии, Ведущее). Ресурс "Балл". В этот регистр мы будем делать записи при выполнении задачи (миссии). Знаю, что здесь лучше подойдёт оборотный регистр накопления, но придётся создавать еще вспомогательный документ в качестве регистратора, а сейчас мне хочется минимализма и огромного объема записей, чтобы сильно замедлить базу - не предвидится.
5. Создаём общую форму "Уровень персонажа и навыки". Общий уровень персонажа считается, как в Oblivion - когда произошло 10 повышений навыков - повышается основной уровень. Значения навыков определяем запросом к регистрам RPG_СоответствийБалловИУровней и RPG_Баллы.
Вот процедура, которая вызывается при открытии или обновлении формы:
//Получаем массив навыков и создаем реквизиты и поля для уф
&НаСервере
Процедура СоздатьРеквизитыИПоляУФ()
МассивНавыков = Новый Массив;
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| RPG_Навыки.Наименование КАК Наименование,
| RPG_Навыки.ИмяПредопределенныхДанных КАК Имя,
| СУММА(RPG_Баллы.Балл) КАК Балл,
| RPG_Навыки.Код КАК Код,
| RPG_Навыки.Ссылка КАК Ссылка
|ПОМЕСТИТЬ ВТСпрИСуммаБаллов
|ИЗ
| Справочник.RPG_Навыки КАК RPG_Навыки
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.RPG_Баллы КАК RPG_Баллы
| ПО RPG_Навыки.Ссылка = RPG_Баллы.Навык
|ГДЕ
| RPG_Навыки.ПометкаУдаления = ЛОЖЬ
|
|СГРУППИРОВАТЬ ПО
| RPG_Навыки.Наименование,
| RPG_Навыки.ИмяПредопределенныхДанных,
| RPG_Навыки.Код,
| RPG_Навыки.Ссылка
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ВТСпрИСуммаБаллов.Ссылка КАК Ссылка,
| ВТСпрИСуммаБаллов.Имя КАК Имя,
| ВТСпрИСуммаБаллов.Наименование КАК Наименование,
| ЕСТЬNULL(ВТСпрИСуммаБаллов.Балл, 0) КАК Балл,
| МАКСИМУМ(RPG_СоответствийБалловИУровней.УровеньНавыка) КАК УровеньНавыка,
| ВТСпрИСуммаБаллов.Код КАК Код
|ИЗ
| ВТСпрИСуммаБаллов КАК ВТСпрИСуммаБаллов
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.RPG_СоответствийБалловИУровней КАК RPG_СоответствийБалловИУровней
| ПО ВТСпрИСуммаБаллов.Ссылка = RPG_СоответствийБалловИУровней.Навык
| И ВТСпрИСуммаБаллов.Балл >= RPG_СоответствийБалловИУровней.НеобходимыйБалл
|
|СГРУППИРОВАТЬ ПО
| ВТСпрИСуммаБаллов.Имя,
| ВТСпрИСуммаБаллов.Ссылка,
| ВТСпрИСуммаБаллов.Наименование,
| ВТСпрИСуммаБаллов.Код,
| ЕСТЬNULL(ВТСпрИСуммаБаллов.Балл, 0)
|
|УПОРЯДОЧИТЬ ПО
| Код";
ТЗНавыковБалловИУровней = Запрос.Выполнить().Выгрузить();
МассивНавыков = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Имя");
Для Каждого СтрокаМассиваНавыков Из МассивНавыков Цикл
//Добавляем в уф навыки
//Создание реквизита уф
ИскомыйЭлементФормы = Элементы.Найти(СтрокаМассиваНавыков);
Если ИскомыйЭлементФормы = Неопределено Тогда //Проверка - при обновлении формы реквизиты не создаем
ДобавляемыйРеквизит = Новый Массив;
НовыйРеквизит = Новый РеквизитФормы(СтрокаМассиваНавыков, Новый ОписаниеТипов("Число",Новый КвалификаторыЧисла(10,0)));
ДобавляемыйРеквизит.Добавить(НовыйРеквизит);
ИзменитьРеквизиты(ДобавляемыйРеквизит);
Иначе
//Удаляем необновленный элемент формы
Элементы.Удалить(ИскомыйЭлементФормы);
КонецЕсли;
//Создание поля уф
НовыйЭлемент = Элементы.Добавить(СтрокаМассиваНавыков, Тип("ПолеФормы"),);
НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода;
НовыйЭлемент.ПутьКДанным = СтрокаМассиваНавыков;
НовыйЭлемент.ТолькоПросмотр = Истина;
//Присваиваем уровень нашему навыку
СтрокаТЗСУровнем = ТЗНавыковБалловИУровней.Найти(СтрокаМассиваНавыков, "Имя");
Если СтрокаТЗСУровнем <> Неопределено Тогда
ЭтотОбъект[СтрокаМассиваНавыков] = СтрокаТЗСУровнем.УровеньНавыка;
НовыйЭлемент.Заголовок = СтрокаТЗСУровнем.Наименование + " (" + СтрокаТЗСУровнем.Балл + ")";
//НовыйЭлемент.Заголовок = СтрокаТЗСУровнем.Наименование + " (" + СтрокаТЗСУровнем.Балл + " " + ПолучитьСклоненияСтрокиПоЧислу("балл",СтрокаТЗСУровнем.Балл,,"ЧС=Количественное","ПД=Родительный")[0] + ") ";
КонецЕсли;
КонецЦикла;
Уровень = ТЗНавыковБалловИУровней.Итог("УровеньНавыка") / 10;
КонецПроцедуры
Как в итоге получилось - смотрите скриншоты в самом верху. Конфигурацию буду дополнять, планирую добавить фоновую музыку, отчёты с картинками из Morrowind и Oblivion, перенесу на андроид (тогда вместо не поддерживаемых в мобильном приложении задач - придется уже документы использовать). Всё по мере появления свободного времени. Ни на что не претендую, делаю для себя - но вопросы, просьбы и идеи по доработке - с радостью почитал бы.