Файл: Хрусталева Е. Ю. Язык запросов 1С-Предприятия 8 (2013).pdf
ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 12.03.2019
Просмотров: 51811
Скачиваний: 8725
Поэтому существует несколько разных способов обхода выборки – в линейном порядке, в
иерархическом порядке или по группировкам. Тип обхода выборки задается значением
системного перечисления ОбходРезультатаЗапроса и передается в качестве параметра
в метод Выбрать() объекта РезультатЗапроса.
При линейном обходе выборки будут последовательно получаться все записи из
результата запроса, при иерархическом обходе получаются только записи результата
запроса, находящиеся на одном уровне иерархии, при обходе по группировкам будут
получены только родительские записи, являющие групповыми итогами. Различные
способы обхода выборки и их отличие друг от друга представлены на рис. 2.33.
Рассмотрим эти варианты обхода выборки на примере запроса, в котором выводятся
наименования товаров и количество их поступления из состава приходных накладных и
рассчитываются иерархические итоги по полю Товар (листинг 2.20).
Листинг 2.20. Текст запроса
Результат запроса представлен в таблице 2.1, в которой каждую запись мы снабдили
порядковым номером для ее идентификации в результате запроса. Итоговые записи в
таблице выделены курсивом, итоговые записи для иерархических уровней справочника
выделены жирным шрифтом.
Таблица 2.1. Результат запроса
№
Товар
Количество
1
Обувь
60
2
Туфли
15
3
Туфли
5
4
Туфли
10
5
Сапоги
10
6
Сапоги
5
7
Сапоги
5
8
Кроссовки
35
9
Кроссовки
15
10
Кроссовки
20
11
Продукты
200
12
Масло
50
13
Масло
20
14
Масло
30
15
Молоко
80
16
Молоко
30
17
Молоко
50
18
Сметана
70
19
Сметана
50
20
Сметана
20
На следующей схеме для сравнения представлены все три вида обхода выборки из этого
результата запроса, в каждом из них цветом выделены те записи, которые попадут в
выборку (рис. 2.33).
Рис. 2.33. Виды обхода выборки из результата запроса
Рассмотрим каждый вид обхода выборки более подробно.
Линейный (прямой) порядок обхода
Линейный обход результата запроса – самый простой способ обхода выборки. При
линейном обходе выборка будет выдавать записи в той последовательности, в которой
они располагаются в результате запроса. В нашем примере (см. рис. 2.33) это будут
записи с номерами 1, 2, 3, 4, 5 и так далее до записи с номером 20.
Для получения линейной выборки из результата запроса необходимо вызвать метод
Выбрать() объекта РезультатЗапроса без параметров либо с параметром
ОбходРезультатаЗапроса.Прямой (листинг 2.21).
Листинг 2.21. Прямой порядок обхода выборки
Пример этой процедуры находится в демонстрационной конфигурации «Язык запросов»,
прилагающейся к книге, в обработке Работа с запросами.
В этом примере в окно сообщений формы обработки последовательно выдаются данные
о поступлении товаров с иерархическими итогами по каждому товару.
Иерархический порядок обхода
При иерархическом обходе результата запроса обходятся только записи, находящиеся на
одном уровне иерархии. Для получения иерархической выборки из результата запроса
необходимо вызвать метод Выбрать() объекта РезультатЗапроса с параметром
ОбходРезультатаЗапроса.ПоГруппировкамСИерархией.
Однако при первом вызове метода Выбрать() с этим типом обхода будут получены
только записи, находящиеся на самом верхнем уровне иерархии. То есть в нашем
примере (см. рис. 2.33) это будут записи с номерами 1 и 11. Только две эти записи
попадут в первый проход иерархической выборки. А как получить остальные записи
результата запроса?
Для обхода записей всех уровней иерархии в цикле обхода первой выборки нужно для
каждой записи выборки методом Выбрать() объекта ВыборкаИзРезультатаЗапроса
получать вложенные иерархические выборки, которые будут содержать подчиненные
записи текущей записи выборки.
В нашем примере в момент, когда первая выборка будет позиционирована на запись с
номером 1, мы запросим у нее подчиненную иерархическую выборку. Таким образом, мы
получим выборку, которая нам вернет записи с номерами 2, 5, 8. А когда выборка
верхнего уровня будет позиционирована на запись с номером 11, полученная у нее
иерархическая выборка вернет записи с номерами 12, 15, 18. Так реализуется
иерархический обход результатов запроса.
Рассмотрим, как реализуется данная методика на примере обхода результата запроса, в
котором получаются записи из состава приходных накладных и рассчитываются
иерархические итоги по полю Товар. В процедуре выполнения запроса из результата
запроса получается выборка с типом обхода ПоГруппировкамСИерархией, содержащая
записи, находящиеся на самом верхнем уровне иерархии (листинг 2.22).
Листинг 2.22. Иерархический обход результата запроса
Затем вызывается процедура ВыдатьВсеВложения(), в которую передается полученная
выборка. В этой процедуре иерархическая выборка обходится в цикле, и в окно
сообщений выводятся данные этой выборки. После этого в теле цикла для текущей
записи выборки вызывается метод Выбрать(), и из нее получается подчиненная выборка
записей, находящихся на следующем уровне иерархии. При этом в случае получения в
запросе иерархических итогов нужно анализировать тип записи выборки. Если тип записи –
Итог по иерархии, то вторым параметром в метод Выбрать() нужно передавать имя
группировки, для которой были рассчитаны иерархические итоги.
Затем рекурсивно вызывается процедура ВыдатьВсеВложения(), в которую передается
полученная иерархическая выборка, содержащая подчиненные записи родительской
записи выборки (листинг 2.23).
Листинг 2.23. Обход иерархической выборки