Имя: Пароль:
1C
1С v8
Рекурсивный вывод группировок в СКД
0 AlexShapOld
 
07.12.22
20:38
Добрый день!

Есть набор данных связанных с собой :


!Глава    !  Подчинен ! Уровень !
---------------------------------
! А       !           !    1    !          
! Б       !      А    !    2    !          
! В       !      Б    !    3    !          
! Г       !           !    1    !          
! Д       !           !    1    !          
! Е       !      Д    !    2    !          
! И       !           !    1    !          

и т.д. я думаю принцип понятен. Потчиненные могут быть, на разном уровне, а могут и не быть.

Мне Необходимо на СКД выводить подчиненную группировку типа:

А Уровень 1
  +
    Б Уровень 2
     +
      В Уровень 3
Г Уровень 1
Д Уровень 1
+
  Е Уровень 2
И Уровень 1    


Я тут схематично написал, надеюсь понятно. Просто не понял, как в сообщении вводить по другому.
1 AlexShapOld
 
07.12.22
20:53
Подскажите пожалуйста, как это сделать? И возможно ли это сделать?
2 fly7
 
07.12.22
21:49
для каждого уровня сделать свою ВТ, в выборке собрать в плоскую таблицу, для каждого уровня свой столбец
3 fly7
 
07.12.22
22:02
ТипСтр = Новый ОписаниеТипов("Строка",,,, Новый КвалификаторыСтроки(20));
    ТипЧис = Новый ОписаниеТипов("Число",,, Новый КвалификаторыЧисла(10, 2));
    
    Таб = Новый ТаблицаЗначений;
    Таб.Колонки.Добавить("Глава", ТипСтр);
    Таб.Колонки.Добавить("Родитель", ТипСтр);
    Таб.Колонки.Добавить("Уровень", ТипЧис);
    
    Нов = Таб.Добавить(); Нов.Глава = "А"; Нов.Родитель =  ""; Нов.Уровень = 1;
    Нов = Таб.Добавить(); Нов.Глава = "Б"; Нов.Родитель = "А"; Нов.Уровень = 2;
    Нов = Таб.Добавить(); Нов.Глава = "В"; Нов.Родитель = "Б"; Нов.Уровень = 3;
    Нов = Таб.Добавить(); Нов.Глава = "Г"; Нов.Родитель =  ""; Нов.Уровень = 1;
    Нов = Таб.Добавить(); Нов.Глава = "Д"; Нов.Родитель =  ""; Нов.Уровень = 1;
    Нов = Таб.Добавить(); Нов.Глава = "Е"; Нов.Родитель = "Д"; Нов.Уровень = 2;
    Нов = Таб.Добавить(); Нов.Глава = "И"; Нов.Родитель =  ""; Нов.Уровень = 1;
    
    Запрос = Новый Запрос;
    Запрос.УстановитьПараметр("Таб", Таб);
    Запрос.Текст =
        "ВЫБРАТЬ
        |    Таб.Глава КАК Глава,
        |    Таб.Родитель КАК Родитель,
        |    Таб.Уровень КАК Уровень
        |ПОМЕСТИТЬ Таб
        |ИЗ
        |    &Таб КАК Таб
        |;
        |
        |////////////////////////////////////////////////////////////////////////////////
        |ВЫБРАТЬ
        |    Таб.Глава КАК Глава,
        |    Таб.Родитель КАК Родитель,
        |    Таб.Уровень КАК Уровень
        |ПОМЕСТИТЬ ВТ_1
        |ИЗ
        |    Таб КАК Таб
        |ГДЕ
        |    Таб.Уровень = 1
        |;
        |
        |////////////////////////////////////////////////////////////////////////////////
        |ВЫБРАТЬ
        |    Таб.Глава КАК Глава,
        |    Таб.Родитель КАК Родитель,
        |    Таб.Уровень КАК Уровень
        |ПОМЕСТИТЬ ВТ_2
        |ИЗ
        |    Таб КАК Таб
        |ГДЕ
        |    Таб.Уровень = 2
        |;
        |
        |////////////////////////////////////////////////////////////////////////////////
        |ВЫБРАТЬ
        |    Таб.Глава КАК Глава,
        |    Таб.Родитель КАК Родитель,
        |    Таб.Уровень КАК Уровень
        |ПОМЕСТИТЬ ВТ_3
        |ИЗ
        |    Таб КАК Таб
        |ГДЕ
        |    Таб.Уровень = 3
        |;
        |
        |////////////////////////////////////////////////////////////////////////////////
        |ВЫБРАТЬ
        |    ВТ_1.Глава КАК Глава1,
        |    ВТ_2.Глава КАК Глава2,
        |    ВТ_3.Глава КАК Глава3
        |ИЗ
        |    ВТ_1 КАК ВТ_1
        |        ЛЕВОЕ СОЕДИНЕНИЕ ВТ_2 КАК ВТ_2
        |            ЛЕВОЕ СОЕДИНЕНИЕ ВТ_3 КАК ВТ_3
        |            ПО ВТ_2.Глава = ВТ_3.Родитель
        |        ПО ВТ_1.Глава = ВТ_2.Родитель";
    
    Выборка = Запрос.Выполнить().Выгрузить();
4 fly7
 
07.12.22
22:03
в скд подсунуть выборку через Набор данных - объект
5 toypaul
 
гуру
08.12.22
08:58
6 AlexShapOld
 
08.12.22
12:13
Спасибо большое. Буду пробовать
7 AlexShapOld
 
08.12.22
16:56
Попробовал способом предложенным в (5).

Но что-то у меня не выводит иерархию.

Первый набор данных1;

ВЫБРАТЬ
    РегистрацияРеферала.ИнвесторРеферал КАК Инвестор,
    РегистрацияРеферала.Уровень КАК Уровень
ИЗ
    РегистрСведений.РегистрацияРеферала КАК РегистрацияРеферала
ГДЕ
    РегистрацияРеферала.ИнвесторРеферал = РегистрацияРеферала.ИнвесторРеферер

При равенстве РегистрацияРеферала.ИнвесторРеферал = РегистрацияРеферала.ИнвесторРеферер означает, что  он имеет 1 верхний уровень.
ИнвесторРеферер это верхний в иерархии и имеет подчиненных ИнвсеторовРефералов


Второй набор данных:

ВЫБРАТЬ
    ШАА_РегистрацияРеферала.ИнвесторРеферал КАК Инвестор,
    ШАА_РегистрацияРеферала.ИнвесторРеферер КАК Реферер,
    ШАА_РегистрацияРеферала.Уровень КАК Уровень
ИЗ
    РегистрСведений.ШАА_РегистрацияРеферала КАК ШАА_РегистрацияРеферала
ГДЕ
    ШАА_РегистрацияРеферала.ИнвесторРеферал В(&Инвестор)


На вкладке Связи наборов данных сделал:

Источник           Приемник          Выражение источник  Выражение приемник   Параметр        
Набор 2             Набор 2           Реферер              Инвестор             Инвестор
Набор 1             Набор   2         Инвестор             Инвестор             Инвестор            


На вкладке настройки:

Отчет
  
   Детальные записи

И везде авто поля.


Но не выводит он иерархию как в примере на its. Я и пытался по-разному связь настроить. Не выводит, только верхний уровень.
8 AlexShapOld
 
08.12.22
16:57
Выводит только верхний уровень. Или я не правильно понимаю построение связей в наборах. Может кто сможет показать мне  нужное направление.
9 Прохожий
 
08.12.22
19:47
(8) См 5 ....
10 AlexShapOld
 
09.12.22
13:19
(9) Все делаю по (5). Но не выходит. Может из-за того, что у меня источник это регистр сведений? Я скачал пример с (5). Все делаю как там. Но не формирует иерархию.
11 mistеr
 
09.12.22
14:52
Нужно один набор и соединять сам с собой.
12 AlexShapOld
 
09.12.22
17:34
(11) Не прокатило. Думаю из-за того, что у меня регистр сведений.

Сделал по принципу предложенному в (3). Спасибо за помощь.
Пользователь не знает, чего он хочет, пока не увидит то, что он получил. Эдвард Йодан