Как в СКД вывести группировку только в том случае, если в ней больше одной записи

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

При разработке отчетов на Системе компоновки данных (СКД) часто возникает стилистическая или функциональная задача: скрыть «лишние» уровни иерархии. Типичный пример — когда в группировке находится всего одна детальная запись. В этом случае дублирование информации (в строке группировки и в детальной строке) выглядит избыточным. Разберем подробно, как реализовать условие, при котором группировка отображается только при наличии нескольких подчиненных записей, и рассмотрим подводные камни каждого метода.

Метод 1: Использование ресурсов и отборов на уровне группировки

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

Рассмотрим по шагам процесс настройки:

  1. Создание поля-счетчика в запросе: Для начала нам нужно поле, которое мы сможем суммировать. В конструкторе запроса на закладке «Объединения/Псевдонимы» добавим поле со значением 1 и назовем его, например, КоличествоДляОтбора.

    Пример части запроса:

    
    ВЫБРАТЬ
        Продажи.Номенклатура КАК Номенклатура,
        Продажи.Количество КАК КоличествоПродаж,
        1 КАК КоличествоДляОтбора
    ИЗ
        РегистрНакопления.Продажи КАК Продажи
    
  2. Настройка ресурса: Перейдем на закладку «Ресурсы» в схеме компоновки. Нам нужно сделать наше поле КоличествоДляОтбора ресурсом, указав выражение Сумма(КоличествоДляОтбора).
  3. Настройка структуры отчета: Перейдем на закладку «Настройки». Предположим, у нас есть группировка по полю Контрагент, а внутри нее — детальные записи. Нам нужно, чтобы Контрагент выводился, только если у него больше одной записи.
  4. Установка локального отбора: Это критически важный момент. Мы должны установить отбор не для всего отчета, а именно для конкретной группировки Контрагент.
    • Выделим группировку Контрагент в дереве настроек.
    • В нижней части окна перейдем на закладку «Отбор».
    • Добавим новое условие: КоличествоДляОтбора Больше 1.
    • Чтобы этот технический отбор не мозолил глаза пользователю, перейдем в «Дополнительные настройки» этой группировки и установим параметр «Выводить отбор» в значение «Не выводить».

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

Метод 2: Использование функций СКД в вычисляемых полях

Иногда добавление поля в запрос неудобно (например, если используется объектный источник данных). В современных версиях платформы 8.3 мы можем воспользоваться функциями языка выражений СКД.

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

Посмотрим на пример выражения для вычисляемого поля КоличествоВГруппе:

Количество(ВычислитьВыражениеСГруппировкойМассив("Ссылка", "Контрагент"))

Это поле можно использовать в отборе на уровне группировки аналогично первому методу. Преимущество здесь в том, что мы не загромождаем список ресурсов и имеем более гибкий контроль над контекстом расчета.

Метод 3: Визуальное скрытие через Условное оформление

Выясним причину, по которой иногда стандартный отбор не подходит. Если мы используем отбор по ресурсу, это может повлиять на расчет общих итогов по всему отчету (записи просто исчезнут из выборки). Если нам нужно, чтобы сумма в итогах осталась прежней, но визуально группировка с одной записью не отображалась, следует использовать «Условное оформление».

  1. Перейдем в настройки нужной группировки на закладку «Условное оформление».
  2. Добавим условие: КоличествоДляОтбора Равно 1.
  3. В параметрах оформления установим:
    • Максимальная высота: 0.1 (совсем скрыть строку не всегда удается, но можно сделать ее почти невидимой).
    • Минимальная высота: 0.1.
    • Текст: (пустая строка).

Важно: Этот метод является «костыльным» и используется редко, так как он оставляет пустые тонкие строки в отчете. Лучше использовать полноценный отбор, если бизнес-логика позволяет исключить эти данные из визуализации.

Проблема расшифровки и ее решение

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

Чтобы избежать этой проблемы, рекомендуется:

Метод 4: Иерархические справочники

Разберем ситуацию с иерархией. Если ваша группировка строится по справочнику с иерархией (например, Номенклатура), то стандартный подсчет КоличествоДляОтбора может учитывать саму группу как запись. В этом случае в условии отбора нужно использовать системное поле СКД СистемныеПоля.Уровень или проверять поле ЭтоГруппа, чтобы считать только «листья» дерева, а не промежуточные узлы.

Пример настройки отбора для иерархии:

Группа И (логическое И):

  1. ЭтоГруппа Равно Ложь
  2. КоличествоДляОтбора Больше 1

Итоги

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

← На главную