28.04.2022 15:48:12
Добрый день! Подскажите, пожалуйста, когда используется директива «ИМЕЮЩИЕ» запросе 1С, в чем отличия от директивы "ГДЕ", и какие особенности ее применения для отбора?
|
|
|
|
28.04.2022 15:55:04
«Имеющие» в запросе 1С Описание Директива для агрегатных функций «имеющие» в запросах 1С работает по аналогии с директивой «где» (то есть как отбор после выборки в запросе), однако имеет ряд отличительных особенностей, и может использоваться в тех случаях, когда директиву «где» использовать нельзя. Основные отличия директивы «имеющие» от директивы «где»: · директиву «имеющие» можно использовать для агрегатных функций, после группировки, таких как: · СУММА(), КОЛИЧЕСТВО(), КОЛИЧЕСТВО(РАЗЛИЧНЫЕ), МАКСИМУМ(), МИНИМУМ(), СРЕДНЕЕ() · обязательным условием для использования директивы «имеющие» является группировка (то есть перед использованием директивы поля в запросе нужно сгруппировать) · в директиве «имеющие» можно сравнивать только значения, агрегатные функции и параметры, входящие в группировку запроса, при этом обычные поля для сравнения уже будут не доступны · в директиве «имеющие» так же как и в директиве «где» возможно использование операторов И, ИЛИ Обратите внимание, что в тексте запроса в директиве «имеющие» нужно прописывать не только название поля, но и всю агрегатную функцию (например: КОЛИЧЕСТВО(РАЗЛИЧНЫЕ РеализацияТоваровУслугТовары.Сумма) > 0, а не просто: РеализацияТоваровУслугТовары.Сумма > 0), при этом использование псевдонима поля будет ошибкой. Пример №1: ВЫБРАТЬ РеализацияТоваровУслугТовары.Номенклатура КАК Номенклатура, РеализацияТоваровУслугТовары.Сумма КАК Сумма ИЗ Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары ГДЕ РеализацияТоваровУслугТовары.Сумма > 0
Пример №2: ВЫБРАТЬ РеализацияТоваровУслугТовары.Номенклатура КАК Номенклатура, СУММА(РеализацияТоваровУслугТовары.Сумма) КАК Сумма ИЗ Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары СГРУППИРОВАТЬ ПО РеализацияТоваровУслугТовары.Номенклатура ИМЕЮЩИЕ КОЛИЧЕСТВО(РАЗЛИЧНЫЕ РеализацияТоваровУслугТовары.Сумма) > 0 В Примере №1 мы можем задать отбор с помощью директивы «где» и запрос будет работать корректно, однако если в таком же запросе будет задана группировка, и нам надо будет задать отбор по сгруппированому полю СУММА(РеализацияТоваровУслугТовары.Сумма) - то в этом случае директиву «где» использовать уже нельзя (нужно использовать директиву «имеющие»). Вывод Директива «имеющие» - достаточно удобный метод, позволяющий устанавливать отбор в запросе по полям, в которых заданы агрегатные функции, то есть в тех случаях, в которых отбор «где» использовать не возможно.
|
|||
|
|
28.04.2022 16:38:57
А как задать директиву «имеющие» в конструкторе запроса? Есть вкладка отборов «Условия», но там задается директива «где». |
|
|
|
28.04.2022 16:47:13
Для того чтобы задать директиву «имеющие» вместо директивы «где» в конструкторе запросов 1С, действительно необходимо перейти на вкладку «Условия», и в ней, поставив галочку «произвольное», прописать вручную условие отбора включая агрегатную функцию: Условие для «где»: РеализацияТоваровУслугТовары.Сумма > 0 Условие для «имеющие»: СУММА(РеализацияТоваровУслугТовары.Сумма) > 0 Конструктор 1С сам перестроит запрос таким образом, что директива "ГДЕ" переформируется в директиву "ИМЕЮЩИЕ". Не забудьте, что перед этим, в запросе должна быть установлена группировка полей. |
|||
|
|
28.04.2022 16:48:19
|
|||||
|
|
||||