При разработке отчетов на системе компоновки данных (СКД) программисты часто сталкиваются с ситуацией, когда стандартная таблица превращается в «лесенку». Вместо того чтобы выводить товары в одной строке под разными колонками-свойствами, СКД переносит каждый товар на новую строку. Это происходит из-за того, что записи в наборе данных технически уникальны, и система не видит связи между ними для их «уплотнения» в одну строку отчета. Рассмотрим подробнее, как решить эту задачу несколькими способами.
Представим, что у нас есть данные, где для одного Вида продукции существуют разные Свойства (Высокий, Средний, Низкий или NULL) и соответствующие им Товары. Если просто создать таблицу с группировкой строк по полю Вид и колонок по полю Свойство, мы получим разрозненную структуру. Главная причина — СКД сопоставляет одну детальную запись одной ячейке на пересечении. Если мы хотим, чтобы Товар1 и Товар2 стояли в одной строке под разными колонками, нам нужно «обмануть» или перенастроить механизм агрегации.
Проанализируем базовый запрос, который создает исходную выборку:
ВЫБРАТЬ
"Вид1" КАК Вид,
"Высокий" КАК Свойство,
"Товар1" КАК Товар
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
"Вид1", "Средний", "Товар2"
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
"Вид2", NULL, "Товар5"
Это самый быстрый и эффективный метод, если вам не принципиально, чтобы каждый товар находился в отдельной физической строке ячеек Excel. Мы можем заставить СКД собирать все товары, относящиеся к одной группе, в одну ячейку с переносом строки.
Разберем по шагам настройку этого метода:
Товар в список ресурсов.СоединитьСтроки(ВычислитьВыражениеСГруппировкойМассив("Товар", "Товар"), Символы.ПС)Вид, а в колонках — Свойство.Что это дает? Функция ВычислитьВыражениеСГруппировкойМассив соберет все товары для конкретного вида и свойства в массив, а СоединитьСтроки выведет их в одну ячейку, разделяя символом переноса строки. «Лесенка» исчезнет, так как для одного Вида будет создана ровно одна строка в отчете.
Если нам необходимо, чтобы каждый товар все же занимал отдельную строку (например, для корректного суммирования в дальнейшем или специфического оформления), применим метод нумерации записей внутри группы. Выясним причину «лесенки»: для СКД записи не имеют общего индекса внутри группы Вид.
Рассмотрим алгоритм реализации:
ПорядковыйНомерВГруппе. В новых версиях платформы это можно сделать через оконные функции прямо в тексте запроса:
ВЫБРАТЬ
Вид,
Свойство,
Товар,
ПОРЯДКОВЫЙ_НОМЕР() ОБРАБОТКА НАД (ПАРТИЦИЯ ПО Вид, Свойство ПОРЯДОК ПО Товар) КАК НомерСтроки
ИЗ
ВТДанные
Вид, а внутри него — по полю НомерСтроки.Свойство.В этом случае Товар3 (с индексом 1) и Товар4 (с индексом 1) окажутся в одной горизонтальной строке отчета, так как у них совпадает и Вид, и НомерСтроки.
Часто пользователи жалуются, что колонки со значением NULL пропадают или отображаются некорректно. Проанализируем ситуацию: для СКД NULL — это отсутствие значения, а не категория для группировки.
Чтобы решить эту проблему, выполним следующие действия:
Свойство на выражение: ЕстьNULL(Свойство, "Не определено"). Это создаст строковую категорию, которую СКД гарантированно выведет как заголовок колонки.Да.Чтобы отчет выглядел профессионально, воспользуемся Условным оформлением. Если вы используете метод с детальными записями, и поле Вид дублируется на каждой строке, разберем, как это скрыть:
Вид совпадает с предыдущим (или просто примените макет группировки с объединением ячеек).Посмотрим на результат: благодаря СоединитьСтроки или нумерации строк, мы получаем компактную таблицу-матрицу, которая легко читается и не содержит пустых пролетов.