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

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

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

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

Почему СКД выводит лишние данные по умолчанию?

Выясним причину стандартного поведения платформы 1С:

  1. Строка «Контрагент, Договор»: при создании группировки на вкладке Выбранные поля по умолчанию установлен служебный элемент Авто. В этом режиме СКД берет поле текущей группировки и поля всех вышестоящих родителей, объединяя их наименования через запятую.
  2. Итог для единственной строки: в СКД нет штатного флажка «Не выводить группировку, если в ней 1 запись». Генератор макета создает заголовок или подвал группировки всегда, когда в выборке есть хотя бы одна подчиненная строка. Стандартное условное оформление не умеет физически удалять строки из результирующего табличного документа — оно может лишь скрыть текст или изменить цвет.

Способ 1. Убираем наименование контрагента из строки договора

Разберем по шагам, как избавиться от склеивания полей в заголовке строки:

  1. В схеме компоновки данных перейдем на вкладку Настройки и выделим в дереве структуры группировку Договор.
  2. В нижней панели перейдем на вкладку Выбранные поля.
  3. Удалим элемент Авто.
  4. Добавим вручную только необходимые поля: поле группировки Договор и числовые ресурсы (например, Стоимость).

После этого заголовок группировки будет содержать исключительно наименование договора без подтягивания родительского контрагента.

Способ 2. Разделение структуры на параллельные ветки (без программирования)

Рассмотрим наиболее надежный и чистый способ формирования отчета без написания программного кода. Идея заключается в том, чтобы разделить вывод повторяющихся и одиночных договоров на две параллельные ветки структуры с взаимно исключающими отборами.

Шаг 1. Вычисление количества записей в запросе

В тексте запроса набора данных добавим вычисление количества строк в разрезе договора. Для этого используем оконную функцию или соединение со сгруппированным подзапросом:


ВЫБРАТЬ
    Взаиморасчеты.Контрагент КАК Контрагент,
    Взаиморасчеты.Договор КАК Договор,
    Взаиморасчеты.Сумма КАК Стоимость,
    КОЛИЧЕСТВО(*) OVER(PARTITION BY Взаиморасчеты.Контрагент, Взаиморасчеты.Договор) КАК КоличествоСтрокПоДоговору
ИЗ
    РегистрНакопления.ВзаиморасчетыСКонтрагентами КАК Взаиморасчеты

Шаг 2. Настройка структуры отчета

В настройках СКД создадим следующую иерархию:

  1. Корневая группировка: Контрагент.
  2. Внутри группировки Контрагент добавим две подчиненные ветки одного уровня:
    1. Ветка для групп (более одной записи):

      Создаем группировку Договор, а внутри нее — Детальные записи.

      В свойствах группировки Договор на вкладке Отбор задаем условие: КоличествоСтрокПоДоговору Больше 1.

    2. Ветка для одиночных записей:

      Добавляем напрямую Детальные записи (без родительской группировки Договор).

      В свойствах этих детальных записей на вкладке Отбор задаем условие: КоличествоСтрокПоДоговору Равно 1.

  3. Чтобы служебные условия отбора не выводились в шапку отчета, в дополнительных настройках обеих подчиненных веток установим параметр Выводить отбор в значение Не выводить.

В результате одиночные договоры выведутся обычной детальной строкой, а договоры с несколькими записями получат полноценную группировку с промежуточным итогом.

Способ 3. Подавление ресурса через формулу вычисления

Если структура отчета фиксирована, но требуется исключить дублирование суммовых показателей, настроим выражение вычисления ресурса на вкладке Ресурсы.

В поле Выражение для ресурса Стоимость укажем условие:


Выбор 
    Когда Количество(Стоимость) > 1 Тогда 
        Сумма(Стоимость) 
    Иначе 
        NULL 
Конец

В колонке Рассчитывать по... укажем группировку Договор. При таком подходе, если в группе всего одна запись, значение ресурса в итоговой строке группировки не заполнится, что предотвратит дублирование чисел в глазах пользователя.

Способ 4. Программный вывод через событие ПриКомпоновкеРезультата

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

В модуле отчета переопределим процедуру ПриКомпоновкеРезультата:


Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
    
    СтандартнаяОбработка = Ложь;
    
    Настройки = КомпоновщикНастроек.ПолучитьНастройки();
    
    КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
    МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Настройки, ДанныеРасшифровки);
    
    ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
    ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, , ДанныеРасшифровки, Истина);
    
    ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
    ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
    
    ПроцессорВывода.Вывести(ПроцессорКомпоновки);
    
    // Постобработка: удаление пустых/дублирующих строк
    // При необходимости можно обойти строки ДокументРезультат и удалить лишние
    
КонецПроцедуры

Использование разделения структуры на параллельные ветки в схеме компоновки данных является наиболее универсальным решением, так как не требует изменения программного кода и корректно работает в любых типовых конфигурациях.

← На главную