Имя: Пароль:
1C
1С v8
Получить 3 группу сверху для семиуровневого справочника номеклатуры
0 GunKata
 
06.12.13
15:52
Может кому поможет или есть решение красивее.
Задача.
Получить список номенклатуры и значение 3 группу сверху. Номенклатура может лежать в любом уровне.
Решил таким запросом
ВЫБРАТЬ
    Номенклатура.Ссылка КАК Номенклатура,
    Номенклатура.НаименованиеПолное,
    Номенклатура.Идентификатор,
    ВЫБОР
        КОГДА Номенклатура.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель = &Вверх
            ТОГДА Номенклатура.Родитель.Родитель.Родитель.Родитель.Родитель
        КОГДА Номенклатура.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель = &Вверх
            ТОГДА Номенклатура.Родитель.Родитель.Родитель.Родитель
        КОГДА Номенклатура.Родитель.Родитель.Родитель.Родитель.Родитель = &Вверх
            ТОГДА Номенклатура.Родитель.Родитель.Родитель
        КОГДА Номенклатура.Родитель.Родитель.Родитель.Родитель = &Вверх
            ТОГДА Номенклатура.Родитель.Родитель
        КОГДА Номенклатура.Родитель.Родитель.Родитель = &Вверх
            ТОГДА Номенклатура.Родитель
    
        ИНАЧЕ "--"
    КОНЕЦ КАК Родитель3
ИЗ
    Справочник.Номенклатура КАК Номенклатура
ГДЕ
    Номенклатура.ЭтоГруппа = ЛОЖЬ
    И Номенклатура.Родитель В ИЕРАРХИИ(&Родитель)
1 France
 
06.12.13
15:54
и нах она нужна?? 3 группа сверху??
2 1Сергей
 
06.12.13
15:57
Чито такое &Вверх?
3 bolobol
 
06.12.13
15:58
(2) Мульт такой, где на шарах домик летал
4 1Сергей
 
06.12.13
16:01
(3) Ты что, мультики смотришь?
5 GunKata
 
06.12.13
16:01
Ну просто, такая ситуация, когда понадобилась именно 3 группа в иерархии, не первая и не последняя :)
6 France
 
06.12.13
16:04
(5) надо ситуации менять, а не чудокодить.... если найдется уникум, который перетусует все
7 Sabbath
 
06.12.13
16:04
(0) в голову приходит костыль: сделать реквизит с нумерацией иерархии
8 1Сергей
 
06.12.13
16:05
(7) Типа Уровень?
9 Жан Пердежон
 
06.12.13
16:06
(7) странно, что 1С сами его не сделают (вместо метода Уровень())
10 GunKata
 
06.12.13
16:06
(2) Это ссылка на папку верхнего уровня от которой идет отсчет  вниз.
11 GunKata
 
06.12.13
16:08
(6) Значит этого уникума уволят, если он самовольно сменить структуру справочника Номенклатура :)
12 1Сергей
 
06.12.13
16:10
(10)

Функция РодительНужногоУровня(ЭлементСправочника, НужныйУровень)
    Если ЭлементСправочника.Уровень()<=НужныйУровень Тогда
        Возврат Неопределено;
    ИначеЕсли ЭлементСправочника.Уровень()<=(НужныйУровень+1) Тогда
        Возврат ЭлементСправочника.Родитель;
    Иначе
        Возврат РодительНужногоУровня(ЭлементСправочника.Родитель, НужныйУровень);
    КонецЕсли;
КонецФункции
13 1Сергей
 
06.12.13
16:11
*

//ИначеЕсли ЭлементСправочника.Уровень()<=(НужныйУровень+1) Тогда
ИначеЕсли ЭлементСправочника.Уровень()=(НужныйУровень+1) Тогда
14 France
 
06.12.13
16:11
(11)   я бы уволил программиста))
15 1Сергей
 
06.12.13
16:13
Если рекурсофобия, то можно циклом
16 Ksandr
 
06.12.13
16:18
Либо цикл писать самому, либо поручить эту работу СКД:
1. В первом наборе выбираются все, где Родитель.Родитель.Родитель = ПустаяСсылка
2. Соединяешь со вторым набором с параметром связи, куда передаешь выбранный элемент в первом наборе, а в текущем В ИЕРАРХИИ(&Параметр).
17 GunKata
 
06.12.13
16:22
(16) не то Родитель.Родитель.Родитель, это 3 снизу будет , а не сверху :) у меня первая мысль такая была
18 Sabbath
 
06.12.13
16:43
(8) ну как-то так, первая мысль: допилить конфу, чтобы где-то это хранилось и просто оттуда брать
19 Sabbath
 
06.12.13
16:46
+(18) хотя имхо что-то тут с решением задачи, вряд ли это нужно, или именно так нужно, или можно не в запросе. Допустим до запроса получать таблицу в виде:

Группа - Родитель - Уровень

Для одной группы будут несколько родителей, каждый совего уровня.

Ну и потом соединять с основным запросом
20 Sabbath
 
06.12.13
16:46
+(19) таблицу соответственно в цикле получать