Имя: Пароль:
1C
1С v8
К списку родителей присоединить все элементы в иерархии
0 Loko
 
26.09.17
05:19
Всем привет. Есть список Родителей номенклатуры (произвольным образом сформирован), как присоединить к нему все элементы в иерархии к каждому родителю?
1 mehfk
 
26.09.17
05:54
Запрос где?
2 Loko
 
26.09.17
06:03
я делаю отчет в скд. делаю через один набор данных. возможно неправильно так.
более подробно задача: есть документ "План продаж". Там табличная Часть, где реквизит Группа номенклатуры и Сумма (план). И нужно прикрутить сколько было продаж за период по каждой указанной группе (факт).

запрос встал пока так(

ВЫБРАТЬ РАЗЛИЧНЫЕ
    СТ_ПланыПродаж.План,
    СТ_ПланыПродаж.ГруппаНоменклатуры
ИЗ
    Документ.СТ_ПланыПродаж.Планы КАК СТ_ПланыПродаж
ГДЕ
    СТ_ПланыПродаж.Ссылка.Дата МЕЖДУ &НачалоПериода И &КонецПериода

а дальше как прикручивать продажи по каждой группе в сумме за период?
3 Мимохожий Однако
 
26.09.17
06:19
Добавь условие В ИЕРАРХИИ (&МассивГруппНоменклатурыИзТЧ)
4 Loko
 
26.09.17
06:21
(3) а в СКД как этот массив добавить?
5 Мимохожий Однако
 
26.09.17
06:56
(4) Запросом к табличной части документа
6 Loko
 
26.09.17
08:40
(5) хорошо, условие добавлю. отберу номенклатуру. но как потом соединить полученный список номенклатуры со списком родителей? номенклатура же на разных уровнях может быть, у каждой свой родитель...
7 Loko
 
26.09.17
09:11
вот так сделал. но очень долго работает:

"ВЫБРАТЬ РАЗЛИЧНЫЕ
        |    ГруппыНоменклатуры.ГруппаНоменклатуры
        |ПОМЕСТИТЬ Родители
        |ИЗ
        |    &ГруппыНоменклатуры КАК ГруппыНоменклатуры
        |;
        |
        |////////////////////////////////////////////////////////////////////////////////
        |ВЫБРАТЬ
        |    Номенклатура.Ссылка,
        |    Номенклатура.Родитель,
        |    Родители.ГруппаНоменклатуры
        |ИЗ
        |    Справочник.Номенклатура КАК Номенклатура
        |        ЛЕВОЕ СОЕДИНЕНИЕ Родители КАК Родители
        |        ПО (Родители.ГруппаНоменклатуры = Номенклатура.Родитель)
        |                ИЛИ (Родители.ГруппаНоменклатуры = Номенклатура.Родитель.Родитель)
        |                ИЛИ (Родители.ГруппаНоменклатуры = Номенклатура.Родитель.Родитель.Родитель)
        |                ИЛИ (Родители.ГруппаНоменклатуры = Номенклатура.Родитель.Родитель.Родитель.Родитель)
        |                ИЛИ (Родители.ГруппаНоменклатуры = Номенклатура.Родитель.Родитель.Родитель.Родитель.Родитель)
        |                ИЛИ (Родители.ГруппаНоменклатуры = Номенклатура.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель)
        |                ИЛИ (Родители.ГруппаНоменклатуры = Номенклатура.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель)
        
        |ГДЕ
        |    Номенклатура.Ссылка В ИЕРАРХИИ(&ГруппыНоменклатуры)
        |    И Номенклатура.ЭтоГруппа = ЛОЖЬ";
8 Loko
 
26.09.17
09:12
может кто подскажет как оптимальнее сделать?
9 DrShad
 
26.09.17
09:44
ВЫБРАТЬ
    Номенклатура.Ссылка
ПОМЕСТИТЬ Родители
ИЗ
    Справочник.Номенклатура КАК Номенклатура
ГДЕ
    Номенклатура.Ссылка В(&мРодителей)
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    Номенклатура.Ссылка КАК Элемент
ПОМЕСТИТЬ Элементы
ИЗ
    Справочник.Номенклатура КАК Номенклатура
ГДЕ
    Номенклатура.Ссылка В ИЕРАРХИИ
            (ВЫБРАТЬ
                Родители.Ссылка
            ИЗ
                Родители)
    И НЕ Номенклатура.ЭтоГруппа
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    Номенклатура.Ссылка КАК РодителиНижнегоУровня,
    ВЫБОР
        КОГДА Номенклатура.Родитель = ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка)
            ТОГДА Номенклатура.Ссылка
        ИНАЧЕ Номенклатура.Родитель
    КОНЕЦ КАК Родитель
ПОМЕСТИТЬ ТаблицаРодителей
ИЗ
    Справочник.Номенклатура КАК Номенклатура
ГДЕ
    Номенклатура.ЭтоГруппа
    И Номенклатура.Ссылка В ИЕРАРХИИ
            (ВЫБРАТЬ
                Родители.Ссылка
            ИЗ
                Родители)
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    Элементы.Элемент,
    ТаблицаРодителей.Родитель
ИЗ
    ТаблицаРодителей КАК ТаблицаРодителей
        ЛЕВОЕ СОЕДИНЕНИЕ Элементы КАК Элементы
        ПО ТаблицаРодителей.РодителиНижнегоУровня = Элементы.Элемент.Родитель
10 DrShad
 
26.09.17
09:45
как-то так
11 Loko
 
26.09.17
10:32
(10) спасибо!
12 Loko
 
26.09.17
10:37
(10) хотя не работает, если уровней больше 2-х.
13 DrShad
 
26.09.17
10:37
(12) да ладно
14 DrShad
 
26.09.17
10:40
действительно, ща поправим
15 Ildarovich
 
26.09.17
11:14
Еще вот этот подход http://catalog.mista.ru/public/158512/ для развития кругозора можно посмотреть, хотя при большом количестве элементов справочника тоже может быть долго.
16 DrShad
 
26.09.17
11:47
проще всего собрать таблицу отношений всех групп к родителям верхнего уровня и ее загнать в запрос
17 Ildarovich
 
26.09.17
11:54
(16) в (15) это делается запросом. Таблица называется "транзитивное замыкание"
18 Radkt
 
26.09.17
12:35
(0) Почему нельзя список групп загнать в массив и сделать отбор по ним и иерархические итоги по номенклатуре??
19 Radkt
 
26.09.17
12:36
в (3) видимо так же предложили
20 DrShad
 
26.09.17
12:38
(18), (19) сделай пример
21 DrShad
 
26.09.17
12:39
(17) это понятно, но там ограничение на уровень вложенности, а если верхнего родителя искать рекурсией, то ограничений не будет
22 Radkt
 
26.09.17
12:49
(21)ну да если всю иерархию выводить не нужно, то не подойдет
23 Ildarovich
 
26.09.17
13:19
(21) Ограничений на самом деле нет, поскольку каждый каскад там увеличивает число уровней вдвое, поэтому взяв пять каскадов, получим решение для максимум 32-х уровней. Для практических целей это более чем достаточно. Параноики могут использовать десять каскадов - 1024 уровня. Не думаю, что где-либо используется такой "глубокий" справочник.