Имя: Пароль:
1C
1С v8
Избитая тема Получить родителя в запросе (2 уровня)
,
0 GStiv
 
03.11.15
14:45
Есть сводный документ со сводными отгрузками, необходимо в печатную форму вывести Итоги (группировки)
НоменклатураРодитель (Группа 2 уровень)
--Склад
---Контрагент
----Документ
-----Номенклатура (Без иерархии)

Вот теперь остановился не могу в запросе получить Родителя второго уровня.
Там где без группировок делал сортировку по иерархии и потом функцией в рекурсии получал родителя

Функция ПолучитьВерхнийУровеньГруппы (ЭлементСправочника)
  УровеньЭлемента = ЭлементСправочника.Уровень();
        Если УровеньЭлемента = 2 Тогда
             Возврат ЭлементСправочника.Родитель;
        ИначеЕсли УровеньЭлемента = 0 Тогда
             Возврат Справочники.ТвойСправочник.ПустаяСсылка();
        Иначе
             РодительЭлемента = ПолучитьВерхнийУровеньГруппы(ЭлементСправочника.Родитель);
             Возврат РодительЭлемента;
        КонецЕсли;
КонецФункции

А как теперь в запросе не могу сообразить
1 PR третий
 
03.11.15
14:47
ВЫБОР для фиксированной глубины вложенности
2 GStiv
 
03.11.15
14:54
Глубина может быть разная от 2 (искомый уровень) до 10, может есть смысл ВТ сначала запросом получить весь справочник потом через функцию добавить поле Родитель 2 уровня, а потом соединять но производительность просядет.
3 H A D G E H O G s
 
03.11.15
14:54
Запрос в цикле.
4 sapphire
 
03.11.15
14:57
(3) Тогда уж динамический запрос, да и для неограниченного уровня иерархии не прокатит
5 GStiv
 
03.11.15
14:59
(3)
Получить группы 2 уровня и циклом по ним ставить параметр в мой запрос и выводить, в принципе попробую но выполнять 15-30 запросов вместо 1 как то не очень
6 alex-pro
 
03.11.15
15:01
(4) Неограниченного уровня иерархии не бывает на практике.
Когда я решал подобную задачу, просто взял задел на 10 подуровней и сделал запросом через выбрать. Таким образом находится второй уровень.
7 GStiv
 
03.11.15
15:02
А может есть смысл
|ИТОГИ
|    СУММА(Количество),
|    СУММА(Сумма),
|    СУММА(Упаковки)
|ПО
|    НоменклатураРодитель ТОЛЬКО ИЕРАРХИЯ,
|    Склад,
|    Контрагент,
|    Номенклатура";

а затем при выводе проверять НоменклатураРодитель на Уровень()=2
8 GStiv
 
03.11.15
15:09
Нет к сожалению ошибся, теряются итоги нижнего уровня
9 strh
 
03.11.15
15:13
ВЫБРАТЬ
    ВЫБОР
        КОГДА Номенклатура.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель = ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка)
            ТОГДА Номенклатура.Родитель.Родитель.Родитель.Родитель
        КОГДА Номенклатура.Родитель.Родитель.Родитель.Родитель.Родитель = ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка)
            ТОГДА Номенклатура.Родитель.Родитель.Родитель
        КОГДА Номенклатура.Родитель.Родитель.Родитель.Родитель = ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка)
            ТОГДА Номенклатура.Родитель.Родитель
        КОГДА Номенклатура.Родитель.Родитель.Родитель = ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка)
            ТОГДА Номенклатура.Родитель
        КОГДА Номенклатура.Родитель.Родитель = ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка)
            ТОГДА Номенклатура.Ссылка
        ИНАЧЕ "Нет второго уровня"
    КОНЕЦ КАК Родитель
ИЗ
    Справочник.Номенклатура КАК Номенклатура
ГДЕ
    Номенклатура.Ссылка = &Ссылка

Размнож на сколько тебе надо уровней
10 Ildarovich
 
03.11.15
15:18
Есть статья, которая называется Уровни, глубина, прародители, циклы и аналоги запросом. Вот ссылка http://catalog.mista.ru/public/160707/ . Там это задача 3 Определение прародителя (родителя верхнего уровня) в пакетном запросе . В запросе предлагается функция, которая строит запрос и выполняет его. Но на деле можно взять текст запроса, сформированный функцией и использовать его как статический, если зафиксировать предельную глубину иерархии Хоть 10, хоть 100 - от этого будет зависеть число блоков в запросе. Для 10 хватит 4-х блоков, а для 100 нужно будет 7.
Даже если в данной задаче не пригодится, будете иметь ввиду на будущее.
11 Ildarovich
 
03.11.15
15:39
+(10) Вот запрос для справочника не более 16-ти уровней:

ВЫБРАТЬ
    Номенклатура.Родитель КАК НачалоДуги,
    Номенклатура.Ссылка КАК КонецДуги
ПОМЕСТИТЬ ЗамыканияДлины1
ИЗ
    Справочник.Номенклатура КАК Номенклатура
ГДЕ
    Номенклатура.Родитель <> ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка)

ОБЪЕДИНИТЬ

ВЫБРАТЬ
    Номенклатура.Ссылка,
    Номенклатура.Ссылка
ИЗ
    Справочник.Номенклатура КАК Номенклатура
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ РАЗЛИЧНЫЕ
    ПерваяДуга.НачалоДуги,
    ВтораяДуга.КонецДуги
ПОМЕСТИТЬ ЗамыканияДлины2
ИЗ
    ЗамыканияДлины1 КАК ПерваяДуга
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ ЗамыканияДлины1 КАК ВтораяДуга
        ПО ПерваяДуга.КонецДуги = ВтораяДуга.НачалоДуги
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ РАЗЛИЧНЫЕ
    ПерваяДуга.НачалоДуги,
    ВтораяДуга.КонецДуги
ПОМЕСТИТЬ ЗамыканияДлины4
ИЗ
    ЗамыканияДлины2 КАК ПерваяДуга
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ ЗамыканияДлины2 КАК ВтораяДуга
        ПО ПерваяДуга.КонецДуги = ВтораяДуга.НачалоДуги
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ РАЗЛИЧНЫЕ
    ПерваяДуга.НачалоДуги,
    ВтораяДуга.КонецДуги
ПОМЕСТИТЬ ЗамыканияДлины8
ИЗ
    ЗамыканияДлины4 КАК ПерваяДуга
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ ЗамыканияДлины4 КАК ВтораяДуга
        ПО ПерваяДуга.КонецДуги = ВтораяДуга.НачалоДуги
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ РАЗЛИЧНЫЕ
    ПерваяДуга.НачалоДуги КАК Прародитель,
    ВтораяДуга.КонецДуги КАК Ссылка
ИЗ
    ЗамыканияДлины8 КАК ПерваяДуга
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ ЗамыканияДлины8 КАК ВтораяДуга
        ПО ПерваяДуга.КонецДуги = ВтораяДуга.НачалоДуги
ГДЕ
    ПерваяДуга.НачалоДуги <> ВтораяДуга.КонецДуги
    И ПерваяДуга.НачалоДуги.Родитель = ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка)

Решение кажется громоздким, но сложность подхода из (9) при росте числа уровней в итоге будет больше
12 GStiv
 
03.11.15
16:56
Спасибо всем Все получилось :)
Закон Брукера: Даже маленькая практика стоит большой теории.