При разработке отчетов на Системе Компоновки Данных (СКД) часто возникает задача построения кросс-таблицы, где на пересечении строк и колонок необходимо вывести не одно агрегированное число (сумму или количество), а целый список аналитических данных. Типичный пример: отчет по продажам, где в строках — торговые точки, в колонках — даты, а в ячейке должен отображаться список проданных в этот день товаров с их количеством.
Стандартная группировка Номенклатура внутри строк или колонок приводит к эффекту «шахматки»: создается огромное количество пустых строк или столбцов, так как СКД пытается сопоставить каждый товар с каждой датой во всем периоде. Если ассортимент составляет сотни позиций, а в день продается всего 3–5, отчет становится нечитаемым. Рассмотрим, как решить эту проблему несколькими способами.
Этот метод позволяет собрать данные в таблицу значений прямо внутри ресурса и вывести их в ячейку. Это наиболее мощный инструмент для динамического формирования списков в кросс-отчетах.
Проанализируем шаги настройки:
Номенклатура (или создадим новое вычисляемое поле, если нужно выводить связку «Товар + Кол-во»).
ВычислитьВыражениеСГруппировкойТаблицаЗначений(
"Номенклатура, Сумма(Количество)",
"Номенклатура"
)
Разберем, что происходит в этом выражении. Первый параметр — это список полей, которые мы хотим видеть в нашей «мини-таблице» внутри ячейки. Второй параметр указывает, в разрезе какой группировки собирать эти данные. В данном случае мы группируем по номенклатуре, чтобы избежать дублей, если один и тот же товар прошел по нескольким документам за день.
Важный нюанс: Чтобы данные внутри такой ячейки были упорядочены, можно использовать четвертый параметр функции — сортировку:
ВычислитьВыражениеСГруппировкойТаблицаЗначений(
"Номенклатура, Сумма(Количество)",
"Номенклатура",
,
"Сумма(Количество) Убыв"
)
Это позволит выводить вверху списка самые продаваемые товары за этот день.
Если нам не требуется строгое табличное оформление внутри ячейки (например, границы колонок между названием и количеством), гораздо проще использовать функцию СоединитьСтроки. Она преобразует массив данных в одну строку с заданным разделителем, например, переносом строки.
Рассмотрим выражение для ресурса:
СоединитьСтроки(
ВычислитьВыражениеСГруппировкойМассив(
"Номенклатура + "" - "" + Формат(Сумма(Количество), ""ЧЦ=10; ЧДЦ=0"")",
"Номенклатура"
),
Символы.ПС
)
Здесь мы сначала формируем массив строковых представлений (товар и количество через дефис), а затем склеиваем их, используя Символы.ПС (перенос строки) в качестве разделителя. В результате ячейка в Excel или табличном документе 1С автоматически растянется по вертикали, отображая аккуратный список.
Этот метод считается самым профессиональным, так как он сохраняет структуру полноценной таблицы и позволяет корректно выравнивать данные в соседних колонках. Суть заключается в том, чтобы пронумеровать продажи внутри каждой группы «Точка + Дата».
Разберем реализацию по шагам:
ВычислитьВыражение.ТорговаяТочка.НомерСтроки.Период (Дату).В этом случае СКД «схлопнет» все записи с номером 1 в одну строку, с номером 2 — в следующую. Если в «Точке А» 1-го числа было 5 товаров, а во «Точке Б» только 2, то в отчете под «Точкой Б» просто будет 3 пустых строки внизу, но общая «шахматка» по всему справочнику номенклатуры исчезнет. Это делает отчет компактным и наглядным.
Часто пользователи хотят видеть заголовки «Номенклатура» и «Кол-во» прямо внутри пересечения кросс-таблицы. Чтобы реализовать это при использовании Способа 1, можно прибегнуть к хитрости с макетами:
Выясним, как создать макет группировки. В СКД на закладке Макеты можно определить макет для группировки «Точка» или для области «Шапка». Однако для ячеек кросс-таблицы лучше использовать Макет поля. В ячейке макета можно нарисовать две колонки с названиями, а ниже разместить параметры, в которые СКД выведет результат работы наших функций.
Если же вы используете ВычислитьВыражениеСГруппировкойТаблицаЗначений, помните, что вы можете управлять составом выводимых колонок с помощью функции ПолучитьЧасть. Например, если вы создали ресурс-таблицу, но в конкретном месте отчета хотите вывести только названия товаров, используйте:
ПолучитьЧасть(ВашРесурсТаблицаЗначений, "Номенклатура")
Проанализировав все способы, можно сделать вывод: для простых списков идеально подходит СоединитьСтроки, для сложных аналитических представлений с сортировкой — ВычислитьВыражениеСГруппировкойТаблицаЗначений, а для достижения максимально строгого табличного вида без пустых пустот — метод с нумерацией строк внутри группы.