Имя: Пароль:
1C
1С v8
Выбрать элементы верхнего уровня по определенному признаку
,
0 extrim-style
 
19.02.14
11:20
Имеется справочник с иерархией элементов:

Элемент1 Реквизит1=4
Элемент1_1 Реквзит1=5
   Элемент1_1_1 Реквизит1=4
     Элемент1_1_1_1 Реквизит1=5
   Элемент1_2_1 Реквизит1=5
  
Мне нужно получить элементы с Реквизит1=5 и выбрать среди них элемент верхнего уровня. Пытался сделать различные упорядочивания в ирархии (в т.ч. по родителю), чтобы взять первый элемент, но так и не смог. Почему-то выбирает как угодно, только не так как в структуре выше - Элемент1_1 первым. Эта задача решается запросом или придется в цикле перебирать по минимальному Уровень()? (это http://infostart.ru/public/160707/ читал)
1 mikecool
 
19.02.14
11:21
о сколько тем таких уж будет...
заводим реквизит "папка самого верхнего уровня", заполняем в перед записью, в запросе используем, профит!
2 Defender aka LINN
 
19.02.14
11:21
Рукалицо...
Намек: какой реквизит не заполнен у элемента первого уровня?
3 Aprobator
 
19.02.14
11:21
ВыбратьИерархически не прокатывает?
4 extrim-style
 
19.02.14
11:23
(2) я не говорил, что необходимый мне элемент будет на первом уровне, он может быть на любом уровне
5 extrim-style
 
19.02.14
11:23
+(4) в данном случае на втором
6 mikecool
 
19.02.14
11:24
(4) хз, что ты имел ввиду, но видимо я не один подумал по твоему сообщению то, на что ответил
7 Aprobator
 
19.02.14
11:24
в чем проблема то? Получить элементы справочника с определенным родителем? Я чего то не догоняю.
8 wade25
 
19.02.14
11:25
Рекурсией до верхнего уровня группировки если я правильно понял задачу. Верхний определишь по флагу Родитель = ПустаяСсылка.
9 Aprobator
 
19.02.14
11:26
а - все, дошло вроде ) Выбрать из справочника все элементы с определенным значением реквизита и получить из них с самым мелким уровнем )
10 extrim-style
 
19.02.14
11:26
(9) да
11 Aprobator
 
19.02.14
11:27
(10) много букв - не все осилили сразу и я в том числе )
12 mikecool
 
19.02.14
11:28
(9) ты сегодня признан телепатом дня! )))
13 Aprobator
 
19.02.14
11:29
(12) просто перечитал 3 раза )
14 Aprobator
 
19.02.14
11:32
(0) попробуй запросом и МИНИМУМ(СсылкиСНкжнымРеквизитом).
15 Aprobator
 
19.02.14
11:32
хотя нет
16 Aprobator
 
19.02.14
11:33
если в разных группах справочника - не прокатит
17 Aprobator
 
19.02.14
11:37
а так - перебор, поскольку доступа к Уровень в запросе нет.
18 extrim-style
 
19.02.14
11:45
(3) странно, Выборка = Справочники.ИмяСправочника.Выбрать(,,Новый Структура("Реквизит1", "5")) - выбирает нормально,
а Выборка = Справочники.ИмяСправочника.ВыбратьИерархически(,,Новый Структура("Реквизит1", "5")) - не выбирает ничего
19 Aprobator
 
19.02.14
11:54
(18) не Иерархия элементов случаев? Была помнится там какая то фигня на эту тему.
20 extrim-style
 
19.02.14
11:56
(19) где была, подскажи, а то что-то гуглопоиском не нахожу
21 kinno
 
19.02.14
12:06
(14) Проверил. При определении минимальной ссылки он смотрит не уровень а очередность создания. Если верхний уровень создать не в самом начале, то его этот запрос возвращать не будет.
22 Aprobator
 
19.02.14
12:07
(21) именно это в (16) я и имел ввиду.
23 Aprobator
 
19.02.14
12:07
(20) гугл в моей практике еще не ищет, не дозрел он до этого )
24 kinno
 
19.02.14
12:17
ВЫБРАТЬ
    Элементы.Реквизит1,
    Элементы.Ссылка КАК Ссылка,
    ВЫБОР
        КОГДА Элементы.Родитель = ЗНАЧЕНИЕ(Справочник.Элементы.ПустаяСсылка)
            ТОГДА 1
        КОГДА Элементы.Родитель.Родитель = ЗНАЧЕНИЕ(Справочник.Элементы.ПустаяСсылка)
            ТОГДА 2
        КОГДА Элементы.Родитель.Родитель.Родитель = ЗНАЧЕНИЕ(Справочник.Элементы.ПустаяСсылка)
            ТОГДА 3
        КОГДА Элементы.Родитель.Родитель.Родитель.Родитель = ЗНАЧЕНИЕ(Справочник.Элементы.ПустаяСсылка)
            ТОГДА 4
        КОГДА Элементы.Родитель.Родитель.Родитель.Родитель.Родитель = ЗНАЧЕНИЕ(Справочник.Элементы.ПустаяСсылка)
            ТОГДА 5
        КОГДА Элементы.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель = ЗНАЧЕНИЕ(Справочник.Элементы.ПустаяСсылка)
            ТОГДА 6
        КОГДА Элементы.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель = ЗНАЧЕНИЕ(Справочник.Элементы.ПустаяСсылка)
            ТОГДА 7
        ИНАЧЕ 8
    КОНЕЦ КАК Уровень
ПОМЕСТИТЬ ЗапросСУровнямиЭлементов
ИЗ
    Справочник.Элементы КАК Элементы
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ЗапросСУровнямиЭлементов.Ссылка,
    ЗапросСУровнямиЭлементов.Реквизит1
ИЗ
    (ВЫБРАТЬ
        ЗапросСУровнямиЭлементов.Реквизит1 КАК Реквизит1,
        МИНИМУМ(ЗапросСУровнямиЭлементов.Уровень) КАК Уровень
    ИЗ
        ЗапросСУровнямиЭлементов КАК ЗапросСУровнямиЭлементов
    
    СГРУППИРОВАТЬ ПО
        ЗапросСУровнямиЭлементов.Реквизит1) КАК ВложенныйЗапрос
        ЛЕВОЕ СОЕДИНЕНИЕ ЗапросСУровнямиЭлементов КАК ЗапросСУровнямиЭлементов
        ПО ВложенныйЗапрос.Реквизит1 = ЗапросСУровнямиЭлементов.Реквизит1
            И ВложенныйЗапрос.Уровень = ЗапросСУровнямиЭлементов.Уровень
25 extrim-style
 
19.02.14
12:20
(23) ну поищи своим поисковиком. вопрос важный.
(24) это на определенное количество уровней
26 kinno
 
19.02.14
12:20
если больше восьми уровней, надо внести изменения в ту часть где мы его определяем.
27 extrim-style
 
19.02.14
12:24
(26) ну у меня справочник без ограничения уровней. Конечно там врядли будет столько их, но тем не менее...
28 extrim-style
 
19.02.14
12:43
+(18) так работает - Выборка = Справочники.ИмяСправочника.ВыбратьИерархически()

реквизит, по которому хотел сделать отбор, имеет тип Строка250 с индексированием с доп. упорядочиванием
29 kinno
 
19.02.14
13:13
(27) сделай ограничение
30 kinno
 
19.02.14
13:55
или откажись от желания, все сделать в запросе, а определяй уровень программно с помощью рекурсивной функции