Как настроить условное оформление в СКД по скрытому полю

Программист 1С v8.3 (Управляемые формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

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

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

Причина проблемы: Оптимизатор и «вычислимость» полей

Главная причина кроется в механизме оптимизации. СКД стремится минимизировать объем данных, запрашиваемых из СУБД. Если поле присутствует в наборе данных, но не добавлено в список Выбранные поля и не является ключом группировки (на это указывает и структура метаданных), система считает его лишним.

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

  1. Оно выводится в Детальных записях (самый нижний уровень отчета).
  2. Оно является полем группировки, по которой в данный момент выводится строка.
  3. Оно является Ресурсом. Ресурсы вычисляются всегда, независимо от состава группировок, так как они агрегируют данные по всей выборке.

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

Способ 1. Использование ресурсов (самый надежный метод)

Наиболее элегантное решение, позволяющее избежать лишних манипуляций с видимостью колонок — объявление поля ресурсом. Рассмотрим этот алгоритм:

  1. Перейдем на закладку Ресурсы в схеме компоновки данных.
  2. Добавим наше поле (по которому настраивается оформление) в список ресурсов.
  3. В выражении укажем подходящую агрегатную функцию. Если поле содержит уникальное значение для строки или нам нужно проверить наличие хотя бы одного соответствия, можно использовать Максимум(ИмяПоля) или Минимум(ИмяПоля).
  4. На закладке Наборы данных для этого поля в колонке Роль можно дополнительно установить флаг Обязательное, хотя для ресурсов это часто избыточно.

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

Способ 2. Управление свойством «Видимость» в выбранных полях

Если вы не хотите превращать поле в ресурс (например, это строковое поле с длинным текстом), можно использовать механизм управления видимостью. Проанализируем, как это сделать правильно:

  1. Перейдем в настройки отчета (вкладка Настройки в СКД или Пользовательская СКД в режиме 1С:Предприятие).
  2. В списке Выбранные поля добавим наше служебное поле.
  3. Теперь самое важное: выделим это поле, нажмем правую кнопку мыши и выберем пункт Установить свойства элемента пользовательских настроек (или найдем флаг Видимость в свойствах выбранного поля в нижней части окна).
  4. Снимем галочку Видимость.

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

Способ 3. Иерархия группировок и скрытые поля

Иногда полезно использовать структуру самих группировок. Выясним, как применить метод «скрытой группировки»:

  1. Создадим в структуре отчета новую группировку по полю, которое участвует в условии.
  2. В настройках этой группировки снимем флаг отображения (самой группировки), но оставим выбранные поля внутри.
  3. Однако, как показывает практика, более стабильный результат дает обратный подход: добавить поле в существующую группировку, но в настройках оформления самой группировки или поля внутри нее задать МинимальнаяШирина = 0 и МаксимальнаяШирина = 0.

Важно помнить: если оформление настраивается для всей строки, то в области использования условного оформления должно быть указано Везде или выбраны конкретные поля, которые точно выводятся в отчет.

Способ 4. Особенности работы с Перечислениями и Предопределенными данными

Проанализируем ситуацию, когда оформление не срабатывает по полям типа Перечисление. Часто это связано с тем, что оптимизатор или контекст выполнения (серверный/клиентский) некорректно сопоставляет ссылки. Рассмотрим обходной путь:

В тексте запроса (при отладке поможет bm Консоль запросов — для этого есть универсальная консоль запросов и компоновки данных) можно получить числовой индекс значения перечисления или его строковый код:


ВЫБРАТЬ
    Заказ.Ссылка,
    ВЫБОР
        КОГДА Заказ.Статус = ЗНАЧЕНИЕ(Перечисление.СтатусыЗаказов.Согласован) ТОГДА 1
        ИНАЧЕ 0
    КОНЕЦ КАК СтатусЧислом
ИЗ
    Документ.ЗаказКлиента КАК Заказ

Затем в условном оформлении используйте поле СтатусЧислом. Сравнение примитивных типов (число, строка, булево) в СКД работает быстрее и стабильнее, чем сравнение ссылочных типов, особенно в сложных иерархических отчетах.

Дополнительные рекомендации

Если ни один из методов не помогает, проверьте следующие моменты:

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

← На главную