Три способи отримати дерево елементів ієрархічного довідника

Розглядається можливість застосування і недоліки таких способів отримання дерева
1) Запит з використанням підсумків по ієрархії
2) Формування дерева обходом вибірки з упорядкуванням за ієрархією
3) Формування ієрархії за списком елементів транзитивним замиканням

1) Ідея проста - вибираємо запитом елементи, які не є папками, а всю ієрархію нам побудує запит. Тут відразу починаються несподіванки. Яку конструкцію використовувати: ИЕРАРХИЯ або ТІЛЬКИ ИЕРАРХИЯ? Начебто логічно було б ТІЛЬКИ ИЕРАРХИЯ, тому що підсумки на рівні елементів нам не потрібні (будуть дублі). Заглядаємо в довідку: "Ієрархія. В результаті будуть розраховані підсумки по контрольним точкам і підсумки по ієрархії для контрольних точок. При необхідності можна розрахувати підсумки тільки значень за ієрархією, без розрахунку підсумків в контрольних точках. Для цього перед ключовим словом ИЕРАРХИЯ потрібно вказати ключове слово ТІЛЬКИ. "

Для однозначного розуміння моїх пояснень введу кілька "термінів", якими буду користуватися. Все листя дерева буду називати елементами. Вузли дерева, які містять тільки елементи - нижні папки, Решта вузли, які містять хоча б одну нижню папку - верхні папки.

Для ИЕРАРХИЯ - все логічно: розбираємо дерево підсумків по ієрархії для папок. У всіх папок тип - ТіпЗапісіЗапроса.ІтогПоІерархіі. У елементів тип - ТіпЗапісіЗапроса.ІтогПоГруппіровке. Усередині угруповання одна запис того ж елемента але вже з типом ТіпЗапісіЗапроса.ДетальнаяЗапісь. Все як заявлено. Але якщо вивантажити в дерево, дубль пропадає!

Або сформувати вручну

Для ТОЛЬКОІЕРАРХІЯ все трохи не так, як очікувалося. Верхні папки - ТіпЗапісіЗапроса.ІтогПоІерархіі, нижні - ТіпЗапісіЗапроса.ІтогПоГруппіровке. Усередині елементи з типом - ТіпЗапісіЗапроса.ДетальнаяЗапісь. АЛЕ, якщо верхня папка містить елементи, всі вони будуть поміщені в ще в одну вкладену групу з типом ТіпЗапісіЗапроса.ІтогПоГруппіровке. Тому вивантажити () призводить до дублювання! Мета такого дублювання думаю в тому, щоб всі елементи обов'язково містилися в папці з ТіпЗапісіЗапроса.ІтогПоГруппіровке, щоб ми могли обходити вибірку ОбходРезультатаЗапроса.ПоГруппіровкам. Тому, якщо використовувати ТІЛЬКИ ИЕРАРХИЯ. краще обійти вибірку і сформувати ручками дерево, усуваючи дублювання. При обході потрібно обов'язково вказувати другий параметр "Угруповання". Наводжу обхід для ТОЛЬКОІЕРАРХІЯ

Недоліки такого методу очевидні. Все папки обчислює запит, і ми не можемо якось їх використовувати. Наприклад, при з'єднанні з іншою таблицею по номенклатурі, склеются тільки елементи, а на рівні папок нам доступні тільки обчислення в підсумках. Проблема продуктивності тут не розглядається.

2) Для вирішення цієї проблеми необхідно вибрати папки в запиті. Такий запит не вийти вивантажити в дерево, але, якщо ми будемо використовувати в запиті УПОРЯДОЧИТЬ ПО. Ієрархія, а також виберемо в запиті батька, то обхід дерева стане простим, ми будемо обходити вибірку в циклі і причіплювати наступний елемент до поточного або одному з його батьків. До кого чіпляти покаже вибране поле батько.

Розглянемо задачу отримання тільки ієрархії по набору елементів. Для вирішення завдання виберемо для елементів все папки, в яких вони містяться, потім замиканням обчислимо всіх батьків цих папок, ну і далі вибірка з обходом по 2 методу.