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

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

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

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

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

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

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

 

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

 

 Рекурсия

 

 Запрос

 

 Пример итогового запроса

 

11 Comments

  1. TMV

    Подумал что запросом, а тут велосипед — низачот.

    Reply
  2. alex15650

    Да здравствуют запросы в цикле! ))

    Reply
  3. obsfromekb

    (2) в реализации 1 запрос для всех элементов справочника на 1 уровень вложенности.

    Что Вы предлагаете?

    Reply
  4. obsfromekb

    (1) Запросом и есть, но количество уровней заранее нам неизвестно. Предлагаете в рекурсии формировать текст запроса? Или что?

    Reply
  5. obsfromekb

    Добавил вариант реализации запросом, скорость возросла в несколько раз, но код стал плохо читаемым.

    Reply
  6. dhurricane
  7. timm00

    Автор не в курсе что есть ИТОГИ ПО Ссылка ИЕРАРХИЯ?))

    Reply
  8. obsfromekb

    (7)

    ИТОГИ ПО Ссылка ИЕРАРХИЯ

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

    Reply
  9. obsfromekb

    (6) Интересная реализация по ссылке, но в публикации на момент Вашего комментария уже была другая, на основе динамического формирования пакетного запроса. Не берусь утверждать что сработает быстрее, нужно тестировать. В любом случае, думаю, что будет близко.

    К тому же в реализации по ссылке функция возвращает несколько иную информацию (только 1 родитель). Безусловно, её можно доработать под конкретные нужды, но с учетом того как именно формируется запрос, сделать это будет просто не для каждого. С моей же функцией разберётся любой, т.к. нужное количество родителей можно получить просто задав параметр функции.

    Reply
  10. dhurricane

    (9) Зависит от объема оперируемых данных и уровня вложенности справочника.

    В реализации по ссылке для получения родителей, например, 8-го уровня вложенности будет сгенерировано 3 запроса пакета, у Вас — все 8.

    Reply
  11. obsfromekb

    (10) Я не настаиваю, что мой запрос быстрее, нужно замерять, возможно, что это не так. В моём запросе больше уровней вложенности, зато используются только левые соединения, а каждый следующий запрос обрабатывает таблицу с меньшим количеством строк.

    В любом случае, спасибо за ссылку, к сожалению не нашел её вовремя. Если будет свободное время, то сопоставлю со своим методом и приложу информацию здесь.

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *