При разработке отчетов в системе компоновки данных (СКД) часто возникает задача создания кросс-таблиц. Классический пример — вывод объектов (например, номенклатуры) в строках, а их дополнительных свойств (цвет, размер, производитель) — в группировке колонок. При этом в ячейках на пересечении выводится конкретное значение свойства.
Сложность возникает, когда пользователю требуется отфильтровать отчет по значению одного из свойств (например, показать только товары с цветом «Красный»), но при этом сохранить в отчете остальные колонки-свойства («Размер», «Материал» и т. д.) для сопоставления. Если применить стандартный отбор, колонки других свойств просто исчезают из отчета.
Проанализируем, почему стандартный отбор СКД работает именно так. При наложении простого глобального отбора вида Свойство = Свойство1 И Значение = Значение1 система компоновки данных выполняет фильтрацию детального набора данных еще до того, как они будут сгруппированы и распределены по колонкам кросс-таблицы.
В результате из выборки полностью исключаются записи, относящиеся к другим свойствам (например, Свойство2, Свойство3). Из-за этого колонки для них не могут быть сформированы физически — СКД просто «не видит» этих данных в результирующем наборе.
Если использовать условие с логическим оператором «ИЛИ» (например, Свойство <> Свойство1), строка объекта попадет в отчет, так как у нее существуют записи по другим свойствам. Однако значение в колонке Свойство1 для фильтруемых объектов будет пустым или выведется некорректно, так как отбор на уровне записей отсек строку, содержащую значение Свойство1, не удовлетворяющее условию отбора.
Рассмотрим подробнее два проверенных способа решения этой проблемы без изменения исходного запроса в СКД.
Это наиболее правильный, стандартный и производительный способ решения подобных задач на уровне платформы «1С:Предприятие». Он позволяет представить динамические свойства объектов в виде виртуальных реквизитов.
Разберем этот метод по шагам:
Номенклатура) и таблицами, где хранятся виды свойств и их значения (обычно это План видов характеристик и Регистр сведений).Номенклатура.[ИмяСвойства] (например, Номенклатура.Цвет).Номенклатура.Цвет Равно Красный.При формировании отчета СКД автоматически оптимизирует результирующий запрос, добавив необходимые левые соединения. Строки будут отфильтрованы по нужному свойству, а колонки других свойств кросс-таблицы продолжат выводиться без искажения данных, так как детальные записи для них не пострадают.
Если использование характеристик затруднено структурой метаданных, рассмотрим альтернативный вариант решения. Этот способ позволяет отфильтровать строки по значению ресурса на уровне группировки строк. Отбор по ресурсу накладывается СКД уже после того, как детальные записи были сгруппированы.
Посмотрим на пример настройки такого фильтра:
СоответствуетУсловию).
Выбор
Когда Свойство = &ПараметрСвойство И Значение = &ПараметрЗначение
Тогда Истина
Иначе Ложь
Конец
СоответствуетУсловию в список ресурсов.Максимум(СоответствуетУсловию). В поле «Рассчитывать по...» обязательно выберем группировку строк (например, Номенклатура).Номенклатура. Перейдем во вкладку Отбор этой группировки (это важно: отбор накладывается не на весь отчет, а именно на группировку строк!) и добавим условие: СоответствуетУсловию Равно Истина.Поскольку СКД рассчитывает ресурсы после агрегации, выражение Максимум(СоответствуетУсловию) вернет значение Истина для всей строки номенклатуры, если хотя бы в одном из свойств встретилось искомое значение. Строки, не содержащие нужного значения свойства, будут скрыты, но детальные записи внутри оставшихся строк сохранятся, благодаря чему другие колонки-свойства заполнятся корректно.
Если логика отборов слишком сложна для настроек компоновки данных, можно использовать другие подходы:
ДеревоЗначений. После компоновки разработчик кодом обходит полученное дерево, анализирует ячейки свойств, удаляет строки, не соответствующие критериям фильтрации, и выводит результирующее дерево в ТабличныйДокумент.Таким образом, мы детально разобрали причины проблемы фильтрации кросс-таблиц в СКД и изучили эффективные методы ее решения как с использованием встроенных механизмов платформы (Характеристики), так и через обходные пути (Вычисляемые ресурсы).