- •8.1. Назначение. Основные объекты , предназначенные для организации запросов
- •Выполнение запроса
- •8.2. Язык запросов
- •Поля из вложенных таблиц
- •Псевдонимы источников как/as
- •Запросы к табличным частям
- •Вложенные запросы в списке источников
- •Конструкция соединение...По/join...On
- •Левое внешнее соединение
- •Правое внешнее соединение
- •Полное внешнее соединение
- •Логические операторы и, или, не
- •Параметры в языке запросов
- •Проверка вхождения значения в список (в/in)
- •Проверка ссылочного значения (ссылка/ref)
- •Проверка пустых значений (есть null / is null)
- •Сравнение строк (подобно / like)
- •Упорядочивание по иерархии
- •Упорядочивание во вложенных таблицах
- •Автоупорядочивание /autoorder
- •Агрегатные функции в запросе
- •Общие итоги
- •Итоги по группировкам
- •Итоги по иерархии
- •Несколько итогов в запросе
- •Встроенные функции языка запросов
- •Операции выбора в языке запросов (выбор / case)
- •Приведение типов в языке запросов
- •Литералы и параметры в языке запросов
- •8.4. Обработка результата запроса
- •8.5. Выборка из результата запроса
- •Линейный обход
- •Иерархический обход
- •Обход по группировкам
- •Другие полезные методы
- •8.6. Выгрузка результата запроса
- •8.7. Запросы к регистрам сведений
- •Основная таблица регистра сведений
- •8.8. Запросы к регистрам накопления
- •Основная таблица регистра накопления
- •Сводные таблицы
Иерархический обход
Рассмотрим другой способ обхода результата запроса - иерархический. При данном варианте обходятся только записи, находящиеся на одном уровне. Для получения иерархической выборки из результата необходимо вызвать метод Выбрать объекта РезультатЗапроса с параметром ОбходРезультатаЗапроса.ПоГруппировкамСИерархией:
СпособВыборки = ОбходРезультатаЗапроса.ПоГруппировкамСИерархией;
Выборка = РезультатЗапроса.Выбрать(СпособВыборки);
Выборка из результата запроса с иерархическим обходом в нашем примере обойдет только записи с номерами 1 и 11, так как только эти две записи находятся на самом верхнем уровне.
Проиллюстрируем это, представив наш результат в виде дерева, где узлами будут итоговые записи, а листьями дерева будут детальные записи. Вот что у нас получится:
1 |
Сантехника |
104 |
-
2
Кран
84
-
3
Кран
10
4
Кран
8
5
Кран
44
6
Кран
22
-
7
Смеситель
20
-
8
Смеситель
5
9
Смеситель
1
10
Смеситель
14
11 |
Мебель |
134 |
-
12
Стол
26
13 |
Кран |
1 |
14 |
Кран |
15 |
15 |
Кран |
10 |
-
16
Стул
108
-
17
Стул
55
18
Стул
5
19
Стул
32
20
Стул
16
Из этого рисунка видно, что именно записи с номерами 1 и 11 находятся на первом уровне дерева, и поэтому только они попадают в первый проход иерархической выборки.
Возникает вопрос, как получить остальные записи результата запроса. Для этого у объекта ВыборкаИзРезультатаЗапроса можно получить еще одну выборку, которая будет обходить подчиненные записи текущей записи выборки. В нашем примере в момент, когда объект Выборка будет позиционирован на запись с номером 1, мы запросим у него иерархическую выборку. Таким образом, мы получим выборку, которая вернет записи с номерами 2, 7. А когда Выборка будет спозиционирована на запись с номером 11, то полученная у нее иерархическая выборка вернет записи с номерами 12, 16. Так реализуется иерархический обход результатов запроса
Заметим, что у выборки можно получать вложенные выборки любого типа. Так, если бы мы запросили у Выборки, спозиционированной на записи 1, линейную выборку, то с ее помощью мы бы получили записи с номерами со 2-го по 10-й.
Проиллюстрируем описанную методику на примере:
Процедура ВыдатьРекурсивно(Выборка) Далее;
Процедура ВыполнитьЗапрос ()
Запрос = Новый Запрос ("
ВЫБРАТЬ Товар, Количество
ИЗ Документ.РасходнаяНакладная.Состав
УПОРЯДОЧИТЬ ПО Товар
ИТОГИ СУММА(Количество) ПО Товар, Товар ИЕРАРХИЯ");
СпособВыборки = ОбходРезультатаЗапроса.ПоГруппировкамСИерархией;
Выборка = Запрос.Выполнить().Выбрать(СпособВыборки); ВыдатьРекурсивно(Выборка);
КонецПроцедуры
Процедура ВыдатьРекурсивно(Выборка)
Пока Выборка.Следующий() Цикл
//выведем в окно сообщений поля из результата
Товар = Выборка.Наименование;
Количество = Выборка.Количество;
Сообщить("Товар: " + СокрЛП(Товар) + "Количество: " + СокрЛП(Количество));
//продолжим выборку подчиненных записей
СпособВыборки = ОбходРезультатаЗапроса.ПоГруппировкамСИерархией;
ВыдатьРекурсивно(Выборка.Выбрать(СпособВыборки));
КонецЦикла;
КонецПроцедуры
