| 
    
        
     
     | 
    
  | 
Избитая тема Получить родителя в запросе (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 
 | 
         
        Спасибо всем Все получилось :)     
         | 
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |