4. Конструкторы
#50

Готовишься к экзамену?

Полнофункциональный тренажер @bot_1cnik_bot с полноценным обучением, режимом экзамена и подробной статистикой.

Перейти в бота

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

На вкладке «Итоги»: прямо в списке итоговых полей при выборе агрегатной функции
Неправильно: Вкладка «Итоги» предназначена для формирования итогов и выбора агрегатных выражений, а не для фильтрации результата. Отбор по суммам/количествам там не задается - для этого используется механизм условий.
На вкладке «Группировка»: в списке полей и суммируемых показателей при указании агрегатов
Неправильно: «Группировка» отвечает за то, как данные объединяются (СГРУППИРОВАТЬ ПО) и какие агрегаты считаются. Условия на уже посчитанные агрегаты относятся к фильтрации после группировки и в этой вкладке не настраиваются.
На вкладке «Условия» (через добавление условия/выражения, в том числе с агрегатной функцией)
Правильно: На вкладке «Условия» можно задать отбор как по полям, так и по произвольным выражениям, включая агрегатные функции. Конструктор сам сформирует нужную секцию запроса: для обычных полей это будет «ГДЕ», а для условий на агрегаты - «ИМЕЮЩИЕ».
Никак: в конструкторе запросов нельзя накладывать условия на агрегатные функции
Неправильно: Условия на агрегированные значения в языке запросов 1С поддерживаются через секцию «ИМЕЮЩИЕ», аналогично SQL HAVING. Конструктор запросов умеет создавать такие условия, если вы задаете фильтр с использованием агрегатной функции на вкладке «Условия».

Пояснение

Условия на агрегатные функции - это отбор не по отдельным строкам источника данных, а по уже рассчитанным итогам после группировки. В языке запросов 1С для этого используется секция «ИМЕЮЩИЕ» (аналог HAVING), тогда как «ГДЕ» отбирает строки до группировки. Как это работает в конструкторе: 1) Если на вкладке «Условия» вы добавляете фильтр по обычному полю (например, Контрагент = &Контрагент), конструктор сформирует «ГДЕ …». 2) Если вы добавляете условие по выражению с агрегатной функцией (например, СУММА(СуммаДокумента) > 100000), конструктор автоматически вынесет это в «ИМЕЮЩИЕ …». Пример сценария: нужно вывести только тех контрагентов, у которых общая сумма продаж за период больше 100 000. Вы делаете группировку по Контрагенту, добавляете поле СУММА(Сумма) как итог, а на вкладке «Условия» задаете СУММА(Сумма) > 100000. В результате в тексте запроса появится «ИМЕЮЩИЕ СУММА(Сумма) > 100000», и это будет корректный отбор по агрегату. Практический совет: если вы случайно поставите условие по агрегату как обычное поле (или попытаетесь отбирать по строкам вместо итогов), результат будет «не тот» - сначала определите, фильтруете вы исходные записи (тогда ГДЕ) или итоговые группы (тогда ИМЕЮЩИЕ).