Файл: Хрусталева Е. Ю. Язык запросов 1С-Предприятия 8 (2013).pdf
ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 12.03.2019
Просмотров: 51815
Скачиваний: 8725
Обход выборки результата запроса, содержащего данные табличной части
Часто объекты базы данных, например документы, имеют основную таблицу, в которой
содержатся реквизиты документа, и подчиненную таблицу, в которой содержатся данные
табличной части документа. Эти данные можно получить, обращаясь отдельно к таблице
с данными табличной части (раздел "
Как получить данные из табличной части некоторого
"), а также их можно получить из основной таблицы в качестве вложенного
результата запроса. Второй вариант мы и рассмотрим ниже.
Как уже объяснялось ранее в разделе "
Как получить данные из табличной части
документа в качестве вложенной таблицы
", при выполнении запроса к основной таблице
поле результата запроса, содержащее данные из табличной части (например,
ЗаказТовара.Состав), будет иметь тип РезультатЗапроса, то есть содержать
вложенный результат запроса, сформированный на основе табличной части.
Чтобы обработать данные вложенной таблицы, нужно в цикле обхода основной выборки
из результата запроса для каждой записи выборки методом Выбрать() объекта
ВыборкаИзРезультатаЗапроса получить вложенную выборку, которая будет содержать
данные табличной части для текущей записи основной выборки.
Ниже приводится пример процедуры встроенного языка, в которой обрабатываются как
реквизиты документа, так и данные его табличной части и выводятся в окно сообщений
(листинг 2.26).
Листинг 2.26. Пример обработки результата запроса, выбирающего данные из документа с табличной частью
При обработке результатов данного запроса получается и обходится выборка основного
запроса (ВыборкаЗапроса). А внутри цикла обхода этой выборки получается и обходится
выборка результатов вложенного запроса (СоставВыборка), содержащая данные
табличной части. Обе выборки имеют линейный тип обхода, так как в запросе нет итогов и
иерархии.
Внутри цикла обхода вложенной выборки реквизиты документа и данные его табличной
части выводятся в окно сообщений в виде одной строки. Чтобы сложить строки, в
запросе получаются текстовые представления от ссылочных полей (Клиент, Товар) с
помощью функции ПРЕДСТАВЛЕНИЕ().
подробнее
Как получить текстовое представление
Этот пример можно посмотреть в демонстрационной конфигурации «Язык запросов»,
прилагающейся к книге, в обработке Работа с запросами.
Обработка результатов запроса с помощью конструктора запроса
В предыдущих примерах обхода выборки результаты запроса выводились в окно
сообщений, но это сделано только для упрощения примера. На самом деле результаты
выполнения запросов выводятся обычно в табличный документ, таблицу значений и т. п.
Рассмотрим пример обхода выборки и вывода результатов запроса в табличный
документ и в диаграмму при помощи конструктора запроса. В данном случае нам
понадобится Конструктор запроса с обработкой результата, который помогает не
только визуально сконструировать запрос, но и создать готовый фрагмент кода для
получения данных с помощью запроса и обработки его результатов.
Обход выборки
Откроем модуль формы и вызовем из контекстного меню пункт Конструктор запроса с
обработкой результата. Подтвердим, что мы хотим создать новый запрос. После этого
откроется конструктор запроса с обработкой результата (рис. 2.37).
Рис. 2.37. Окно конструктора запроса с обработкой результата
Как мы видим, он очень похож на обычный конструктор запроса по составу и назначению
своих закладок, за исключением самой первой закладки Обработка результатов, на
которой и определяется, как будет обработан результат запроса. По умолчанию
включена опция Обход результата. Оставим пока эту опцию без изменений.
В этом случае конструктор не только создаст текст запроса, но и напишет за
разработчика фрагмент кода, в котором запрос с нужным текстом создается,
выполняется, из результата запроса получается выборка, а также конструктор создаст
цикл (или циклы) для обхода этой выборки.
Далее, как и в обычном конструкторе, определим исходные данные для запроса. На
закладке Таблицы и поля перенесем табличную часть Состав документа ЗаказТовара в
список источников запроса и выберем из этой таблицы поля: Товар, Количество и
Сумма. Для того чтобы выбрать поля основной таблицы документа Клиент и Дата,
раскроем поле Ссылка табличной части Состав, выберем эти поля и получим обращение
через точку от ссылки – ЗаказТовараСостав.Ссылка.Клиент и
ЗаказТовараСостав.Ссылка.Дата (рис. 2.38).
Рис. 2.38. Окно конструктора запроса с обработкой результата
Затем перейдем на закладку Итоги и укажем, какие итоги нужно рассчитать для
результата запроса. В окно Группировочное поле перенесем поля выборки запроса
Клиент и Товар, а в окно Итоговое поле перенесем поля Количество и Сумма (рис.
2.39).
Рис. 2.39. Окно конструктора запроса с обработкой результата
Тем самым мы указали, что для каждого клиента по каждому товару из документа
ЗаказТовара нужно подсчитать суммарное количество полей Количество и Сумма.
Нажмем ОК. Конструктор запроса с обработкой результата сформирует следующий
фрагмент кода (листинг 2.27).
Листинг 2.27. Фрагмент процедуры для обхода выборки из результата запроса, созданный с помощью конструктора
запроса с обработкой результата
Если мы сравним этот фрагмент с процедурой выполнения запроса (см. листинги 2.24,
2.25), в котором обходилась выборка с типом обхода ПоГруппировкам, то мы увидим, что
конструктор запроса с обработкой результата сделал практически всю работу, за
исключением самой программной обработки выборок. Эти фрагменты в тексте листинга
2.27 выделены жирным шрифтом, и их должен заполнить сам разработчик.
Кроме того, мы видим, что конструктор проанализировал текст запроса, в котором