|
Использование Уровень() в запросе | ☑ | ||
---|---|---|---|---|
0
247tsm
12.10.14
✎
14:44
|
Добрый день, знатоки 1с8.
У меня вопрос, наверно, для Вас простой. Есть справочник Меню. Как мне с помощью запроса выбрать все элементы (группы) заданного уровня? Пробовал построить с помощью построителя запроса, но не смог в нем указать Уровень(). Попробовал вручную, но ругается на фразе Меню.Уровень() - синтаксическая ошибка. ВЫБРАТЬ Меню.Наименование ИЗ Справочник.Меню КАК Меню ГДЕ Меню.Уровень() = &п_уровень УПОРЯДОЧИТЬ ПО Меню.Наименование Прошу помочь. Спасибо |
|||
1
vicof
12.10.14
✎
14:46
|
Сделай реквизит "уровень".
|
|||
2
Klesk666
12.10.14
✎
14:49
|
использовать родителя
|
|||
3
247tsm
12.10.14
✎
14:49
|
(1) Была такая мысль, но зачем вводить новый реквизит, если у справочников есть такой метод Уровень()? Конечно, если не получится, придется использовать новый реквизит Уровень. Но его же надо еще и заполнять!
|
|||
4
247tsm
12.10.14
✎
14:50
|
(2) А как выбрать записи определенного уровня, используя родителя?
|
|||
5
247tsm
12.10.14
✎
14:52
|
Можно, конечно, всё сделать в обычном цикле без запроса, но хочется по-научному - через запрос.
|
|||
6
arsik
гуру
12.10.14
✎
14:55
|
(4)
Выбор Когда Ссылка.Родитель = пустойРодитель Тогда уровень = 0 Когда Ссылка.Родитель.Родитель = пустойРодитель Тогда уровень = 1 .... |
|||
7
247tsm
12.10.14
✎
15:01
|
(6) Это уже ближе, но немного сложновато. А сколько веточек "когда" задать? 3, 5, 10 ? А если в справочнике будет на 1 уровень больше, чем задано в запросе? Хотя, с другой стороны, можно оценить достаточную вложенность.
И еще, что такое пустойРодитель? Параметр? А как его задать? |
|||
8
247tsm
12.10.14
✎
15:05
|
(6) Т.е., это вариант с дополнительным реквизитом "уровень"? Сначала нужно заполнить реквизит "уровень", а затем следующим запросом выбрать нужные записи? Или всё в одном запросе? Можешь набросать код?
|
|||
9
vicof
12.10.14
✎
15:11
|
(0) Тема обсасывалась миллион раз. Или новый реквизит "Уровень", или фиксированное количество уровней, или в цикле.
|
|||
10
Franchiser
гуру
12.10.14
✎
15:14
|
В скд решается на раз -два. Если в запросе то можно например сделать динамическое условие где
где меню.родитель.родитель = &пустой родитель. Конечно много обращений через точку не очень хорошо, нужно смотреть план запроса в скуле. Количество ".родитель" будет зависить от интересующего уровня... |
|||
11
247tsm
12.10.14
✎
15:19
|
(9) Если верно то, что ты сказал, то проще всего, красивее и быстрее будет работать - в цикле.
1) Новый реквизит "Уровень" - нужно дополнительно заполнить этот реквизит. 2) Фиксированное количество уровней - если использовать много точек, то, по-моему, будут тормоза. Наверно, так. Других подсказок нет? |
|||
12
Banned
12.10.14
✎
15:20
|
(11) нет. В запросе это узнать нельзя
|
|||
13
arsik
гуру
12.10.14
✎
15:21
|
Можно еще по другому.
1) Формируешь список запросом и выгружаешь в ТЗ 2) В тз устанавливаешь уровень через метод справочника уровень 3) Загружаешь ТЗ с уровнями во временную таблицу. |
|||
14
arsik
гуру
12.10.14
✎
15:23
|
(13) + Но это будет медленнее чем через точку.
|
|||
15
zulu_mix
12.10.14
✎
15:37
|
а чем скд не нравится?
|
|||
16
247tsm
12.10.14
✎
15:39
|
(13) (14) Но это сложнее, чем просто в цикле перебрать элементы справочника и выбрать нужного уровня.
спрМеню = Справочники.Меню.Выбрать(); Пока спрМеню.Следующий() Цикл об = спрМеню.ПолучитьОбъект(); Если об.Уровень() = ур тогда СписокМеню.Добавить(об.Наименование); КонецЕсли; КонецЦикла; |
|||
17
247tsm
12.10.14
✎
15:43
|
(15) а как задать условие для уровня?
Когда Ссылка.Родитель = &пустойРодитель Тогда уровень = 0 Когда Ссылка.Родитель.Родитель = &пустойРодитель Тогда уровень = 1 Когда Ссылка.Родитель.Родитель.Родитель = &пустойРодитель Тогда уровень = 2 Когда Ссылка.Родитель.Родитель.Родитель.Родитель = &пустойРодитель Тогда уровень = 3 Когда Ссылка.Родитель.Родитель.Родитель.Родитель.Родитель = &пустойРодитель Тогда уровень = 4 Когда Ссылка.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель = &пустойРодитель Тогда уровень = 5 Так? И во сколько этажей будет запрос? И будет ли он лучше, чем (16)? |
|||
18
zulu_mix
12.10.14
✎
15:55
|
(17) в скд есть функция уровень
|
|||
19
alle68
12.10.14
✎
16:26
|
(17) Разве уровень неизвестен до выполнения запроса или работа со строками ещё не освоена?
Всё вышеизложенное будет существенно лучше (16). |
|||
20
247tsm
12.10.14
✎
16:34
|
(19) Да, уровень известен, он передается в запрос, как параметр. Но вопрос в том, как в запросе узнать уровень элемента справочника.
А что ты имеешь в виду, говоря о работе со строками? |
|||
21
RomanYS
12.10.14
✎
16:47
|
(20) он говорит об изменении текста запроса (в части условия), в зависимости от необходимого уровня
|
|||
22
247tsm
12.10.14
✎
16:50
|
(19) Ты имеешь в виду, что можно узнать уровень по количеству "\" в ПолныйКод()?
|
|||
23
247tsm
12.10.14
✎
16:51
|
(21) Если так, то это будет ооочень длинный текст запроса.
|
|||
24
RomanYS
12.10.14
✎
16:54
|
(23) почему?
формируй условие запроса под конкретное значение уровня, а не на все возможные случаи. ... не нужен "выбор когда..", нужно одно конкретное условие "где ..." с нужным количеством ".Родитель" |
|||
25
247tsm
12.10.14
✎
16:57
|
(24) Но дело в том, что уровень, передаваемый в запрос, может меняться. Значит нужно написать несколько запросов под разные уровни? Но это много строк кода. И чем это лучше (16)?
|
|||
26
247tsm
12.10.14
✎
16:58
|
(24) Снимаю вопрос. Можно в строке сформировать условие.
|
|||
27
RomanYS
12.10.14
✎
17:00
|
(25) текст запроса - это строка. И его можно менять программно. Одним циклом можно добавить нужное количество ".Родитель" в текст запроса, а потом уже его выполнить
|
|||
28
SeiOkami
12.10.14
✎
17:01
|
(0), знаешь, столько раз тебе может пригодиться вытягивание элемента справочника определенного уровня, что задолбишься везде писать подобные запросы и циклы.
Будь мужиком! Добавь регистр сведений, куда будут заноситься ЭлементСправочника | ЭлементРодитель | ЧислоУровня И подписку на запись справочников, где при записи в сей регистр будет заноситься вся иерархия текущего элемента. Вот это по-мужитски =) |
|||
29
SeiOkami
12.10.14
✎
17:03
|
Честно, по-момему это очень даже неплохое и универсальное решение, которое может позже сэкономить кучу времени)
|
|||
30
SeiOkami
12.10.14
✎
17:03
|
И никаких изменений типовых объектов - два твоих новых и всё
|
|||
31
Classic
12.10.14
✎
17:07
|
(28)
Мне ни разу не пригодилось. А какая реальная задача (не разовая) может быть на "уровень"? |
|||
32
vicof
12.10.14
✎
17:19
|
(28) Проще реквизит добавить
|
|||
33
247tsm
12.10.14
✎
17:19
|
(31) А задача такая.
Это небольшая прога для музея. Например, первая картинка - это фото музея, текст - история музея, на кнопках - названия разделов музея. Жмем кнопку - на картинке появляется фото или рисунок выбранного раздела, в тексте - текст о разделе, а на кнопках - названия подразделов. И т.д. Обычная информационная система. |
|||
34
247tsm
12.10.14
✎
17:22
|
А уровень нужен, когда жмем на кнопку и переходим в выбранный раздел и нужно сформировать меню следующего раздела (или по кнопке НАЗАД меню предыдущего раздела)
|
|||
35
247tsm
12.10.14
✎
17:24
|
Хотя, можно сразу ПриОткрытии единожды сформировать массив с уровнями и потом работать с массивом.
|
|||
36
247tsm
12.10.14
✎
17:29
|
Вопрос ко всем.
Если сразу ПриОткрытии единожды загнать справочник в массив с формированием колонки "уровень" и потом работать с этим массивом, это лучше, чем работать со справочником? |
|||
37
RomanYS
12.10.14
✎
17:30
|
(34) для этого уровень не нужен:
Вниз: "где Спр.родитель = &тек" // тек = ТекущийЭлемент вверх: "где Спр.родитель = &текРР"// текРР = ТекущийЭлемент.Родитель.Родитель |
|||
38
RomanYS
12.10.14
✎
17:31
|
(36) проще добавить реквизит и менять его перед записью
|
|||
39
247tsm
12.10.14
✎
17:35
|
(37) Это хорошая подсказка.
|
|||
40
zulu_mix
12.10.14
✎
20:37
|
насколько я понял тс не осилил скд и пытается на костылях ехать на велосипеде с квадратными колесами. ну ну...
|
|||
41
Фокусник
12.10.14
✎
21:10
|
(7) пустой родитель это пустая ссылка.
|
|||
42
Сияющий Асинхраль
12.10.14
✎
23:51
|
(0) Кстати, да, иногда очень не хватает уровня в запросе, с удовольствием бы проголосовал, чтобы 1С добавила его определение в Функции 1С-кого сиквела...
|
|||
43
Гобсек
13.10.14
✎
01:51
|
(42)+1
|
|||
44
Sasha_Rapira
13.10.14
✎
04:57
|
Сделай реквизит Уровень и заполняй его автоматом.
При создании нового меню/группы смотрит уровень родителя и +1 ставит. |
|||
45
Sasha_Rapira
13.10.14
✎
04:59
|
Зачем делать своё меню если уже в 1С есть дерево значений?
Сделай меню отдельным справочником и выводи где нужно. |
|||
46
SeiOkami
13.10.14
✎
08:01
|
(32), реквизит что даёт? Номер уровня? А регистр всю иерархию
|
|||
47
Classic
13.10.14
✎
12:04
|
(33)
Для этого уровень не нужен |
|||
48
Classic
13.10.14
✎
12:05
|
(37)
О, уже ответили за меня :) |
|||
49
Krolik Bezobraznik
13.10.14
✎
12:12
|
(0) В условии пробовал использовать в Иерархии ??
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |