Иерархия справочника Сверху Вниз. Получаем произвольное количество родителей "верхнего" уровня

Публикация № 1029975

Программирование - Практика программирования

Функция справочник рекурсия иерархия родитель

6
Иерархия справочника Сверху Вниз. Функция для получения произвольного количества родителей "верхнего" уровня. На примере справочника "Номенклатура".

Доброго времени суток!

Часто при формировании отчетов необходимо вывести информацию по справочнику в разрезе иерархии, но работать с таким отчетом не всегда удобно, т.к. уровень вложенности различных элементов справочника может значительно отличаться. Для формирования отчетов по справочнику "Номенклатура" я разработал функцию, позволяющую рекурсивно получить таблицу значений с произвольным количеством родителей элементов справочника.

Возможно, что кому-то это пригодится и сэкономит некоторое количество времени.

Спасибо за внимание :)

P.S. советы/замечания по реализации алгоритма приветствуются в комментариях.

 

upd (29.03.2019): По совету из комментариев добавил версию без рекурсии, она работает в несколько раз быстрее. Тем не менее версия с рекурсией определенно имеет право на жизнь, т.к. в такой функции можно помимо получения иерархии добавить любые арифметические операции, вызовы сторонних функций и т.д. Код является более читабельным и "удобоваримым".

 
 Рекурсия
 
 Запрос
 
 Пример итогового запроса

 

6

См. также

Специальные предложения

Комментарии
Избранное Подписка Сортировка: Древо
1. TMV 14 28.03.19 16:43 Сейчас в теме
Подумал что запросом, а тут велосипед - низачот.
4. obsfromekb 16 29.03.19 08:21 Сейчас в теме
(1) Запросом и есть, но количество уровней заранее нам неизвестно. Предлагаете в рекурсии формировать текст запроса? Или что?
2. alex15650 134 28.03.19 17:48 Сейчас в теме
Да здравствуют запросы в цикле! ))
3. obsfromekb 16 29.03.19 08:20 Сейчас в теме
(2) в реализации 1 запрос для всех элементов справочника на 1 уровень вложенности.
Что Вы предлагаете?
9. obsfromekb 16 03.04.19 14:32 Сейчас в теме
(6) Интересная реализация по ссылке, но в публикации на момент Вашего комментария уже была другая, на основе динамического формирования пакетного запроса. Не берусь утверждать что сработает быстрее, нужно тестировать. В любом случае, думаю, что будет близко.
К тому же в реализации по ссылке функция возвращает несколько иную информацию (только 1 родитель). Безусловно, её можно доработать под конкретные нужды, но с учетом того как именно формируется запрос, сделать это будет просто не для каждого. С моей же функцией разберётся любой, т.к. нужное количество родителей можно получить просто задав параметр функции.
10. dhurricane 03.04.19 14:41 Сейчас в теме
(9) Зависит от объема оперируемых данных и уровня вложенности справочника.

В реализации по ссылке для получения родителей, например, 8-го уровня вложенности будет сгенерировано 3 запроса пакета, у Вас - все 8.
11. obsfromekb 16 03.04.19 15:25 Сейчас в теме
(10) Я не настаиваю, что мой запрос быстрее, нужно замерять, возможно, что это не так. В моём запросе больше уровней вложенности, зато используются только левые соединения, а каждый следующий запрос обрабатывает таблицу с меньшим количеством строк.
В любом случае, спасибо за ссылку, к сожалению не нашел её вовремя. Если будет свободное время, то сопоставлю со своим методом и приложу информацию здесь.
5. obsfromekb 16 29.03.19 11:18 Сейчас в теме
Добавил вариант реализации запросом, скорость возросла в несколько раз, но код стал плохо читаемым.
7. timm00 109 01.04.19 15:42 Сейчас в теме
Автор не в курсе что есть ИТОГИ ПО Ссылка ИЕРАРХИЯ?))
8. obsfromekb 16 03.04.19 14:27 Сейчас в теме
(7)
ИТОГИ ПО Ссылка ИЕРАРХИЯ

Держите в курсе... Особенно что касается производительности, хотя и результаты запроса могут Вас удивить.
Оставьте свое сообщение