Как вывести несколько строк номенклатуры в одну ячейку кросс-таблицы СКД?

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

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

Стандартная группировка Номенклатура внутри строк или колонок приводит к эффекту «шахматки»: создается огромное количество пустых строк или столбцов, так как СКД пытается сопоставить каждый товар с каждой датой во всем периоде. Если ассортимент составляет сотни позиций, а в день продается всего 3–5, отчет становится нечитаемым. Рассмотрим, как решить эту проблему несколькими способами.

Способ 1: Использование функции ВычислитьВыражениеСГруппировкойТаблицаЗначений

Этот метод позволяет собрать данные в таблицу значений прямо внутри ресурса и вывести их в ячейку. Это наиболее мощный инструмент для динамического формирования списков в кросс-отчетах.

Проанализируем шаги настройки:

  1. Перейдем на закладку Ресурсы в схеме компоновки данных.
  2. Добавим поле Номенклатура (или создадим новое вычисляемое поле, если нужно выводить связку «Товар + Кол-во»).
  3. В поле «Выражение» пропишем следующую конструкцию:

ВычислитьВыражениеСГруппировкойТаблицаЗначений(
    "Номенклатура, Сумма(Количество)", 
    "Номенклатура"
)

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

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


ВычислитьВыражениеСГруппировкойТаблицаЗначений(
    "Номенклатура, Сумма(Количество)", 
    "Номенклатура", 
    , 
    "Сумма(Количество) Убыв"
)

Это позволит выводить вверху списка самые продаваемые товары за этот день.

Способ 2: Текстовый вывод через СоединитьСтроки

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

Рассмотрим выражение для ресурса:


СоединитьСтроки(
    ВычислитьВыражениеСГруппировкойМассив(
        "Номенклатура + "" - "" + Формат(Сумма(Количество), ""ЧЦ=10; ЧДЦ=0"")", 
        "Номенклатура"
    ), 
    Символы.ПС
)

Здесь мы сначала формируем массив строковых представлений (товар и количество через дефис), а затем склеиваем их, используя Символы.ПС (перенос строки) в качестве разделителя. В результате ячейка в Excel или табличном документе 1С автоматически растянется по вертикали, отображая аккуратный список.

Способ 3: Группировка по «Номеру строки» (Метод индексации)

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

Разберем реализацию по шагам:

  1. В запросе: С помощью механизма временных таблиц или оконных функций (если БД позволяет) присваиваем каждой записи порядковый номер внутри его группы. Если это сложно сделать в запросе, можно использовать вычисляемое поле с функцией ВычислитьВыражение.
  2. В настройках СКД:
    • В строки таблицы добавляем группировку ТорговаяТочка.
    • Внутри неё добавляем группировку по нашему вычисляемому полю НомерСтроки.
    • В колонки добавляем Период (Дату).

В этом случае СКД «схлопнет» все записи с номером 1 в одну строку, с номером 2 — в следующую. Если в «Точке А» 1-го числа было 5 товаров, а во «Точке Б» только 2, то в отчете под «Точкой Б» просто будет 3 пустых строки внизу, но общая «шахматка» по всему справочнику номенклатуры исчезнет. Это делает отчет компактным и наглядным.

Тонкости форматирования и вывода заголовков

Часто пользователи хотят видеть заголовки «Номенклатура» и «Кол-во» прямо внутри пересечения кросс-таблицы. Чтобы реализовать это при использовании Способа 1, можно прибегнуть к хитрости с макетами:

Выясним, как создать макет группировки. В СКД на закладке Макеты можно определить макет для группировки «Точка» или для области «Шапка». Однако для ячеек кросс-таблицы лучше использовать Макет поля. В ячейке макета можно нарисовать две колонки с названиями, а ниже разместить параметры, в которые СКД выведет результат работы наших функций.

Если же вы используете ВычислитьВыражениеСГруппировкойТаблицаЗначений, помните, что вы можете управлять составом выводимых колонок с помощью функции ПолучитьЧасть. Например, если вы создали ресурс-таблицу, но в конкретном месте отчета хотите вывести только названия товаров, используйте:

ПолучитьЧасть(ВашРесурсТаблицаЗначений, "Номенклатура")

Проанализировав все способы, можно сделать вывод: для простых списков идеально подходит СоединитьСтроки, для сложных аналитических представлений с сортировкой — ВычислитьВыражениеСГруппировкойТаблицаЗначений, а для достижения максимально строгого табличного вида без пустых пустот — метод с нумерацией строк внутри группы.

← На главную