Имя: Пароль:
1C
1С v8
Использование Уровень() в запросе
,
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) В условии пробовал использовать в Иерархии ??