В процессе работы с отчетами, построенными на Системе Компоновки Данных (СКД), часто возникает задача выделить определенные области или строки для улучшения читаемости. Одной из таких типовых задач является применение условного оформления (УО) только к горизонтальным итоговым строкам, игнорируя при этом вертикальные итоги, общие итоги или детальные записи. Давайте вместе разберем, как эффективно решить эту проблему, используя возможности СКД.
Наш читатель столкнулся с ситуацией, когда отчет СКД содержит как горизонтальные, так и вертикальные группировки. Требовалось применить условное оформление (например, изменить цвет фона) только к строкам горизонтальных итогов, оставляя вертикальные итоги и детальные записи без изменений. Это стандартная проблема, поскольку настройки "В общем итоге" в СКД часто распространяются только на вертикальные общие итоги, а точечное применение оформления требует более тонкой настройки.
Мы рассмотрим два основных подхода к решению этой задачи: простое решение, основанное на настройке расчета ресурса, и более продвинутое решение, использующее вычисляемое поле с функцией Группировка() для точного определения типа строки.
Этот метод является наиболее прямым путем к решению задачи, как было предложено и подтверждено в ходе обсуждения на форуме. Суть его заключается в создании специального вычисляемого поля, которое будет выступать в роли индикатора горизонтальных итогов, и тонкой настройке его расчета.
Разберем процесс по шагам:
Для начала нам потребуется создать новое вычисляемое поле в схеме компоновки данных. Это поле будет служить простым флагом, сигнализирующим о том, что текущая строка является горизонтальным итогом.
ЭтоГоризонтальныйИтог.Истина. Это означает, что при вычислении это поле всегда будет возвращать логическое значение "Истина".
Истина
Почему Истина? Потому что мы не хотим, чтобы само поле вычисляло сложную логику. Вся логика будет в его агрегации.
После создания вычисляемого поля его необходимо добавить в список ресурсов отчета. Именно здесь кроется ключевой момент, позволяющий СКД правильно определить, где именно нужно "включить" наш индикатор.
ЭтоГоризонтальныйИтог из списка "Доступные поля" в список "Ресурсы".ЭтоГоризонтальныйИтог:
Максимум (или Минимум, Среднее). Поскольку наше вычисляемое поле всегда возвращает Истина, любая из этих функций также вернет Истина, если поле будет вычислено.Период, выберите только Период. Не включайте сюда поля вертикальных группировок, детальных записей или общие итоги.Представьте, что у вас есть отчет со строками по Контрагент и колонками по Период. Если вы хотите выделить горизонтальные итоги (т.е. "Итог по Периоду" для каждого Контрагента), то в поле "Рассчитывать по" для ресурса ЭтоГоризонтальныйИтог вам следует указать только Период. Таким образом, СКД будет вычислять этот ресурс только в тех строках, где происходит агрегация по Периоду, игнорируя при этом агрегацию по Контрагенту.
Теперь, когда у нас есть индикатор, мы можем использовать его в настройках условного оформления.
Истина:
ЭтоГоризонтальныйИтог = Истина
Таким образом, условное оформление будет применяться только к тем строкам, где ресурс ЭтоГоризонтальныйИтог принимает значение Истина, что, благодаря настройке "Рассчитывать по", будет происходить исключительно в строках горизонтальных итогов.
В некоторых случаях, особенно при сложной структуре группировок или когда требуется максимально точное разделение между детальными записями, горизонтальными, вертикальными и общими итогами, может потребоваться более гибкий подход. Мы можем создать вычисляемое поле, которое будет явно определять тип текущей строки, используя функцию Группировка().
Разберем этот метод по шагам:
Прежде чем создавать вычисляемое поле, давайте определимся с именами полей, которые участвуют в наших вертикальных и горизонтальных группировках. Допустим, у нас есть:
Контрагент, Договор.Период, ВидНоменклатуры.Функция Группировка(<ИмяПоля>) возвращает значение поля группировки для текущей строки или NULL, если текущая строка является итоговой для этой группировки.
Мы создадим вычисляемое поле, которое будет возвращать строковое значение, описывающее тип текущей строки (например, "ДетальнаяЗапись", "ГоризонтальныйИтог", "ВертикальныйИтог", "ОбщийИтог").
ТипСтроки.ВЫБОР КОГДА ... ТОГДА ... ИНАЧЕ ... КОНЕЦ. Ниже приведен пример выражения для ситуации с одной вертикальной группировкой (Контрагент) и одной горизонтальной группировкой (Период):
ВЫБОР
// Общий итог по всему отчету (и по строкам, и по колонкам)
КОГДА Группировка("Контрагент") ЕСТЬ NULL
И Группировка("Период") ЕСТЬ NULL
ТОГДА "ОбщийИтог"
// Горизонтальный итог: итог по Периоду для конкретного Контрагента
// (строка, суммирующая данные по колонкам, но для определенной вертикальной группировки)
КОГДА НЕ Группировка("Контрагент") ЕСТЬ NULL
И Группировка("Период") ЕСТЬ NULL
ТОГДА "ГоризонтальныйИтог"
// Вертикальный итог: итог по Контрагенту для конкретного Периода
// (столбец, суммирующий данные по строкам, но для определенной горизонтальной группировки)
// Это условие будет истинно для ячеек в столбцах итогов
КОГДА Группировка("Контрагент") ЕСТЬ NULL
И НЕ Группировка("Период") ЕСТЬ NULL
ТОГДА "ВертикальныйИтог"
// Детальная запись: ни одна группировка не является итоговой
ИНАЧЕ "ДетальнаяЗапись"
КОНЕЦ
Если у вас несколько вертикальных или горизонтальных группировок, вам потребуется расширить условия, проверяя NULL для каждого поля. Например, для нескольких полей: (Группировка("Поле1") ЕСТЬ NULL И Группировка("Поле2") ЕСТЬ NULL).
После создания вычисляемого поля ТипСтроки, мы можем использовать его для настройки условного оформления:
ТипСтроки должно быть равно "ГоризонтальныйИтог":
ТипСтроки = "ГоризонтальныйИтог"
Этот подход позволяет нам не только выделить горизонтальные итоги, но и при необходимости управлять оформлением вертикальных и общих итогов, а также детальных записей, что дает полную гибкость.
Распространенной проблемой при применении условного оформления является его нежелательное распространение на заголовки ресурсов в шапке отчета. Чтобы избежать этого, рассмотрим несколько методов:
Это самый простой способ предотвратить оформление заголовков.
Это действие исключит применение текущего правила оформления к заголовкам полей.
Если требуется не просто не оформлять, а полностью скрыть заголовок ресурса (например, сделать его невидимым, чтобы не занимал место), можно создать отдельный элемент условного оформления:
Этот метод эффективно "замаскирует" заголовок.
Для более продвинутого и тонкого контроля над выводом заголовков, включая их полное удаление без оставления пустой ячейки, можно использовать макеты группировок. Этот метод требует глубокого понимания работы с макетами СКД.
Макеты дают максимальную гибкость, но и требуют больших усилий для настройки.
Система Компоновки Данных предоставляет широчайшие возможности для условного оформления, позволяя изменять цвет текста, фона, шрифт и другие свойства отчета. Для эффективной работы с УО следует помнить:
Используя представленные подходы, вы сможете добиться точного и контролируемого условного оформления горизонтальных итогов в ваших отчетах СКД, значительно повысив их информативность и удобство использования.