Когда мы работаем с отчетами в 1С, часто возникает потребность отобразить данные в виде, где группировки расположены горизонтально, а некоторые ячейки, содержащие одинаковые значения, должны быть объединены. Это позволяет сделать отчет более компактным и наглядным. Рассмотрим, как добиться такого результата, используя возможности Системы компоновки данных (СКД) и дополнительные программные подходы.
Прежде всего, давайте разберем, как стандартными средствами СКД можно расположить группировки горизонтально. Этот функционал достаточно гибок, но имеет свои ограничения. 1. **Использование измерения "Колонки" в структуре отчета:** Если мы хотим, чтобы определенные этапы или характеристики выводились как колонки, а не как строки, нам необходимо добавить соответствующие поля в измерение "Колонки" структуры отчета. * Откройте настройки отчета в СКД. * Перейдите на вкладку "Структура". * Добавьте элемент "Таблица". * Внутри элемента "Таблица" вы увидите две области: "Строки" и "Колонки". Перетащите или добавьте те поля, которые должны формировать горизонтальные группировки, в область "Колонки". Поля, которые должны формировать вертикальные группировки, оставьте в области "Строки". Это базовый и наиболее очевидный способ для горизонтального разворота данных. 2. **Настройка "Расположение полей группировок = Отдельно":** В настройках группировки СКД есть параметр "Расположение полей группировок". Если мы установим его в значение "Отдельно", то каждое поле группировки будет выводиться в отдельной области отчета, расположенной слева направо. Существует также вариант "Отдельно и только в итогах". * В настройках структуры отчета выберите нужную группировку. * Перейдите в свойства выбранной группировки. * Найдите свойство "Расположение полей группировок" и установите его в "Отдельно". Это может помочь визуально разделить и расположить группировки горизонтально, создавая более читабельный макет. Однако, важно понимать, что эти стандартные методы СКД, хоть и позволяют расположить данные горизонтально, не решают проблему объединения ячеек, содержащих повторяющиеся данные. Например, если у нас есть несколько строк, относящихся к одному "Заказу", стандартные настройки не объединят ячейки с номером заказа в одну большую ячейку.
Мы выяснили, что стандартные возможности СКД отлично справляются с горизонтальным расположением группировок, но не умеют динамически объединять ячейки в табличном документе отчета на основе повторяющихся значений данных. Это является одним из ключевых ограничений СКД, когда речь заходит о создании сложных "накрывающих" шапок или объединении полей, как это часто требуется в печатных формах.
* **Условное оформление:**
Иногда возникает идея использовать "Условное оформление" для имитации объединенных ячеек. Например, можно скрыть границы повторяющихся ячеек и изменить их фон, чтобы они выглядели как одна объединенная ячейка.
* В настройках СКД перейдите на вкладку "Условное оформление".
* Добавьте новый элемент оформления.
* Укажите условие, при котором ячейка должна "сливаться" с предыдущей (например, если значение совпадает с предыдущей строкой и это не первая строка группы).
* В свойствах оформления настройте "Граница" (уберите нижнюю/верхнюю/левую/правую границу) и, возможно, "Цвет фона".
Однако, мы должны проанализировать эту ситуацию: условное оформление может лишь изменить внешний вид ячеек, но не способно физически их объединить. Ячейки фактически остаются отдельными. Это может привести к следующим проблемам:
* При выделении мышью пользователь будет видеть отдельные ячейки.
* При экспорте отчета в форматы типа Excel (.xls, .xlsx) ячейки также не будут объединены, что может нарушить структуру и читабельность.
* Могут возникнуть артефакты с границами, когда последняя строчка группы может оказаться без нижней границы, что выглядит достаточно неожиданно для пользователя.
Таким образом, для достижения желаемого эффекта с реальным объединением ячеек нам потребуются более продвинутые методы.
Для реализации динамического объединения ячеек и создания по-настоящему сложных макетов, которые выходят за рамки стандартных возможностей СКД, мы можем рассмотреть несколько подходов.
Принцип работы:
После того как СКД сгенерировала отчет и он представлен в виде объекта ТабличныйДокумент (например, в результате вызова метода СкомпоноватьРезультат() или после стандартного вывода отчета), мы можем получить доступ к этому объекту и его ячейкам. У объекта ТабличныйДокумент есть метод ОбъединитьЯчейки(), который позволяет объединять произвольные прямоугольные области ячеек.
Шаги реализации:
ОбъединитьЯчейки(): Как только мы определили такую область, вызываем метод ОбъединитьЯчейки(), передавая ему координаты начальной и конечной ячейки.Пример кода (концептуальный):
&НаКлиенте
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
СтандартнаяОбработка = Истина; // Или Ложь, если полностью управляем выводом
// Если не управляем выводом полностью, то сначала СКД формирует отчет.
// Далее получаем ДокументРезультат (ТабличныйДокумент), сформированный СКД.
// Пример для объединения ячеек в колонке 1 (индекс 0) по повторяющимся значениям
// Предполагается, что данные уже отсортированы по этой колонке
Если ДокументРезультат.Области.Количество() = 0 Тогда
Возврат; // Отчет пустой
КонецЕсли;
НачальнаяСтрокаОбъединения = 1; // Предположим, что первая строка - это заголовок
Для ТекущаяСтрока = 2 По ДокументРезультат.ВысотаТаблицы Цикл
ЗначениеТекущейЯчейки = ДокументРезультат.Область(ТекущаяСтрока, 1).Текст;
ЗначениеПредыдущейЯчейки = ДокументРезультат.Область(ТекущаяСтрока - 1, 1).Текст;
Если ЗначениеТекущейЯчейки <> ЗначениеПредыдущейЯчейки Тогда
// Значение изменилось, объединяем предыдущий блок
Если НачальнаяСтрокаОбъединения < ТекущаяСтрока - 1 Тогда
// Если есть что объединять (более одной строки)
ДокументРезультат.ОбъединитьЯчейки(НачальнаяСтрокаОбъединения, 1, ТекущаяСтрока - 1, 1);
КонецЕсли;
НачальнаяСтрокаОбъединения = ТекущаяСтрока;
КонецЕсли;
КонецЦикла;
// Объединяем последний блок, если он есть
Если НачальнаяСтрокаОбъединения < ДокументРезультат.ВысотаТаблицы Тогда
ДокументРезультат.ОбъединитьЯчейки(НачальнаяСтрокаОбъединения, 1, ДокументРезультат.ВысотаТаблицы, 1);
КонецЕсли;
КонецПроцедуры
Преимущества:
Недостатки:
Принцип работы:
Мы полностью отключаем стандартный вывод СКД и в обработчике ПриКомпоновкеРезультата() или в отдельной функции пошагово формируем табличный документ. Для этого мы получаем данные из СКД с помощью КомпоновщикМакета.Выполнить() и ПроцессорКомпоновкиДанных.Вывести(), а затем вручную размещаем их в свой ТабличныйДокумент, используя методы ВывестиОбласть(), Присоединить() и, конечно, ОбъединитьЯчейки().
Преимущества:
Недостатки:
Принцип работы:
Мы создаем в конфигураторе макет табличного документа, в котором заранее объединяем нужные ячейки. Затем этот макет привязываем к соответствующему элементу СКД (например, к макету заголовка отчета или макету группировки). СКД будет использовать этот макет при выводе.
Преимущества:
Недостатки:
В заключение, если перед нами стоит задача просто горизонтально расположить группировки, стандартные настройки СКД, такие как добавление полей в "Колонки" и опция "Расположение полей группировок = Отдельно", нам помогут. Однако, если мы хотим добиться реального объединения ячеек по данным, нам придется прибегнуть к программной постобработке табличного документа или использовать поэлементный вывод результата, взвешивая при этом гибкость и трудозатраты.
← К списку