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