Как сделать горизонтальную группировку строк и визуальное объединение ячеек в отчете СКД?

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

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

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

Способ 1. Программное объединение ячеек в постобработке (самый надежный метод)

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

Рассмотрим алгоритм действий. Мы настраиваем СКД на вывод обычной плоской таблицы, где колонка Номенклатура будет дублироваться для каждой характеристики. Основная магия будет происходить в модуле объекта отчета.

  1. Откроем модуль объекта отчета и найдем обработчик ПриКомпоновкеРезультата.
  2. Перехватим стандартный вывод отчета, сформировав табличный документ программно.
  3. Напишем алгоритм, который перебирает строки сформированного табличного документа сверху вниз.
  4. Если значение ячейки в колонке совпадает с предыдущим, алгоритм запоминает границы этой области.
  5. Как только значение меняется, вызывается метод Область.Объединить() для найденного вертикального диапазона.

В результате мы получаем ровную таблицу с объединенными ячейками. Текст в них можно выровнять по центру или по верхнему краю. Главный плюс этого метода — ссылки на объекты остаются полностью рабочими, так как мы физически объединили ячейки, содержащие одинаковые значения и параметры расшифровки.

Способ 2. Имитация объединения через условное оформление и границы

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

  1. Создадим составную группировку из двух полей (Номенклатура и Характеристика).
  2. Перейдем на вкладку "Условное оформление".
  3. Добавим новое правило, которое будет очищать текст (или делать цвет текста равным цвету фона, например, белым) для поля Номенклатура, если это значение повторяется. В СКД для этого можно использовать функции вычисления предыдущего значения или просто скрывать всё, кроме первой строки в группе.
  4. Далее в условном оформлении уберем верхние и нижние границы (свойство СтильГраницы) для смежных ячеек пустых дублей.

Визуально для пользователя несколько ячеек сольются в одну большую. Однако технически это всё еще будут разные строки табличного документа.

Способ 3. Сборка значений внутри одной ячейки (через перенос строк)

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

Разберем по шагам, как это реализовать:

  1. В схеме компоновки данных добавим поле Характеристика в ресурсы.
  2. В выражении ресурса пропишем формулу: СоединитьСтроки(Массив(Характеристика), Символы.ПС)Здесь Символы.ПС обеспечит перенос на новую строку для каждого элемента списка.
  3. В настройках условного оформления для этого поля установим свойство размещения текста в значение Переносить.

Итог: Отчет выведет ровно одну строку для каждой номенклатуры. В левой ячейке будет название товара, а в правой ячейке текст растянется по высоте, отображая все характеристики списком. Минус метода — теряется прямая ссылка. Пользователь не сможет кликнуть на конкретную характеристику из списка, чтобы открыть ее карточку.

Способ 4. Использование структуры "Таблица" с искусственной нумерацией

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

  1. В наборе данных (в запросе СКД) нам необходимо вычислить порядковый номер каждой характеристики внутри группы одной номенклатуры. Это можно сделать через соединение таблиц, либо с использованием оконных функций (если позволяет версия платформы и СУБД).
  2. В настройках структуры СКД выберем тип Таблица.
  3. В узел Строки поместим группировку по номенклатуре.
  4. В узел Колонки поместим наше вычисленное поле с порядковым номером.
  5. Само поле с наименованием характеристики мы назначим ресурсом, используя выражение Максимум(Характеристика).

При такой настройке для каждой номенклатуры будет сформирована ровно одна строка, а характеристики распределятся по колонкам слева направо: Характеристика 1, Характеристика 2 и так далее.

Способ 5. Свой макет и ручной вывод табличного документа

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

Если требования к гибким пользовательским настройкам (сортировки, отборы) минимальны, давайте рассмотрим "лобовой" подход:

  1. Мы создаем собственный макет табличного документа с нужными нам объединенными областями.
  2. Пишем обычный запрос, получаем выборку.
  3. В цикле обходим результат запроса и вручную выводим области в результирующий табличный документ, объединяя ячейки именно там, где это требует бизнес-логика.

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

Подведем итог: Выбор метода зависит от ваших приоритетов. Если нужна рабочая расшифровка и идеальный вид — используйте программную постобработку. Если достаточно визуального сходства — подойдут настройки условного оформления. Если характеристики можно слить в текст — используйте функцию объединения строк.

← На главную