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