Файл: Хрусталева Е. Ю. Язык запросов 1С-Предприятия 8 (2013).pdf

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 12.03.2019

Просмотров: 51777

Скачиваний: 8724

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
background image

Рис. 1.46. Вывод корневых записей справочника «Товары»

В условии отбора данного запроса используется литерал функционального типа
ЗНАЧЕНИЕ(), с помощью которого в языке запросов можно получить доступ к
предопределенным данным конфигурации и к значениям системных перечислений. В
данном случае проверяется, является ли пустой ссылкой на справочник Товары значение
поля справочника Родитель. Если это так, то это корневые записи справочника.

Как получить записи иерархической таблицы, находящиеся в иерархии выбранной группы
Для решения поставленной задачи нужно отобрать записи таблицы, которые находятся в
подчинении указанной группе. На первый взгляд это условие отбора схоже с отбором
записей справочника по родителю, который мы рассматривали выше. Однако при таком
условии мы увидим только те записи иерархического справочника, непосредственным
родителем которых является выбранная группа товаров. Построить всю иерархию
подчиненности элементов сверху вниз так не получится. Для этого в условии отбора
нужно использовать ключевое слово В ИЕРАРХИИ и в качестве параметра передать в
список иерархии группу товаров (листинг 1.51).

Листинг 1.51. Отбор записей справочника «Товары», находящихся в иерархии выбранной группы

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

Укажем в качестве значения параметра группу Обувь и получим не только записи,


background image

родителем которых является выбранная группа, но и все элементы, находящиеся ниже по
уровню иерархии (рис. 1.47).

Рис. 1.47. Отбор записей справочника «Товары», находящихся в иерархии выбранной группы товаров

Мы видим, что сам элемент справочника, переданный в список иерархии (неважно,
является он группой справочника или нет), также включается в результат запроса
(первая запись в таблице). Этот момент связан с особенностью выполнения конструкции
В ИЕРАРХИИ языка запросов.

Если мы укажем в качестве значения параметра группу Детская обувь, то результат
выполнения запроса будет следующим (рис. 1.48).

Рис. 1.48. Отбор записей справочника «Товары», находящихся в иерархии выбранной группы товаров

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

Примеры

решения различных задач с использованием запросов

".

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

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


background image

Рассмотрим данную задачу на примере расходных накладных. Для начала мы просто
выведем все записи из состава расходных накладных, упорядочив их по ссылкам товаров
(листинг 1.52). Делается это простым запросом к табличной части документа, который мы
рассматривали в разделе «

Как получить данные из табличной части некоторого

документа

».

Листинг 1.52. Вывод всех записей из состава расходных накладных, упорядоченных по ссылкам товаров

Даже на нашей небольшой демонстрационной конфигурации получается довольно
большой список товаров, но с его помощью будет понятна сущность группировки записей
(рис. 1.49).

Рис. 1.49. Вывод всех записей из состава расходных накладных, упорядоченных по ссылкам товаров

Итак, в результате запроса содержится 17 записей, из них 4 записи для товара Туфли, 4
записи для товара Сапоги, 3 записи для товара Кроссовки и т. д. При этом записи с
одинаковым значением поля Товар расположены друг за другом. Мы видим, что цена
одного и того же товара может быть разной. Так, цена товара Туфли колеблется от 6 000
до 8 000.

Допустим, нас интересует минимальная, максимальная и средняя цена, по которой
продавался каждый из товаров. Для решения поставленной задачи нужно собрать вместе
записи исходной таблицы с одинаковым значением поля Товар и применить к каждому
товару агрегатные функции МИНИМУМ()МАКСИМУМ() и СРЕДНЕЕ() со значением цены
товара в качестве параметра этих функций.


background image

Для этого в языке запросов предназначено ключевое слово СГРУППИРОВАТЬ ПО,
после которого следует список полей, по которым нужно сгруппировать записи исходной
таблицы (листинг 1.53).

Листинг 1.53. Вывод минимальной, максимальной и средней цены каждого товара из состава расходных накладных

Обратите внимание, что в списке полей выборки запроса, помимо полей, по которым
группируются записи исходной таблицы, могут присутствовать только агрегатные функции
СУММА()МИНИМУМ()МАКСИМУМ()СРЕДНЕЕ()КОЛИЧЕСТВО(), применяемые к
исходным записям с одинаковым значением поля группировки.

Агрегатные функции МИНИМУМ()МАКСИМУМ() и СРЕДНЕЕ() вычисляют
соответственно минимальное, максимальное и среднее значение из всех записей с
одинаковым значением поля группировки.

В результате выполнения запроса выводится 5 записей вместо 17. То есть для каждого
товара вычисляется минимальная, максимальная и средняя цена его продаж. В
результате запроса записи исходной таблицы с одинаковым значением поля Товар
«сворачиваются» в одну запись, в которой помимо самого поля группировки выводятся
значения агрегатных функций (рис. 1.50).

Рис. 1.50. Вывод минимальной, максимальной и средней цены каждого товара из состава расходных накладных

В предложении СГРУППИРОВАТЬ ПО должны указываться именно имена полей, а не их
псевдонимы, определенные в запросе.

При использовании агрегатных функций предложение СГРУППИРОВАТЬ ПО может быть
и не указано совсем, при этом все записи исходной таблицы будут сгруппированы в одну-
единственную строку.

Как узнать общее количество и сумму продаж каждого товара в разрезе покупателей
Сначала покажем простой запрос, с помощью которого можно узнать, сколько всего было
продано каждого из товаров.


background image

Для этого записи из состава расходных накладных с одинаковым значением поля Товар
нужно собрать вместе, затем для каждого товара с помощью агрегатной функции
СУММА() подсчитать суммарное значение поля Количество и вывести в полях выборки
запроса (листинг 1.54).

Листинг 1.54. Вывод общего количества единиц проданных товаров из состава расходных накладных

Агрегатная функция СУММА() вычисляет арифметическую сумму всех записей с
одинаковым значением поля группировки.

В результате запроса мы видим общее количество единиц проданных товаров из состава
расходных накладных (рис. 1.51).

Рис. 1.51. Вывод общего количества единиц проданных товаров из состава расходных накладных

Часто требуется сгруппировать записи исходной таблицы по значению нескольких полей
сразу. Для этого после ключевого слова СГРУППИРОВАТЬ ПО нужно перечислить через
запятую список полей группировки.

Например, нам нужно увидеть, сколько и на какую сумму продано каждого товара по
каждому покупателю. Это можно сделать с помощью следующего запроса (листинг 1.55).

Листинг 1.55. Группировка записей по нескольким полям