При разработке отчетов на Системе компоновки данных (СКД) часто возникает стилистическая или функциональная задача: скрыть «лишние» уровни иерархии. Типичный пример — когда в группировке находится всего одна детальная запись. В этом случае дублирование информации (в строке группировки и в детальной строке) выглядит избыточным. Разберем подробно, как реализовать условие, при котором группировка отображается только при наличии нескольких подчиненных записей, и рассмотрим подводные камни каждого метода.
Это самый распространенный и эффективный способ, основанный на базовых механизмах СКД. Идея заключается в том, чтобы подсчитать количество записей внутри группы и применить фильтр именно к этой группе.
Рассмотрим по шагам процесс настройки:
1 и назовем его, например, КоличествоДляОтбора.
Пример части запроса:
ВЫБРАТЬ
Продажи.Номенклатура КАК Номенклатура,
Продажи.Количество КАК КоличествоПродаж,
1 КАК КоличествоДляОтбора
ИЗ
РегистрНакопления.Продажи КАК Продажи
КоличествоДляОтбора ресурсом, указав выражение Сумма(КоличествоДляОтбора).Контрагент, а внутри нее — детальные записи. Нам нужно, чтобы Контрагент выводился, только если у него больше одной записи.Контрагент.
Контрагент в дереве настроек.КоличествоДляОтбора Больше 1.Проанализируем ситуацию: теперь СКД при расчете итогов для каждой группы Контрагент вычислит сумму нашего поля. Если записей (чеков, документов) по контрагенту окажется меньше или равно одной, вся ветка группировки будет исключена из вывода.
Иногда добавление поля в запрос неудобно (например, если используется объектный источник данных). В современных версиях платформы 8.3 мы можем воспользоваться функциями языка выражений СКД.
Разберем, как применить функцию ВычислитьВыражениеСГруппировкойМассив. Это позволяет получить количество элементов в контексте родительской группировки без явного создания ресурсов, которые могут «поплыть» при сложных иерархиях.
Посмотрим на пример выражения для вычисляемого поля КоличествоВГруппе:
Количество(ВычислитьВыражениеСГруппировкойМассив("Ссылка", "Контрагент"))
Это поле можно использовать в отборе на уровне группировки аналогично первому методу. Преимущество здесь в том, что мы не загромождаем список ресурсов и имеем более гибкий контроль над контекстом расчета.
Выясним причину, по которой иногда стандартный отбор не подходит. Если мы используем отбор по ресурсу, это может повлиять на расчет общих итогов по всему отчету (записи просто исчезнут из выборки). Если нам нужно, чтобы сумма в итогах осталась прежней, но визуально группировка с одной записью не отображалась, следует использовать «Условное оформление».
КоличествоДляОтбора Равно 1.0.1 (совсем скрыть строку не всегда удается, но можно сделать ее почти невидимой).0.1.Важно: Этот метод является «костыльным» и используется редко, так как он оставляет пустые тонкие строки в отчете. Лучше использовать полноценный отбор, если бизнес-логика позволяет исключить эти данные из визуализации.
Проанализируем техническую деталь, упомянутую опытными разработчиками: использование ресурсов в фильтрах группировок часто «ломает» расшифровку. Когда пользователь пытается дважды кликнуть на ячейку, чтобы открыть детальный отчет или документ, СКД может выдать ошибку или пустой результат, так как она пытается применить фильтр по ресурсу к детальным записям, где этот ресурс еще не рассчитан.
Чтобы избежать этой проблемы, рекомендуется:
РезультатКомпоновки, основываясь на данных, полученных в ПроцессорКомпоновкиДанных.Разберем ситуацию с иерархией. Если ваша группировка строится по справочнику с иерархией (например, Номенклатура), то стандартный подсчет КоличествоДляОтбора может учитывать саму группу как запись. В этом случае в условии отбора нужно использовать системное поле СКД СистемныеПоля.Уровень или проверять поле ЭтоГруппа, чтобы считать только «листья» дерева, а не промежуточные узлы.
Пример настройки отбора для иерархии:
Группа И (логическое И):
ЭтоГруппа Равно ЛожьКоличествоДляОтбора Больше 1Мы рассмотрели несколько подходов к управлению видимостью группировок. Самый стабильный и «чистый» с точки зрения архитектуры СКД — это Метод 1 (Ресурс + Локальный отбор группировки). Он не требует сложного программирования и легко поддерживается другими разработчиками. Однако всегда помните о том, что любые отборы по агрегатным функциям (сумма, количество) требуют предварительного расчета итогов, что накладывает определенные ограничения на структуру вашего отчета.