Как настроить отбор по значению свойства в группировке колонок СКД без потери других колонок?

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

При разработке отчетов в системе компоновки данных (СКД) часто возникает задача создания кросс-таблиц. Классический пример — вывод объектов (например, номенклатуры) в строках, а их дополнительных свойств (цвет, размер, производитель) — в группировке колонок. При этом в ячейках на пересечении выводится конкретное значение свойства.

Сложность возникает, когда пользователю требуется отфильтровать отчет по значению одного из свойств (например, показать только товары с цветом «Красный»), но при этом сохранить в отчете остальные колонки-свойства («Размер», «Материал» и т. д.) для сопоставления. Если применить стандартный отбор, колонки других свойств просто исчезают из отчета.

Выясним причину проблемы

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

В результате из выборки полностью исключаются записи, относящиеся к другим свойствам (например, Свойство2, Свойство3). Из-за этого колонки для них не могут быть сформированы физически — СКД просто «не видит» этих данных в результирующем наборе.

Если использовать условие с логическим оператором «ИЛИ» (например, Свойство <> Свойство1), строка объекта попадет в отчет, так как у нее существуют записи по другим свойствам. Однако значение в колонке Свойство1 для фильтруемых объектов будет пустым или выведется некорректно, так как отбор на уровне записей отсек строку, содержащую значение Свойство1, не удовлетворяющее условию отбора.

Рассмотрим подробнее два проверенных способа решения этой проблемы без изменения исходного запроса в СКД.

Способ №1. Использование механизма «Характеристики» в СКД

Это наиболее правильный, стандартный и производительный способ решения подобных задач на уровне платформы «1С:Предприятие». Он позволяет представить динамические свойства объектов в виде виртуальных реквизитов.

Разберем этот метод по шагам:

  1. Откроем схему компоновки данных и перейдем на вкладку Наборы данных.
  2. В верхней таблице выберем наш набор данных и нажмем кнопку Характеристики (расположена на панели инструментов над таблицей наборов данных).
  3. В открывшемся окне настроим связь между ключевым объектом строки (например, полем Номенклатура) и таблицами, где хранятся виды свойств и их значения (обычно это План видов характеристик и Регистр сведений).
  4. После настройки характеристики объекта станут доступны в СКД как его виртуальные реквизиты. В поле выбора отборов появится путь вида: Номенклатура.[ИмяСвойства] (например, Номенклатура.Цвет).
  5. В настройках отчета установим отбор по этому виртуальному полю: Номенклатура.Цвет Равно Красный.

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

Способ №2. Фильтрация через вычисляемое поле-ресурс

Если использование характеристик затруднено структурой метаданных, рассмотрим альтернативный вариант решения. Этот способ позволяет отфильтровать строки по значению ресурса на уровне группировки строк. Отбор по ресурсу накладывается СКД уже после того, как детальные записи были сгруппированы.

Посмотрим на пример настройки такого фильтра:

  1. Перейдем на вкладку Вычисляемые поля в СКД и добавим новое поле (например, с именем СоответствуетУсловию).
  2. В колонке «Выражение» напишем условие проверки значения свойства. Для гибкости будем использовать параметры:
    
    Выбор 
        Когда Свойство = &ПараметрСвойство И Значение = &ПараметрЗначение 
            Тогда Истина 
        Иначе Ложь 
    Конец
    
  3. Перейдем на вкладку Ресурсы. Добавим наше поле СоответствуетУсловию в список ресурсов.
  4. В качестве выражения ресурса укажем: Максимум(СоответствуетУсловию). В поле «Рассчитывать по...» обязательно выберем группировку строк (например, Номенклатура).
  5. В настройках структуры отчета выберем группировку строк Номенклатура. Перейдем во вкладку Отбор этой группировки (это важно: отбор накладывается не на весь отчет, а именно на группировку строк!) и добавим условие: СоответствуетУсловию Равно Истина.

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

Альтернативные варианты реализации

Если логика отборов слишком сложна для настроек компоновки данных, можно использовать другие подходы:

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

Таким образом, мы детально разобрали причины проблемы фильтрации кросс-таблиц в СКД и изучили эффективные методы ее решения как с использованием встроенных механизмов платформы (Характеристики), так и через обходные пути (Вычисляемые ресурсы).

← На главную