gifts2017

[ОБУЧАЛОВКА] Многоуровневое меню своими руками

Опубликовал Сергей (Che) Коцюра (CheBurator) в раздел Программирование - Практика программирования

Описывается подход к созданию многоуровневого меню на основе списков значений. Никакого эксклюзива. Никаких секретов. Задача - минимум кодинга, максимум использования имеющихся наработок. Просто понадобилось - накидал минут за 20. Пользуйтесь... Исходный код и все необходимое - приведен.
Итак, частенько стоит задача организации многоуровневого меню - ну там что-нибудь выбрать по последовательной иерархии... Как пример (по-быстрому притянут за уши) - воспользуемся такой задачей: юзеру необходимо сделать выбор конкретной номенклатуры конкретного производителя номенклатуры по конкретной группе номенклатуры. Чебурашек будем тренировать на лекарственных препаратах.
Источником данных может быть что угодно, главное (в данном рассматриваемом решении) - перед использованием "миногоуровневого меню" источником данных для меню должна быть плоская ТЗ, например, получим список реализованной номенклатуры:

Источник данных
"Плоская ТЗ" - это значит, что в ней нет никаких итогов-группировок и прочего.. В нашем примере источником данных для меню является ТЗ со строками такой структуры: группа лек.средств-производитель-номенклатура, например:

Формат плоской ТЗ
Важное замечание: иерархия меню определяется порядком столбцов в ТЗ-источнике!!! Смотрим, как это выглядит...
1. Запускаем выбор меню:


Запуск меню
В данном нашем примере - по нажатию кнопки производится выборка данных (см.вышеприведенный код), и вываливается для выбора первый уровень меню (Группа, см.формат плоской ТЗ):

Первый уровень меню
Выбираем нужный пункт меню (в данном случае это - ПСИХОЛЕПТИКИ) и попадаем на следующий уровень меню (Производитель, см.формат плоской ТЗ):

Второй уровень меню
Выбираем нужный пункт меню (в данном случае это - LUNDBECK) и попадаем на следующий уровень меню (Номенклатура, см.формат плоской ТЗ):

Третий уровень меню
После выбора ПОСЛЕДНЕГО уровня (меню-то иерархическое) - пользователь в том или ином виде получает свой выбор (для философского созерцания - можно открыть карточку номенклатуры, или для производительного труда - выбор далее обрабатывается программно, исходя из логики алгоритма/задачи). В нашем примере, выбор пользователя чисто иллюстративно показывается в табло сообщений:

Результат выбора меню

Вызов меню
Признаком того, что меню не выбрано - пустое значение, которое возвращает функция глБВК_ВернутьМеню(...). В качестве признака выбора/невыбора меню также можно использовать признак "непустой/пусто" списока значений СЗИтогВыбора.
Итог выбора меню - находится в списке значений СЗИтогВыбора. Порядок значений в списке соответствует иерархии выбора всех уровней меню:

Итог выбора меню
В списке значений представление - это название очередного уровня иерархии меню, а значение - пункт, выбранный на данном уровне иерархии. В нашем примере это можно посмотреть на рисунке (см.выше) "Результат выбора меню":
выбор: Группа = ПСИХОЛЕПТИКИ,Производитель = Lundbeck,Номенклатура = Клопиксол табл.п.о 25мг №50
..
Данный результат формируется просто: последовательно проходимся по списку значений и формируем итоговую строку:

Пример формирования вывода результата
Если нас интересует только "конечный" выбор, то его можно получить так:
СЗИтогВыбора.Получить(СЗИтогВыбора.РазмерСписка()).
..вот и весь алгоритм. В компактном виде большую часть этого алгоритма занимает подготовка данных для меню и вывод результата выбора из меню на экран... весь код:

Весь код примера
Непосредственно всю "черновую" работу выполняют две функции (которые можно разместить в своем глобальном модуле):
- глБВК_ВернутьМеню(...) - рекурсивная функция, обеспечивающая навигацию по иерархическому меню;
- глОтобратьПоКолонке(...) - широко известная функция, которая возвращает подмножество ТЗ по указанной колонке и значению этой колонки.
Конкретное рассмотрение функционала этих функций не входит в предмет данной статьи.


Пример обработки, с рассмотренными выше возможностями (немного изменен источник данных) приведен здесь http://infostart.ru/projects/985/?ref=174
Если статья оказалась для вас полезной - скажи спасибо автору - приплюсуй рейтинг.

См. также

Подписаться Добавить вознаграждение
Комментарии
1. Сhe Burashka (CheBurator) 29.05.07 00:41
Просьба комментировать?
Нужны ли подобные статьи в дальнейшем?
на какие темы вы хотите видеть статьи?
2. rjhev korum (корум) 29.05.07 13:20
На любые темы практической работы с 1с такие статьи будут полезны.

Не надо только размазни "как у нас в .... всё плохо, понимания нет, зарплаты на хлеб не хватаает..."
3. Сhe Burashka (CheBurator) 29.05.07 15:56
Насчет размазни - не понял... это где у меня в статьях есть такое? ну-ка ткните меня носом, будем "нытье" вычищать...
4. Доржи Цыденов (support) 29.05.07 23:18
а почему код в виде картинок?
5. kairat primbetov (karat60) 02.06.07 21:20
6. Den (DDD2005) 06.06.07 08:54
Статьи такие нужны и побольше!
7. Сhe Burashka (CheBurator) 07.06.07 22:57
Спасибо за отзывы. Будем стараться...
8. Сhe Burashka (CheBurator) 07.06.07 22:57
Опять же: пишите в отзывах - что вам хотелось бы почитать/узнать - если это свопадет с моими возможностями/желаниями - гуд.. забульбеним, не вопрос!
9. Sasha_H (logarifm) 26.06.07 10:48
10. Сhe Burashka (CheBurator) 31.07.07 15:56
Что значит "неплохо"...? я считаю - "зашибись"....!
11. ineoosaki (ineoosaki) 23.08.07 19:57
Совсем "не зашибись". Автора идеи необходимо было упомянуть хотя бы вскользь. Найду автора и ссылку на его обработку, выложу.
Нехорошо плагиатом заниматься.
Тогда со спокойной совестью минусну и статью и обработку.
У автора идеи в обработке не только демонстрация работы но и конструктор этих меню.
12. Сhe Burashka (CheBurator) 24.08.07 00:12
2 ineoosaki
решительно отметаю наезд!!!
да, сейчас после твоего постинга припоминаю, что такое дело есть на проклабе, причем возможно я его качал и запускал... но! этих обработок через меня прошло столько! что "я успел забыть больше, чем вы знали" ;-) Реально, когда это писал и делал - даже не вспомнил про эту обраьотку!!! вообще!!! вод ведь как бывает... если будут силы - на выходных соспоставлю обработки и напишу чем мой подход - лучше ;-)
13. ineoosaki (ineoosaki) 24.08.07 17:26
"Наезд" продолжаю.
Автором обработки "Вложенные (многоуровневые) меню штатными средствами v7.7" является toling. Обработка выложена на проклабе 03/10/2005. Рейтинг: 5.00.
В обработке tolingа использована рекурсивная функция, очень похожая на ту, что находиться в вашей обработке. Судя по всему автором использованой вами функции есть некто БВК. В использованной вами конфе <ФАРМ СИНДИКАТ 2005-03.05.07> Торговля+Склад, редакция 9.2","7.70.933" много объектов метаданных от этого БВК.
Дали бы ссылку в статье хоть на БВК.
14. Сhe Burashka (CheBurator) 24.08.07 22:07
Я не возражаю, что автором обработки "Вложенные (многоуровневые) меню штатными средствами v7.7" является toling. Я категорически возражаю на то, что тонко пытаются намекнуть что я у кого-то слямзил идею...
15. Сhe Burashka (CheBurator) 24.08.07 22:28
вот, порылся...
http://1c.proclub.ru/modules/newbb/viewtopic.php?viewmode=thread&topic_id=275738&forum=6&post_id=314958#314958
- это мой топик к упомянутой ниже разработке. - порылся у себя в файлоотстойнике - ага, качал.. hmenu.zip
Почему не стал использовать - хз.. не момню уже.. невостребовано видимо было.. когда понадобилось - наваял сам.. ибо искать долше, чем ваять.. ;-)
16. Сhe Burashka (CheBurator) 24.08.07 22:33
освежил tolinga в памяти - код его обработок более насыщен и функционален. Мой - попроще. Зато у tolinga - только инструмент, который еще надо прикрутить к своей конфиге, а у меня - "полный цикл" показан, от источника данных до результат выбора..
каждому - свое...
17. Сhe Burashka (CheBurator) 24.08.07 23:43
не удержусь... вот такое я гуано... ;-)
Уважаемый ineoosaki!
В 13 топике вы прямо и недвусмысленно признались в том, что располагаете конфигой, "уведенной" с моей фирмы, потому как БВК = Che Burashka, т.е. конфига - МОЯ! Источник утечки мне, в принципе, понятен. Осталось данную ветку показать гендиру моей фирмы... т.е. кое-кого вы подставляете по-крупному...
ржунимагу... вот такая жизнь...
18. Сhe Burashka (CheBurator) 25.08.07 00:58
> я у кого-то слямзил идею...
тем более, что конфу у меня слямзили вы ;-)
так что я - белый и пушистый (как всегда), а вот вы - склизкие и пупырчатые ;-)
19. ineoosaki (ineoosaki) 26.08.07 00:44
> я у кого-то слямзил идею...
тем более, что конфу у меня слямзили вы ;-)
так что я - белый и пушистый (как всегда), а вот вы - склизкие и пупырчатые ;-)

Я не улыбаюсь, я умираю со смеху.
Зачем ломать копья? ;)
Пообщайся с Абадоной (прошу у него прощения за кирилицу). Только по возможности в привате. Задай вопрос: откуда я знаю то, что ты считаешь. что я знать не должен.
Ответ на вопрос всем знать не обязательно.
Кто ответ знает, тот "умирает" вместе со мной.

> "я успел забыть больше, чем вы знали"
выходит, многое ты не "переварил" ;;))))
20. Сhe Burashka (CheBurator) 26.08.07 01:48
ну и фигли... поржали оба... ;-)
21. Аркадий Кучер (Abadonna) 26.08.07 10:06
(19) Не вникая в смысл, не понял, почему у меня надо просить прощения за кирилицу??????
Я когда-то транслитом писал, али на нашем, на демоническом? ;)