Всем доброго времени суток.
Данная статья используется больше для себя как шпаргалка.
Опишу вкратце задачу. Иногда возникает ситуация, когда пользователь хочет видеть отчеты с объединёнными ячейками как в Экселе (визуально представлено на главной картинке темы). Каждый раз приходилось что-то выдумывать. И данная задача решалась разными методами.
Получилось так, что недавно поступило много таких однотипных задач. И пришлось для себя выработать некое универсальное решение.
Все отчеты написаны на СКД. Дальше я делал обычный макет в СКД и основную форму у данного отчета. После чего я переопределял стандартную процедуру «ПриКомпоновкеРезультата» .
Все действия по созданию внешнего отчета (создать внешний отчет на СКД с использованием своего макета и основной формы) – стандартны. Не буду их описывать.
В чем заключается мое универсальное решение. В процедуре «ПриКомпоновкеРезультата» после стандартного вывода отчета я начинаю работать с самим табличным документом (куда вывел результат). Определяю высоту таблицы. И в цикле прохожу сам табличный документ по определенным ячейкам. Что имеется в виду:
На примере: Мне надо одинаковых контрагентов объединить в одну ячейку и вывести на против детальных записей. Для этого я запоминаю начало области первого контрагента, и когда при чтении следующей области сменился контрагента, я делаю отсечку области, запоминаю ее и объединяю.
После чего снова запоминаю начало области и дальше в цикле иду до следующего контрагента.
Ниже код. + внешний отчет для примера.
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
ДокументРезультат.Очистить();
ДокументРезультат.АвтоМасштаб = Истина;
ДокументРезультат.ОриентацияСтраницы = ОриентацияСтраницы.Ландшафт;
ДокументРезультат.Защита = Ложь;
ДокументРезультат.ОтображатьЗаголовки = Истина;
//+Стандартный вывод СКД отчета
МакетСКД = ЭтотОбъект.ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
Настройки = ЭтотОбъект.КомпоновщикНастроек.ПолучитьНастройки();
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
//+ssn внесем свои коррективы в типовой вывод
ТекДата = Настройки.ПараметрыДанных.Элементы[1].Значение;
МакетСКД.Макеты.Макет1.Параметры.МесяцОтчета.Выражение = """" + НРег(СклонениеПредставленийОбъектов.ПросклонятьПредставление(Формат(ТекДата.Дата, "ДФ=ММММ"), 2,)) +"""";
//-ssn внесем свои коррективы в типовой вывод
МакетКомпоновки = КомпоновщикМакета.Выполнить(МакетСКД,Настройки,ДанныеРасшифровки);
ПроцессорКД = Новый ПроцессорКомпоновкиДанных;
ПроцессорКД.Инициализировать(МакетКомпоновки,,ДанныеРасшифровки, Истина);
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
ПроцессорВывода.Вывести(ПроцессорКД);
//-Стандартный вывод СКД отчета
//+Объеденим ячейки
ОбъединитьЯчейкиВТабличномДокументе(ДокументРезультат);
//-Объеденим ячейки
КонецПроцедуры
Процедура ОбъединитьЯчейкиВТабличномДокументе(ТабличныйДокумент) Экспорт
СтарыйКонтрагент = "";
НачалоОбласти = "";
ЭтоПервыйВход = Истина;
//представим нашу область объединения ввиде квадрата.
//его параметры:
// верхний левый улог - строка R26 столбец С6
// правый нижний угол - строка R26 столбец С23
//в итоге получилась область R26С6:R26С23
//так вот для того, чтобы программно объединить ячейки - в моем случаи нужно узнать строки. А колонки всегда жестко завязаны.
ОбластьЛевыйВерхнийУгол = 26;
ОбластьПравыйНижнийУгол = 26;
ВысотаТЧ = ТабличныйДокумент.ВысотаТаблицы;
Для Сч = 26 По ВысотаТЧ Цикл
ТекОбласть = "R" + Сч + "C6:R" + Сч + "C23";
НайденнаяОбласть = ТабличныйДокумент.Область(ТекОбласть);
Если ТекОбласть <> НачалоОбласти И НайденнаяОбласть.Текст <> СтарыйКонтрагент Тогда
Если НЕ ЭтоПервыйВход Тогда
ГотоваяОбластьДляОбъединения = "R" + Строка(ОбластьЛевыйВерхнийУгол) + "C6:R" + Строка(Сч-1) + "C23";
ОбластьЛевыйВерхнийУгол = Сч;
ОбластьПравыйНижнийУгол = Сч;
Область = ТабличныйДокумент.Область(ГотоваяОбластьДляОбъединения);
Область.Объединить();
Иначе
ЭтоПервыйВход = Ложь;
КонецЕсли;
НачалоОбласти = ТекОбласть;
СтарыйКонтрагент = НайденнаяОбласть.Текст;
КонецЕсли;
КонецЦикла;
КонецПроцедуры