Структура иерархического справочника запросом

19.04.13

Разработка - Запросы

Вариант получения запросом структуры иерархического справочника в виде плоской таблицы с динамическим количеством колонок по фактическому максимальному уровню иерархии элементов/групп справочника.

Допустим имеем иерархический справочник "Подразделения" с неизвестным (неограниченным) уровнем вложенности:

Подр1

Подр11

Подр12

Подр121

Подр122

Подр13

...

ПодрN

И требуется получить таблицу следующей структуры:

Подразделение Уровень
0
Уровень
1
Уровень
2
... Уровень
Макс-1
Уровень
Макс
Подр1 Подр1          
Подр11 Подр1 Подр11        
Подр12 Подр1 Подр12        
Подр121 Подр1 Подр12 Подр121      
Подр122 Подр1 Подр12 Подр122      
...            
ПодрN ПодрN          

 

Пример:

Пример

 

Предлагаю следующий вариант решения:


// Определим максимальный уровень иерархии справочника
Запрос = Новый Запрос;
Запрос.Текст =
    "ВЫБРАТЬ
    |   Подразделения.Ссылка
    |ИЗ
    |   Справочник.Подразделения КАК Подразделения";
Результат = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = Результат.Выбрать();
МаксУровень = 0;
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
    МаксУровень = Макс(ВыборкаДетальныеЗаписи.Ссылка.Уровень(), МаксУровень);
КонецЦикла;

// Соберем текст запроса для получения следующей структуры полей выборки:
//      Подразделение, Уровень0, Уровень1, ..., УровеньN-1, УровеньN.
// где N - максимальный уровень иерархии.

// Начало текста запроса
Запрос.Текст =
    "ВЫБРАТЬ
    |   *
    |ИЗ
    |   (";
// Нулевой уровень иерархии
ТекущийУровень = 0;
Запрос.Текст = Запрос.Текст + "
    |ВЫБРАТЬ
    |   Подразделения.Ссылка КАК Подразделение
    |   , Подразделения.Ссылка КАК Уровень0";
Для Сч=1 По МаксУровень Цикл
    Запрос.Текст = Запрос.Текст + "
        |   , ЗНАЧЕНИЕ(Справочник.Подразделения.ПустаяСсылка) КАК Уровень"+Сч;
КонецЦикла;
Запрос.Текст = Запрос.Текст + "
    |ИЗ
    |   Справочник.Подразделения КАК Подразделения
    |ГДЕ
    |   Подразделения.Родитель = ЗНАЧЕНИЕ(Справочник.Подразделения.ПустаяСсылка)";
// Последующие уровни иерархии.
Для ТекущийУровень = 1 По МаксУровень Цикл
    Запрос.Текст = Запрос.Текст + "
        |
        |ОБЪЕДИНИТЬ ВСЕ
        |
        |ВЫБРАТЬ
        |   Подразделения.Ссылка КАК Подразделение";
    Для Сч1=0 По ТекущийУровень-1 Цикл
        Запрос.Текст = Запрос.Текст + "
        |   , Подразделения";
        Для Сч2=1 по ТекущийУровень-Сч1 Цикл
            Запрос.Текст = Запрос.Текст + ".Родитель";
        КонецЦикла;
        Запрос.Текст = Запрос.Текст + " КАК Уровень"+Сч1;
    КонецЦикла;
    Запрос.Текст = Запрос.Текст + "
        |   , Подразделения.Ссылка КАК Уровень"+ТекущийУровень;
    Для Сч=ТекущийУровень+1 По МаксУровень Цикл
        Запрос.Текст = Запрос.Текст + "
            |   , ЗНАЧЕНИЕ(Справочник.Подразделения.ПустаяСсылка) КАК Уровень"+Сч;
    КонецЦикла;
    Запрос.Текст = Запрос.Текст + "
        |ИЗ
        |   Справочник.Подразделения КАК Подразделения
        |ГДЕ
        |   Подразделения.Родитель";
    Для Сч2=1 по ТекущийУровень Цикл
        Запрос.Текст = Запрос.Текст + ".Родитель";
    КонецЦикла;
    Запрос.Текст = Запрос.Текст + " = ЗНАЧЕНИЕ(Справочник.Подразделения.ПустаяСсылка)";
КонецЦикла;
// Финиш текста запроса
Запрос.Текст = Запрос.Текст + "
    |   ) КАК Структура
    |УПОРЯДОЧИТЬ ПО
    |   Структура.Уровень0.Наименование";
Для Сч=1 По МаксУровень Цикл
    Запрос.Текст = Запрос.Текст + "
        |   , Структура.Уровень"+Сч+".Наименование";
КонецЦикла;

Результат = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = Результат.Выбрать();

Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
    // Обход выборки.
КонецЦикла;

 

У данного решения есть минусы, которые я пока не смог обойти:

1. Первоначально надо получить максимальный уровень иерархии справочника, а сделать это запросом я не смог. Пришлось предварительно перебирать все элементы и проверять их уровень.

2. При большом максимальном уровне вложенности может быть будут проблемы с запросом (в местах, где множится "...Родитель.Родитель.Родитель..."). Я тестировал на 20 уровне вложенности.

См. также

Infostart Toolkit: Инструменты разработчика 1С 8.3 на управляемых формах

Инструментарий разработчика Роли и права Запросы СКД Платформа 1С v8.3 Управляемые формы Запросы Система компоновки данных Конфигурации 1cv8 Платные (руб)

Набор инструментов программиста и специалиста 1С для всех конфигураций на управляемых формах. В состав входят инструменты: Консоль запросов, Консоль СКД, Консоль кода, Редактор объекта, Анализ прав доступа, Метаданные, Поиск ссылок, Сравнение объектов, Все функции, Подписки на события и др. Редактор запросов и кода с раскраской и контекстной подсказкой. Доработанный конструктор запросов тонкого клиента. Продукт хорошо оптимизирован и обладает самым широким функционалом среди всех инструментов, представленных на рынке.

10000 руб.

02.09.2020    124790    681    389    

732

Пропорциональное распределение в запросе с использованием АвтоНомерЗаписи()

Запросы Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Часто поступают задачи по произвольному распределению общих сумм. После распределения иногда пропадают копейки. Суть решения добавить АвтоНомерЗаписи() в ВТ распределения, и далее используя функции МАКСИМУМ или МИНИМУМ можем положить разницу копеек в первую или последнюю строку знаменателя распределения.

11.04.2024    2177    andrey_sag    10    

28

Для чего используют конструкцию запроса "ГДЕ ЛОЖЬ" в СКД на примере конфигурации 1С:ERP

Запросы СКД Платформа 1С v8.3 Запросы Система компоновки данных 1С:ERP Управление предприятием 2 Бесплатно (free)

В типовых конфигурациях разработчики компании 1С иногда используют в отчетах, построенных на СКД, такую конструкцию, как "ГДЕ ЛОЖЬ". Такая конструкция говорит о том, что данные в запросе не будут получены совсем. Для чего же нужен тогда запрос?

13.02.2024    5988    KawaNoNeko    23    

25

Набор-объект для СКД по тексту или запросу

Запросы СКД Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Абонемент ($m)

Есть список полей в виде текста, или запрос - закидываем в набор СКД.

1 стартмани

31.01.2024    2144    2    Yashazz    0    

30

Запрос 1С copilot

Инструментарий разработчика Запросы Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Абонемент ($m)

Пишем на человеческом языке, что нам надо, и получаем текст запроса на языке 1С. Используются большие языковые модели (LLM GPT) от OpenAI или Яндекс на выбор.

5 стартмани

15.01.2024    6619    31    mkalimulin    27    

51

PrintWizard: поддержка представлений ЗУП в конструкторе

Инструментарий разработчика Запросы Платформа 1С v8.3 Бесплатно (free)

Одной из интересных задач, стоящих в процессе разработки, была поддержка механизма представлений в ЗУП. Но не просто возможность исполнения запросов с ними. Основная проблема была в том, чтобы с ними было удобно работать, а именно: создавать, модифицировать и отлаживать. Кратко о том, что в итоге получилось...

14.12.2023    1876    vandalsvq    7    

29

Объектная модель запроса "Схема запроса" 2

Запросы Платформа 1С v8.3 Запросы Конфигурации 1cv8 Бесплатно (free)

Далеко уже не новый тип данных "Схема запроса". Статья о том, как использовать его "попроще". Примеры создания текста запроса с нуля и изменение имеющегося запроса.

06.12.2023    5622    user1923546    26    

46

Начните уже использовать хранилище запросов

HighLoad оптимизация Запросы

Очень немногие из тех, кто занимается поддержкой MS SQL, работают с хранилищем запросов. А ведь хранилище запросов – это очень удобный, мощный и, главное, бесплатный инструмент, позволяющий быстро найти и локализовать проблему производительности и потребления ресурсов запросами. В статье расскажем о том, как использовать хранилище запросов в MS SQL и какие плюсы и минусы у него есть.

11.10.2023    16582    skovpin_sa    14    

101
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. пользователь 19.04.13 21:51
Сообщение было скрыто модератором.
...
2. AlexProg 113 19.04.13 22:07 Сейчас в теме
(1) Eugeneer, чья бы корова мычала, твоя бы молчала.
+
3. ildarovich 7861 20.04.13 22:49 Сейчас в теме
В статье Уровни, глубина, прародители, циклы и аналоги запросом показано, как одним запросом быстро получить в том числе и максимальный уровень справочника.
CratosX; +1
Оставьте свое сообщение