Объединяем ячейки с одинаковым текстом в шапке отчёта.
Допустим, мы разрабатываем отчёт, в котором в колонках таблицы могут отображаться несколько колонок с одинаковыми заголовками. Наша задача объединить ячейки с одинаковыми заголовками и оставить в объединённой области всего один заголовок.
Структура отчёта:
В ячейках таблицы выводится реквизит "Остаток к оплате":
Ячейки с повторяющимися заголовками реквизита мы и будем объединять, чтобы получить такой вид:
Для решения задачи в модуле объекта отчёта разместим следующие процедуры и функции:
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) СтандартнаяОбработка = Ложь; ВывестиСКДВТабличныйДокумент(СхемаКомпоновкиДанных, ДокументРезультат, КомпоновщикНастроек); Маркер = "Остаток к оплате"; ОбъединитьЯчейкиВТабличномДокументе(ДокументРезультат, Маркер); КонецПроцедуры Процедура ОбъединитьЯчейкиВТабличномДокументе(ТабличныйДокумент, МаркерОбъединения) Экспорт ОбъединяемыеЯчейки = НайтиОбластиТабличногоДокументаПоВхождениюПодстроки(ТабличныйДокумент, МаркерОбъединения); ОбъединяемыеЯчейки.Колонки.Добавить("Диапазон"); ОбъединяемыеЯчейки.Сортировать("Верх,Лево"); Для Каждого Строка из ОбъединяемыеЯчейки Цикл Отбор = Новый Структура("Текст,Верх,Лево", Строка.Текст, Строка.Верх-1, Строка.Лево); НайденныеСтроки = ОбъединяемыеЯчейки.НайтиСтроки(Отбор); Если НайденныеСтроки.Количество() Тогда Строка.Диапазон = НайденныеСтроки[0].Диапазон; Строка.Диапазон.Низ = Макс(Строка.Диапазон.Низ, Строка.Верх); Продолжить; КонецЕсли; Отбор = Новый Структура("Текст,Верх,Лево", Строка.Текст, Строка.Верх, Строка.Лево-1); НайденныеСтроки = ОбъединяемыеЯчейки.НайтиСтроки(Отбор); Если НайденныеСтроки.Количество() Тогда Строка.Диапазон = НайденныеСтроки[0].Диапазон; Строка.Диапазон.Право = Макс(Строка.Диапазон.Право, Строка.Лево); Продолжить; КонецЕсли; Строка.Диапазон = Новый Структура("Текст,Верх,Лево,Низ,Право", Строка.Текст, Строка.Верх, Строка.Лево, Строка.Верх, Строка.Лево); КонецЦикла; ОбъединяемыеЯчейки.Свернуть("Диапазон"); Для Каждого Строка Из ОбъединяемыеЯчейки Цикл Диапазон = Строка.Диапазон; Область = ТабличныйДокумент.Область(Диапазон.Верх, Диапазон.Лево, Диапазон.Низ, Диапазон.Право); Область.Объединить(); ЦветТекстаГруппировки = Новый Цвет(100, 81, 45); ЦветРамки = Новый Цвет(200, 192, 173); Область.ЦветТекста = ЦветТекстаГруппировки; Область.ГраницаСнизу = Новый Линия(ТипЛинииЯчейкиТабличногоДокумента.Сплошная, 1); КонецЦикла; КонецПроцедуры Функция НайтиОбластиТабличногоДокументаПоВхождениюПодстроки(ТабличныйДокумент, ПодстрокаПоиска) Экспорт НайденныеОбласти = Новый ТаблицаЗначений; НайденныеОбласти.Колонки.Добавить("Область"); НайденныеОбласти.Колонки.Добавить("Текст"); НайденныеОбласти.Колонки.Добавить("Верх"); НайденныеОбласти.Колонки.Добавить("Лево"); НайденнаяОбласть = ТабличныйДокумент.НайтиТекст(ПодстрокаПоиска); Пока НЕ НайденнаяОбласть = Неопределено Цикл НоваяСтрока = НайденныеОбласти.Добавить(); ЗаполнитьЗначенияСвойств(НоваяСтрока, НайденнаяОбласть); НоваяСтрока.Область = НайденнаяОбласть; НайденнаяОбласть = ТабличныйДокумент.НайтиТекст(ПодстрокаПоиска, НайденнаяОбласть); КонецЦикла; Возврат НайденныеОбласти; КонецФункции Процедура ВывестиСКДВТабличныйДокумент(МакетСКД, ТабличныйДокумент, КомпоновщикНастроек = Неопределено) Если КомпоновщикНастроек = Неопределено Тогда КомпоновщикНастроек = Новый КомпоновщикНастроекКомпоновкиДанных; КомпоновщикНастроек.ЗагрузитьНастройки(МакетСКД.НастройкиПоУмолчанию); КонецЕсли; Настройки = КомпоновщикНастроек.ПолучитьНастройки(); КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных; МакетКомпоновки = КомпоновщикМакета.Выполнить(МакетСКД, Настройки); ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных; ПроцессорКомпоновки.Инициализировать(МакетКомпоновки); ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент; ПроцессорВывода.УстановитьДокумент(ТабличныйДокумент); ПроцессорВывода.Вывести(ПроцессорКомпоновки); КонецПроцедуры
В итоге получаем шапку отчёта, в которой объединены ячейки с указанными нами одинаковыми заголовками.