Имя: Пароль:
1C
1С v8
Построение произвольной иерархии по произвольным данным с помощью СКД
,
0 Said_We
 
05.04.18
10:01
Почитал эти источники возможных вариантов реализации:
https://start1c.blogspot.ru/2017/01/blog-post.html?showComment=1522845089443#c5080926997711571763
http://catalog.mista.ru/public/242824/

Необходимо следующее:
На входе таблица Родитель, Элемент. Для простоты понимания пусть будет вот эта таблица (в СКД "НаборДанных1"):

ВЫБРАТЬ 0 КАК Родитель, 1 КАК Элемент
ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 0, 2
ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 0, 3
ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 1, 11
ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 1, 12
ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 2, 21
ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 2, 22
ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 11, 111
ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 11, 112

Связи набора указываем:
Источник связи: НаборДанных1
Приемник связи: НаборДанных1
Выражение источник: Элемент
Выражение приемник: Родитель

Настройки:
Отчет
    Родитель (Иерархия)
        <Детальные записи>

На не управляемую форму обработки помещена кнопка "Обновить" и Дерево значений.
По кнопке следующий код:

Процедура кнОбновитьНажатие(Элемент)
    СКД = ЭтотОбъект.ПолучитьМакет(Макет1); // В Макет1 описанное выше.
    Настройки = СКД.НастройкиПоУмолчанию;
    КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
    МакетКомпановки = КомпоновщикМакета.Выполнить(СКД, Настройки, , , Тип(ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений));
    ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
    ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпановки);
    ПроцессВывода = Новый ПроцессВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
    ПроцессВывода.УстановитьОбъект(ДЗ);
    ДЗ = ПроцессВывода.Вывести(ПроцессорКомпоновкиДанных, Истина);
    ЭлементыФормы.ДЗ.СоздатьКолонки();
КонецПроцедуры

В результате нажатия на кнопку не получается вывести вложенную иерархию. Получается вот так:
- 0
    0, 1
    0, 2
    0, 3
- 1
    1, 11
    1, 12
- 2
    2, 21
    2, 22
и т.д.

А требуется:
- 0
  - 1
    - 11
      - 111
      - 112
    - 12
  - 2
    - 21
    - 22
    3
1 Said_We
 
05.04.18
10:27
А в ответ тишина....
2 Said_We
 
05.04.18
11:00
Может что-то пояснить требуется....
3 Said_We
 
05.04.18
12:02
За два часа тишина..... Это что-то новенькое.
4 VS-1976
 
05.04.18
12:53
Оно и не должно получиться...
5 Said_We
 
05.04.18
13:59
(4) Причина какая?
В примерах в (0) все получается.
6 VS-1976
 
05.04.18
14:11
(5) Подумай какие имена полей у тебя будет после соединения, и какие ты выводишь. По какому полю у тебя группировка идёт. Разбери ссылки внимательнее
7 Said_We
 
05.04.18
14:17
(6) Я уже ссылки смотрел внимательно. В ссылках приводится пример, но не приводится достаточных пояснений как и почему тем или иным образом ведет себя СКД. Рабочий пример на данных БД у меня есть. Он дает требуемый результат, но сам запрос, который данные вытаскивает, присоединяет много всего дополнительного и т.д. сложнее чем в примерах в (0).
Поэтому я и взял пример в (0) оторванный от жизни, что бы понять сам механизм, не задумываясь о природе данных.
8 Said_We
 
05.04.18
14:22
(6) При этом тот пример что у меня есть. Иногда дерево строит не верно. В частности может получаться следующий вариант.

- 0
  - 1
    - 11
      - 11 (тут лишний элемент)
      - 111
      - 112
    - 12
  - 2
    - 2 (тут лишний элемент)
    - 21
    - 22
  - 3

При этом, как в примере в ссылках в (0) есть отбор, который говорит, начиная с какого уровня формировать дерево. Так вот в зависимости от того с какого уровня дерево строится ошибка формирования с лишними элементами на одних и тех же данных может как проявляться, так и не проявляться. Источник данных РС.
9 Said_We
 
05.04.18
14:25
Ситуация похожа на вот эту.
https://www.forum.mista.ru/topic.php?id=797608
10 Said_We
 
05.04.18
18:21
Получилось-таки.
11 Said_We
 
06.04.18
09:16
Получилось.
Для того что бы получилось, необходимо (0)+(9)+...(ссылки не сохранились).