При разработке отчетов в 1С часто возникает задача сформировать таблицу не в виде стандартного иерархического дерева, а с горизонтальной группировкой. Давайте разберем классическую ситуацию: у нас есть колонка с номенклатурой и колонка с ее характеристиками. Требуется, чтобы ячейка с номенклатурой визуально объединяла несколько строк характеристик, расположенных справа (как это привычно выглядит в Excel). При этом стандартные средства Системы Компоновки Данных (СКД) по умолчанию выводят каждую строку отдельно, дублируя номенклатуру, либо строят лесенку.
Проанализируем доступные методы решения этой задачи, от самых простых настроек до программной постобработки отчета. Рассмотрим по шагам каждый из подходов, чтобы выбрать оптимальный для вашей конкретной ситуации.
Если нам критически важно получить идеальное визуальное объединение ячеек и при этом сохранить работоспособность расшифровки (чтобы двойной клик открывал карточку номенклатуры), лучше всего использовать программную обработку готового результата.
Рассмотрим алгоритм действий. Мы настраиваем СКД на вывод обычной плоской таблицы, где колонка Номенклатура будет дублироваться для каждой характеристики. Основная магия будет происходить в модуле объекта отчета.
ПриКомпоновкеРезультата.Область.Объединить() для найденного вертикального диапазона.В результате мы получаем ровную таблицу с объединенными ячейками. Текст в них можно выровнять по центру или по верхнему краю. Главный плюс этого метода — ссылки на объекты остаются полностью рабочими, так как мы физически объединили ячейки, содержащие одинаковые значения и параметры расшифровки.
Если мы не хотим писать много кода в модуле объекта, давайте рассмотрим вариант обмана зрения с помощью штатных настроек СКД. Суть метода заключается в том, чтобы сделать дублирующиеся значения невидимыми и стереть границы между ними.
Номенклатура, если это значение повторяется. В СКД для этого можно использовать функции вычисления предыдущего значения или просто скрывать всё, кроме первой строки в группе.СтильГраницы) для смежных ячеек пустых дублей.Визуально для пользователя несколько ячеек сольются в одну большую. Однако технически это всё еще будут разные строки табличного документа.
Проанализируем ситуацию, когда пользователю важен именно внешний вид компактного списка, а интерактивная расшифровка каждой отдельной характеристики не требуется. Мы можем вывести все характеристики в одну единственную ячейку.
Разберем по шагам, как это реализовать:
Характеристика в ресурсы.СоединитьСтроки(Массив(Характеристика), Символы.ПС)Здесь Символы.ПС обеспечит перенос на новую строку для каждого элемента списка.Переносить.Итог: Отчет выведет ровно одну строку для каждой номенклатуры. В левой ячейке будет название товара, а в правой ячейке текст растянется по высоте, отображая все характеристики списком. Минус метода — теряется прямая ссылка. Пользователь не сможет кликнуть на конкретную характеристику из списка, чтобы открыть ее карточку.
Давайте посмотрим на еще один элегантный способ, если нам нужно развернуть характеристики горизонтально в разные колонки одной строки. Для этого нам понадобится структура кросс-таблицы, но поскольку классических числовых ресурсов у нас нет, мы применим хитрость.
Таблица.Строки поместим группировку по номенклатуре.Колонки поместим наше вычисленное поле с порядковым номером.Максимум(Характеристика).При такой настройке для каждой номенклатуры будет сформирована ровно одна строка, а характеристики распределятся по колонкам слева направо: Характеристика 1, Характеристика 2 и так далее.
Для утвержденных, сложных неаналитических печатных форм и регламентированных отчетов иногда проще вообще отказаться от магии компоновки. Как верно отмечают специалисты, попытки заставить СКД делать слишком сложное форматирование часто приводят к нечитаемому коду и проблемам при дальнейшей поддержке.
Если требования к гибким пользовательским настройкам (сортировки, отборы) минимальны, давайте рассмотрим "лобовой" подход:
Если же гибкие отборы СКД необходимы, то мы можем использовать СКД только как движок для генерации набора данных (выводить результат через ПроцессорКомпоновкиДанных в коллекцию значений или дерево значений), а уже затем эту коллекцию программно отрисовывать в табличный документ по собственным правилам.
Подведем итог: Выбор метода зависит от ваших приоритетов. Если нужна рабочая расшифровка и идеальный вид — используйте программную постобработку. Если достаточно визуального сходства — подойдут настройки условного оформления. Если характеристики можно слить в текст — используйте функцию объединения строк.