Как настроить отбор по вычисляемому ресурсу группировки в СКД?

Программист 1С v8.3 (Управляемые формы) 1С:Управление торговлей IT и автоматизация бизнеса
← На главную

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

Почему стандартный отбор по ресурсу не работает на уровне отчета

Выясним причину, по которой фильтрация по ресурсам дает сбой, если добавить условие в общий корень настроек отчета (вкладка Настройки — Отбор):

  1. Последовательность расчета итогов: общий отбор отчета накладывается на уровне исходных детальных записей выборки еще до того, как СКД рассчитает агрегатные функции (Сумма, Количество, Минимум, Максимум). На этом этапе ресурс группировки еще не существует и принимает значение NULL или Неопределено, что приводит к отсечению строк.
  2. Ограничение области расчета: если на вкладке Ресурсы в колонке Рассчитывать по... задан список конкретных группировок, значение ресурса вычисляется исключительно внутри этих уровней. В детальных записях значение такого поля не определено.
  3. Логика оператора «Не заполнено»: в платформе 1С операторы «Заполнено» и «Не заполнено» работают через системную функцию ЗначениеЗаполнено(). Для числовых типов данных значение 0 считается незаполненным (возвращает Ложь). В результате условие «Не заполнено» для числового ресурса отбирает как пустые значения, так и корректно рассчитанные нули.

Способ 1. Перенос отбора в настройки конкретной группировки

Рассмотрим основной способ решения проблемы. Чтобы отбор сработал по уже рассчитанным агрегатам (аналог секции HAVING в языке SQL), его необходимо применить непосредственно к группировке, для которой рассчитывается ресурс.

Разберем по шагам порядок настройки:

  1. Перейдем на вкладку Настройки схемы компоновки данных.
  2. В структуре отчета найдем и выделим нужную группировку (например, группировку по полю Партнер или Номенклатура).
  3. В нижней части окна перейдем на вкладку Отбор, относящуюся именно к этой группировке, а не ко всему отчету.
  4. Добавим новый элемент отбора, выбрав необходимое поле ресурса.
  5. В свойствах элемента отбора убедимся, что параметр Применение отбора установлен в значение После группировки или для иерархии (или Для группировки).

Способ 2. Корректное задание условий сравнения для числовых полей

Проанализируем работу с операторами сравнения. Если требуется отобрать пустые, нулевые или ограниченные по диапазону значения ресурсов, откажемся от операторов «Заполнено» и «Не заполнено» в пользу точных числовых условий.

Посмотрим на примеры корректного задания условий:

  1. Вместо условия Ресурс = Не заполнено используем явное условие равенства нулю: Ресурс = 0.
  2. Для отсечения нулевых и отсутствующих остатков используем условие Ресурс <> 0 или Ресурс > 0.
  3. Если ресурс в выражении может принимать значение NULL, на вкладке Ресурсы оборачиваем выражение в функцию обработки пустых значений:

ЕстьNull(Сумма(СуммаОстаток), 0)

Способ 3. Расчет и фильтрация показателей на уровне запроса

Если требуется применить отбор по вычисленному итогу ко всему отчету глобально, перенесем агрегацию данных непосредственно в текст запроса набора данных. В этом случае вычисленный показатель станет обычным полем выборки, и фильтрация по нему будет выполняться без ограничений.

Посмотрим на пример структуры такого запроса:


ВЫБРАТЬ
    ПродажиОбороты.Партнер КАК Партнер,
    СУММА(ПродажиОбороты.СуммаОборот) КАК СуммаВыручки,
    КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ПродажиОбороты.ДокументПродажи) КАК КоличествоСделок
ПОМЕСТИТЬ ВТ_ИтогиПоПартнерам
ИЗ
    РегистрНакопления.Продажи.Обороты(&НачалоПериода, &КонецПериода, Авто, ) КАК ПродажиОбороты
СГРУППИРОВАТЬ ПО
    ПродажиОбороты.Партнер
;

ВЫБРАТЬ
    ВТ.Партнер КАК Партнер,
    ВТ.СуммаВыручки КАК СуммаВыручки,
    ВТ.КоличествоСделок КАК КоличествоСделок
ИЗ
    ВТ_ИтогиПоПартнерам КАК ВТ
ГДЕ
    ВТ.КоличествоСделок <= &МаксимальноеКоличествоСделок

При таком подходе поле КоличествоСделок рассчитывается на стороне СУБД, что позволяет накладывать стандартные отборы СКД в корне отчета без конфликтов с механизмом расчета ресурсов.

Способ 4. Скрытие строк через условное оформление

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

Разберем порядок настройки условного оформления:

  1. В структуре отчета выберем группировку, строки которой требуется скрыть.
  2. Перейдем на вкладку Условное оформление выбранной группировки.
  3. Добавим элемент оформления: в колонке Оформление установим флаг Видимость и снимем с него значение (значение Ложь).
  4. В колонке Условие укажем критерий (например, Ресурс = 0 или Количество > 3).
  5. В колонке Оформляемые поля укажем поля текущей группировки.

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

← На главную