При разработке отчетов на базе Системы компоновки данных (СКД) программисты часто сталкиваются с ситуацией, когда значения родительской группировки дублируются в каждой строке подчиненной группировки. Например, если у нас есть иерархия Начальник — Сотрудник, по умолчанию система может выводить фамилию начальника напротив каждой строки с фамилией сотрудника. Это делает отчет перегруженным и трудночитаемым. В этой статье мы подробно рассмотрим, как настроить отчет так, чтобы родительское поле выводилось только один раз. Для более сложных случаев, выходящих за рамки стандартных настроек, может пригодиться пользовательская СКД, расширяющая возможности построения отчетов.
Это самый правильный и «чистый» способ с точки зрения логики работы СКД. Проблема дублирования часто возникает из-за того, что поле Начальник добавлено в Выбранные поля на самом верхнем уровне (на уровне всего отчета). В этом случае все вложенные группировки наследуют этот набор полей.
Проанализируем шаги для исправления этой ситуации:
Сотрудник).Начальник). Оставим только Сотрудник и необходимые числовые показатели.Таким образом, система выведет строку группировки Начальник с его данными, а в строках Сотрудник колонка начальника просто останется пустой, так как мы явно указали системе не выводить это поле на данном уровне. Чтобы точно отладить, какие данные попадают в результат запроса на каждом этапе, разработчики часто используют инструменты вроде консоли запросов с поддержкой СКД — для этого подойдёт универсальная консоль запросов и СКД для разработчика 1С.
Если мы хотим изменить визуальную структуру всего отчета, нам поможет настройка размещения. Разберем, как влияют параметры на закладке Дополнительные настройки на итоговый результат.
Найдем параметр Расположение полей группировок. Рассмотрим его значения:
Выясним причину, по которой отчет выглядит как плоская таблица. Часто это происходит из-за настройки Тип макета. Если в Дополнительных настройках установлен тип Список, система будет стремиться заполнить каждую ячейку данными, чтобы строку можно было идентифицировать однозначно (как в Excel-таблице для фильтрации).
Рассмотрим переход к иерархическому виду:
Дерево.Ступенчатый.При таких настройках значение Начальник будет выведено в отдельной строке-заголовке, а все подчиненные сотрудники будут отображены ниже со смещением вправо (отступом), что визуально исключает необходимость дублировать фамилию начальника в каждой строке. Такой подход является основой для построения сложных аналитических форм, например, когда создается универсальный отчет по метаданным для анализа структуры конфигурации.
Иногда структура отчета настолько сложна, что стандартные настройки группировок не дают нужного результата. В этом случае мы можем прибегнуть к «хитрости» — скрыть текст повторяющихся значений программно через Условное оформление. Этот подход является одним из множества нетривиальных приемов, наряду с такими техниками, как использование двух разных схем в одном отчете СКД, когда требуется добиться особой логики вывода.
Разберем алгоритм настройки:
Ложь, но пустой текст обычно надежнее).Уровень. Нам нужно условие: СистемныеПоля.Уровень Больше 1.Начальник.Теперь система будет выводить значение начальника только на первом уровне иерархии. Как только уровень вложенности становится больше единицы (строки сотрудников), поле Начальник в этих строках будет «затираться» пустым текстом согласно нашему правилу оформления.
В редких случаях, когда отчет формируется полностью программно, мы можем управлять выводом через ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент. Посмотрим на пример кода, который позволяет перехватывать вывод строк:
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
ПроцессорВывода.НачатьВывод();
Пока Истина Цикл
ЭлементРезультата = ПроцессорКомпоновки.Следующий();
Если ЭлементРезультата = Неопределено Тогда
Прервать;
КонецЕсли;
// Здесь можно проанализировать ЭлементРезультата.ЗначенияПараметров
// И при необходимости очистить значение конкретного поля перед выводом
ПроцессорВывода.ВывестиЭлемент(ЭлементРезультата);
КонецЦикла;
ПроцессорВывода.ЗакончитьВывод();
Используя этот цикл, можно реализовать более сложную логику, например, программное изменение заголовка группировки, когда стандартных средств СКД не хватает. Однако, подчеркнем, что к программному методу стоит прибегать только тогда, когда интерактивные настройки КомпоновщикНастроек не справляются с задачей.
Мы проанализировали несколько способов решения задачи. Самым эффективным и простым в обслуживании является Метод 1 (настройка состава полей для каждой группировки отдельно). Он не требует написания кода и корректно работает при выгрузке отчета в форматы Excel или PDF.
Если же ваша задача — сделать отчет максимально компактным, используйте Тип макета: Дерево. Помните, что правильная иерархия в СКД строится не только на полях, но и на логике взаимодействия группировок в структуре настроек. Всегда проверяйте, чтобы Автополе в выбранных полях не «затягивало» лишние данные с верхних уровней, если вы решили настраивать состав колонок вручную. Для детального анализа запроса и наборов данных на всех этапах формирования отчета удобно использовать инструменты вроде консоли запросов для управляемых форм.