Почему не работает условное оформление в СКД без вывода поля и как это исправить?

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

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

Однако при настройке разработчик сталкивается с проблемой: условное оформление не применяется. Но стоит только добавить это служебное поле в список выбранных полей, как оформление сразу же начинает работать корректно. Проанализируем, почему платформа 1С ведет себя подобным образом, и рассмотрим правильные и надежные способы решения этой задачи.

Причины поведения механизма компоновки данных

Выясним причину, почему СКД игнорирует условие оформления, если колонка не выведена в отчет. Дело заключается в оптимизации запросов и контексте расчета группировок:

  1. Оптимизация выборки полей. Схема компоновки данных формирует итоговый запрос к базе данных динамически. Если поле не задействовано в группировках, ресурсах или выбранных полях текущего уровня, платформа может исключить его расчет для сводных строк.
  2. Контекст уровней группировки. Механизм компоновки проверяет условия оформления строго в контексте текущего уровня итогов. Если отчет содержит группировку (например, по номенклатуре или контрагенту), а поле условия не включено в состав полей этой группировки и не объявлено ресурсом, на уровне записей группировки оно имеет неопределенное значение (Null или Неопределено). В результате условие не выполняется, и оформление всей строки не накладывается.

Именно поэтому у некоторых разработчиков оформление работает даже без вывода поля — такое происходит, когда оформляются строки структуры «Детальные записи» (где доступны все поля выборки конкретной записи) либо если поле уже объявлено ресурсом.

Рассмотрим подробнее штатные и альтернативные способы решения проблемы без необходимости показывать пользователю лишние колонки.

Способ 1. Объявление поля ресурсом схемы (рекомендуемый способ)

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

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

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

Теперь платформа рассчитает значение на всех уровнях иерархии группировок, условие выполнится, а лишняя колонка в отчете не появится.

Способ 2. Добавление поля в поля группировки

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

Рассмотрим по шагам выполнение этой настройки:

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

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

Способ 3. Перенос условного оформления на уровень детальных записей

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

Если раскрашивать требуется именно конкретные строки детальных записей, разберем порядок действий:

  1. Перейдем в структуру настроек отчета.
  2. Выделим конкретную ветку «Детальные записи».
  3. Откроем вкладку «Условное оформление» именно для этой группировки, а не для всего отчета.
  4. Зададим условие и параметры раскраски строки. В детальных записях значение поля доступно напрямую из выборки запроса, даже если оно не выведено в видимые поля.

Способ 4. Обходной путь через скрытие ширины колонки

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

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

Несмотря на то что данный способ позволяет быстро решить проблему, рекомендуется отдавать предпочтение штатным механизмам — назначению поля ресурсом или добавлению его в поля группировки, так как они не создают паразитных микроколонок в табличном документе.

← На главную