При разработке отчетов на системе компоновки данных (СКД) разработчики часто сталкиваются с ситуацией, когда отбор по итоговому ресурсу группировки работает некорректно: отчет возвращает пустой результат, искажает итоговые цифры или выводит строки, которые должны были быть исключены. Проанализируем причины такого поведения платформы 1С и разберем по шагам правильные способы фильтрации данных по вычисляемым показателям.
Выясним причину, по которой фильтрация по ресурсам дает сбой, если добавить условие в общий корень настроек отчета (вкладка Настройки — Отбор):
Сумма, Количество, Минимум, Максимум). На этом этапе ресурс группировки еще не существует и принимает значение NULL или Неопределено, что приводит к отсечению строк.ЗначениеЗаполнено(). Для числовых типов данных значение 0 считается незаполненным (возвращает Ложь). В результате условие «Не заполнено» для числового ресурса отбирает как пустые значения, так и корректно рассчитанные нули.Рассмотрим основной способ решения проблемы. Чтобы отбор сработал по уже рассчитанным агрегатам (аналог секции HAVING в языке SQL), его необходимо применить непосредственно к группировке, для которой рассчитывается ресурс.
Разберем по шагам порядок настройки:
Партнер или Номенклатура).Проанализируем работу с операторами сравнения. Если требуется отобрать пустые, нулевые или ограниченные по диапазону значения ресурсов, откажемся от операторов «Заполнено» и «Не заполнено» в пользу точных числовых условий.
Посмотрим на примеры корректного задания условий:
Ресурс = Не заполнено используем явное условие равенства нулю: Ресурс = 0.Ресурс <> 0 или Ресурс > 0.NULL, на вкладке Ресурсы оборачиваем выражение в функцию обработки пустых значений:ЕстьNull(Сумма(СуммаОстаток), 0)
Если требуется применить отбор по вычисленному итогу ко всему отчету глобально, перенесем агрегацию данных непосредственно в текст запроса набора данных. В этом случае вычисленный показатель станет обычным полем выборки, и фильтрация по нему будет выполняться без ограничений.
Посмотрим на пример структуры такого запроса:
ВЫБРАТЬ
ПродажиОбороты.Партнер КАК Партнер,
СУММА(ПродажиОбороты.СуммаОборот) КАК СуммаВыручки,
КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ПродажиОбороты.ДокументПродажи) КАК КоличествоСделок
ПОМЕСТИТЬ ВТ_ИтогиПоПартнерам
ИЗ
РегистрНакопления.Продажи.Обороты(&НачалоПериода, &КонецПериода, Авто, ) КАК ПродажиОбороты
СГРУППИРОВАТЬ ПО
ПродажиОбороты.Партнер
;
ВЫБРАТЬ
ВТ.Партнер КАК Партнер,
ВТ.СуммаВыручки КАК СуммаВыручки,
ВТ.КоличествоСделок КАК КоличествоСделок
ИЗ
ВТ_ИтогиПоПартнерам КАК ВТ
ГДЕ
ВТ.КоличествоСделок <= &МаксимальноеКоличествоСделок
При таком подходе поле КоличествоСделок рассчитывается на стороне СУБД, что позволяет накладывать стандартные отборы СКД в корне отчета без конфликтов с механизмом расчета ресурсов.
Рассмотрим ситуацию, когда необходимо скрыть определенные строки по значению ресурса, но при этом нельзя исключать эти данные из общего итога отчета. В таком случае отбор группировки не подойдет, так как он повлияет на вышестоящие агрегаты.
Разберем порядок настройки условного оформления:
Ложь).Ресурс = 0 или Количество > 3).Таким образом, строки с неподходящими значениями будут визуально скрыты из отчета, а итоговые суммы по всему документу останутся полными и корректными.