При разработке отчетов на системе компоновки данных (СКД) часто возникает ситуация, когда структура отчета требует вывода значений ресурсов, но само название ресурса (например, Цена или Количество) в шапке таблицы является избыточным или портит внешний вид — для этого пригодится консоль СКД и набор инструментов разработчика. Стандартные средства СКД не всегда позволяют просто «отключить» заголовок конкретного ресурса, не затрагивая его данные. В этой статье мы разберем несколько эффективных способов решения этой задачи: от манипуляций с настройками до программного перехвата процесса вывода.
Если структура отчета сложная и изменять ее в схеме нежелательно, мы можем прибегнуть к постобработке сформированного ТабличногоДокумента. Суть метода заключается в поиске ячейки с заголовком и управлении ее видимостью или размерами.
Рассмотрим вариант с использованием метода НайтиТекст. Проанализируем пример кода, который позволяет скрыть строку, содержащую заголовок:
// В модуле объекта отчета или в форме при выводе результата
Область = ДокументРезультат.НайтиТекст("Цена");
Если Область <> Неопределено Тогда
// Устанавливаем видимость строки в Ложь
ДокументРезультат.Область(Область.Верх, , Область.Низ, ).Видимость = Ложь;
КонецЕсли;
Однако стоит учитывать, что простое скрытие строки может привести к визуальному дефекту — так называемой «ступеньке» в оформлении, когда фон соседних ячеек не совпадает. Чтобы этого избежать, разберем более продвинутый алгоритм. Мы можем не просто скрывать строку, а объединять ячейки заголовков, которые находятся выше, с освободившимся пространством. Для решения этой задачи отлично подойдет методика объединения ячеек заголовков группировок по вертикали и горизонтали.
// Пример объединения ячеек для устранения пустот
ОбластьЗаголовка = ДокументРезультат.НайтиТекст("Цена");
Если ОбластьЗаголовка <> Неопределено Тогда
Верх = ОбластьЗаголовка.Верх;
Лево = ОбластьЗаголовка.Лево;
// Объединяем ячейку выше с текущей, чтобы «поглотить» заголовок ресурса
ОбластьВыше = ДокументРезультат.Область(Верх - 1, Лево, Верх, Лево);
ОбластьВыше.Объединить();
ОбластьЗаголовка.Текст = ""; // Очищаем текст, если объединение не перекрыло его
КонецЕсли;
Выясним, как можно решить задачу без написания кода, используя только настройки СКД. Условное оформление позволяет гибко управлять визуализацией полей. Для того чтобы убрать только текст, сохранив структуру, выполним следующие шаги:
Текст как пустую строку (или один пробел).Цена.Важный нюанс: Чтобы избежать «пустой дырки» в шапке, которая сохраняет цвет фона или границы, в оформлении дополнительно установим МинимальнаяВысота в значение 0.1 и выберем тип линии границ Нет линии. Это позволит ячейке максимально «схлопнуться».
Проанализируем ситуацию, когда стандартные методы дают визуальные артефакты. В СКД существует мощный инструмент — Макеты — есть готовый инструмент редактирования макетов и печатных форм. Мы можем переопределить макет заголовка конкретного поля.
Разберем по шагам:
Цена.Этот способ хорош тем, что он не зависит от программного кода и корректно отрабатывает при фоновом выполнении отчетов на сервере. При необходимости можно использовать готовый пример работы с собственными макетами в СКД.
Посмотрим на структуру выбранных полей. Иногда заголовок ресурса дублируется из-за того, что он находится внутри авто-группировки. Попробуем следующий прием:
Цена.Вместе.В некоторых конфигурациях структуры это заставляет СКД объединять заголовки ресурсов с вышестоящими группировками, фактически убирая лишнюю строку с названием поля.
Если мы хотим полностью контролировать процесс и исключить появление ячеек еще на этапе формирования, следует использовать программный вывод отчета через ПроцессорКомпоновкиДанных и ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент.
В цикле вывода элементов мы можем анализировать тип элемента. Если это Заголовок, мы можем программно изменить его параметры до того, как он попадет в итоговый документ:
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
ПроцессорВывода.НачатьВывод();
Пока Истина Цикл
ЭлементРезультата = ПроцессорКомпоновки.Следующий();
Если ЭлементРезультата = Неопределено Тогда
Прервать;
КонецЕсли;
// Здесь можно перехватить вывод заголовка
Если ЭлементРезультата.ЗначенияПараметров.Количество() > 0 Тогда
// Логика анализа и модификации элемента
КонецЕсли;
ПроцессорВывода.ВывестиЭлемент(ЭлементРезультата);
КонецЦикла;
ПроцессорВывода.ЗакончитьВывод();
Выясним причину возникновения визуальных дефектов при скрытии заголовков. Когда мы устанавливаем Видимость = Ложь для части ячеек, 1С может продолжать отрисовывать границы соседних областей. Чтобы шапка выглядела монолитной, рекомендуется:
Объединить() для ячейки, находящейся над скрываемым ресурсом.ФиксацияСверху — часто лишние линии появляются именно на границе фиксации.Таким образом, выбор метода зависит от ваших ограничений: если нельзя менять схему — используйте программную обработку ТабличногоДокумента; если важна стабильность и производительность — используйте макеты оформления в СКД.