Страницы: 1
RSS
Директива "ИМЕЮЩИЕ" в запросе 1С
 
Добрый день! Подскажите, пожалуйста, когда используется директива «ИМЕЮЩИЕ» запросе 1С, в чем отличия от директивы "ГДЕ", и какие особенности ее применения для отбора?
 
Цитата
user05 написал:
Добрый день! Подскажите, пожалуйста, когда используется директива «ИМЕЮЩИЕ» запросе 1С, в чем отличия от директивы "ГДЕ", и какие особенности ее применения для отбора?
«Имеющие» в запросе 1С

Описание

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

Основные отличия директивы «имеющие» от директивы «где»:

·       директиву «имеющие» можно использовать для агрегатных функций, после группировки, таких как:

·       СУММА(), КОЛИЧЕСТВО(), КОЛИЧЕСТВО(РАЗЛИЧНЫЕ), МАКСИМУМ(), МИНИМУМ(), СРЕДНЕЕ()

·       обязательным условием для использования директивы «имеющие» является группировка (то есть перед использованием директивы поля в запросе нужно сгруппировать)

·       в директиве «имеющие» можно сравнивать только значения, агрегатные функции и параметры, входящие в группировку запроса, при этом обычные поля для сравнения уже будут не доступны

·       в директиве «имеющие» так же как и в директиве «где» возможно использование операторов И, ИЛИ

Обратите внимание, что в тексте запроса в директиве «имеющие» нужно прописывать не только название поля, но и всю агрегатную функцию (например: КОЛИЧЕСТВО(РАЗЛИЧНЫЕ РеализацияТоваровУслугТовары.Сумма) > 0, а не просто: РеализацияТоваровУслугТовары.Сумма > 0), при этом использование псевдонима поля будет ошибкой.

Пример №1:

ВЫБРАТЬ

             РеализацияТоваровУслугТовары.Номенклатура КАК Номенклатура,

             РеализацияТоваровУслугТовары.Сумма КАК Сумма

ИЗ

             Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары

ГДЕ

             РеализацияТоваровУслугТовары.Сумма > 0

Пример №2:

ВЫБРАТЬ

             РеализацияТоваровУслугТовары.Номенклатура КАК Номенклатура,

             СУММА(РеализацияТоваровУслугТовары.Сумма) КАК Сумма

ИЗ

             Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары

СГРУППИРОВАТЬ ПО

             РеализацияТоваровУслугТовары.Номенклатура

ИМЕЮЩИЕ

             КОЛИЧЕСТВО(РАЗЛИЧНЫЕ РеализацияТоваровУслугТовары.Сумма) > 0

В Примере №1 мы можем задать отбор с помощью директивы «где» и запрос будет работать корректно, однако если в таком же запросе будет задана группировка, и нам надо будет задать отбор по сгруппированому полю СУММА(РеализацияТоваровУслугТовары.Сумма) - то в этом случае директиву «где» использовать уже нельзя (нужно использовать директиву «имеющие»).

Вывод

Директива «имеющие» - достаточно удобный метод, позволяющий устанавливать отбор в запросе по полям, в которых заданы агрегатные функции, то есть в тех случаях, в которых отбор «где» использовать не возможно.

 
В дополнение:

Директива «ГДЕ»

В обычном случае для отборов используется директива «ГДЕ». Например:

выбрать Номенклатура.Ссылка ИЗ Справочник.Номенклатура ГДЕ (Код = 001 И ЭтоУслуга = Ложь)

В директиве «ГДЕ» нужно установить условие, по которому нам надо отобрать строки. Проще говоря, сначала обрабатываются все строки выборки  и затем они сравниваются с условием отбора. Если строка подходит по условию отбора, тогда она попадет в результирующую таблицу запроса.

Директиву «ГДЕ» не стоит задавать в виртуальных таблицах запроса, так как это является ошибкой с точки зрения оптимизации. Для отборов в них используются специальные параметры отбора этих виртуальных таблиц.

 

А как задать директиву «имеющие» в конструкторе запроса? Есть вкладка отборов «Условия», но там задается директива «где».

 
Цитата
user05 написал:
А как задать директиву «имеющие» в конструкторе запроса? Есть вкладка отборов «Условия», но там задается директива «где».

Для того чтобы задать директиву «имеющие» вместо директивы «где» в конструкторе запросов 1С, действительно необходимо перейти на вкладку «Условия», и в ней, поставив галочку «произвольное», прописать вручную условие отбора включая агрегатную функцию:

Условие для «где»:

РеализацияТоваровУслугТовары.Сумма > 0

Условие для «имеющие»:

СУММА(РеализацияТоваровУслугТовары.Сумма) > 0

Конструктор 1С сам перестроит запрос таким образом, что директива "ГДЕ" переформируется в директиву "ИМЕЮЩИЕ". Не забудьте, что перед этим, в запросе должна быть установлена группировка полей.

 
Цитата
Дмитрий написал:
Цитата
user05 написал:
А как задать директиву «имеющие» в конструкторе запроса? Есть вкладка отборов «Условия», но там задается директива «где».
 Для того чтобы задать директиву «имеющие» вместо директивы «где» в конструкторе запросов 1С, действительно необходимо перейти на вкладку «Условия», и в ней, поставив галочку «произвольное», прописать вручную условие отбора включая агрегатную функцию:   Условие для «где»:   РеализацияТоваровУслугТовары.Сумма > 0   Условие для «имеющие»:   СУММА(РеализацияТоваровУслугТовары.Сумма) > 0  Конструктор 1С сам перестроит запрос таким образом, что директива "ГДЕ" переформируется в директиву "ИМЕЮЩИЕ". Не забудьте, что перед этим, в запросе должна быть установлена группировка полей.
Спасибо!
Страницы: 1