Как обойти слияние группировок полей в СКД при отсутствии заголовков

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При работе с Системой компоновки данных (СКД) разработчики часто сталкиваются с интеллектуальным механизмом оптимизации макета. Этот механизм стремится сделать отчет более компактным, объединяя соседние группы полей, если они имеют одинаковую структуру и вид расположения. Однако в ряде случаев, когда нам требуется четкое визуальное разделение данных без вывода лишних текстовых заголовков, эта особенность становится препятствием. Разберем детально, почему это происходит и какими способами можно заставить СКД выводить группы полей независимо.

Суть проблемы: почему СКД объединяет группы

Проанализируем ситуацию: когда мы создаем несколько групп в выбранных полях (например, для вертикального вывода пар ресурсов), и при этом оставляем поле Заголовок пустым, СКД воспринимает эти группы как идентичные по своей структуре. В процессе генерации макета компоновщик видит две или более последовательные группы с типом Вертикально или Горизонтально, у которых нет текста заголовка, и «схлопывает» их в одну общую область. Это логично с точки зрения экономии места, но нарушает логику представления данных, если группы должны стоять особняком.

Метод 1: Использование невидимых заголовков (пробелов)

Это самый простой и эффективный способ, который часто называют «хаком». Суть заключается в том, чтобы обмануть алгоритм сравнения групп, сделав их заголовки уникальными, но при этом оставить их невидимыми для пользователя.

  1. Перейдем в настройки выбранных полей или в структуру отчета, где созданы группы.
  2. Для первой группы в поле Заголовок установим один пробел.
  3. Для второй группы установим два пробела.
  4. Для третьей — три, и так далее.

С точки зрения движка отрисовки СКД, заголовки " " и " " — это разные строки, поэтому слияние не произойдет. Поскольку пробелы не имеют визуального представления, в результирующем табличном документе мы получим пустую строку заголовка. Чтобы минимизировать высоту этой «пустой» строки, можно в условном оформлении для этих групп установить минимальную высоту ячейки или вовсе скрыть текст заголовка через параметры оформления, сохранив уникальность самого значения.

Важный нюанс: Вместо обычного пробела (код 32) рекомендуется использовать «неразрывный пробел» (комбинация клавиш Alt+255 или код 160). Обычные пробелы в некоторых версиях платформы могут «обрезаться» (trim) функцией обработки строк перед сравнением объектов макета, в то время как неразрывный пробел считается полноценным значащим символом.

Метод 2: Манипуляция иерархией и типами расположения

Рассмотрим более сложный, но архитектурно правильный способ без использования «грязных» символов в заголовках. Мы можем принудительно разорвать логику слияния, изменяя свойства расположения полей. Выясним, как это работает на практике.

Если нам нужно вывести четыре независимые группы вертикально, мы можем «обернуть» каждую из них в дополнительную родительскую группу. Для каждой такой родительской группы установим разные значения свойства Расположение:

Даже если вложенные поля внутри этих групп идентичны, разные типы расположения родительских контейнеров не позволят системе объединить их в одну область макета. Это позволяет добиться нужного визуального эффекта без добавления лишних символов.

Метод 3: Использование детальных записей

Интересной особенностью СКД является разница в поведении при формировании группировок и детальных записей. Заметим, что если перенести настройки полей и группировок непосредственно в ветку Детальные записи, механизм объединения зачастую отрабатывает иначе (менее агрессивно). Это не всегда применимо в сложных иерархических отчетах, но для простых плоских списков может стать быстрым решением проблемы.

Метод 4: Управление через Условное оформление

Проанализируем ситуацию, когда нам все же приходится задать уникальные заголовки (например, «Группа 1», «Группа 2»), чтобы избежать слияния, но мы категорически не хотим видеть их в отчете. В этом случае на помощь приходит Условное оформление.

  1. Задаем группам любые уникальные имена в поле Заголовок.
  2. В настройках отчета переходим на вкладку Условное оформление.
  3. Добавляем новое правило:
    • В области оформления выбираем только Заголовок конкретных полей или групп.
    • В параметрах устанавливаем Текст — пустая строка, либо устанавливаем Цвет текста равным цвету фона (обычно белый).
    • Также можно попробовать установить параметр Видимость в значение Ложь, но будьте осторожны: это может привести к скрытию всей колонки или строки целиком, в зависимости от контекста.

Метод 5: Использование собственных макетов заголовков

Если стандартные механизмы не дают идеального результата, мы можем прибегнуть к использованию вкладки Макеты в схеме компоновки данных. Это наиболее трудозатратный, но и самый гибкий метод.

Разберем по шагам создание индивидуального макета заголовка:

  1. В конструкторе СКД перейдем на закладку Макеты.
  2. Нажмем кнопку Добавить макет заголовка группировки.
  3. В появившемся окне укажем имя группировки или выберем конкретные поля, для которых создается макет.
  4. В табличном документе нарисуем шапку именно в том виде, который нам нужен, не полагаясь на автоматическую генерацию.

Поскольку макет описывает конкретные ячейки ТабличногоДокумента, СКД не будет пытаться их оптимизировать или объединять с соседними областями по своему усмотрению. Вы полностью контролируете границы, объединение ячеек и их содержимое.

Метод 6: Добавление скрытого системного поля

Еще один профессиональный прием заключается в том, чтобы сделать структуру групп формально разной. Для этого в одну из групп (которую нужно отделить) добавим системное поле, например, НомерПоПорядку.

Чтобы оно не отображалось и не портило внешний вид:

Наличие дополнительного поля в структуре группы сделает ее уникальной для алгоритма оптимизации СКД, и слияние будет предотвращено.

Программная корректировка макета

В самых сложных случаях, когда отчет формируется программно, мы можем вмешаться в процесс после генерации макета компоновки, но до вывода в результирующий документ. Рассмотрим пример кода, который иллюстрирует этот подход:


// Сначала создаем компоновщик макета
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, КомпоновщикНастроек.ПолучитьНастройки(), ДанныеРасшифровки);

// Теперь мы можем проанализировать области макета
Для Каждого Область Из МакетКомпоновки.Области Цикл
    // Здесь можно найти нужные ячейки по именам или содержимому
    // и принудительно очистить текст или изменить параметры объединения
КонецЦикла;

Этот метод позволяет добиться результата в тех ситуациях, когда визуальные настройки в конфигураторе оказываются бессильны. Однако помните, что программная корректировка усложняет поддержку отчета другими разработчиками, поэтому к ней стоит прибегать в последнюю очередь.

Резюме

Мы рассмотрели широкий спектр инструментов для управления макетом СКД. Наиболее практичным для повседневных задач остается метод использования невидимых символов в заголовках в сочетании с различными типами расположения полей. Это позволяет сохранить гибкость настроек СКД и получить чистый, профессионально выглядящий отчет без лишних визуальных элементов.

← На главную