Как настроить условное оформление для разных уровней группировок в СКД?

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

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

Разбор проблемы: почему верхние группировки не «красятся»?

Представим ситуацию: у нас есть отчет по заказам, где внутри каждого заказа есть перечень работ (сборка, покупные, забор). Мы хотим, чтобы строка заказа становилась зеленой только тогда, когда все вложенные работы выполнены. Автор темы столкнулся с тем, что нижние уровни отрабатывают корректно, а верхний — нет.

Основная причина кроется в том, как 1С рассчитывает значения ресурсов для итогов. Если в качестве условия оформления используется поле-ресурс, то для верхней группировки СКД вычисляет это значение по указанной в настройках формуле (например, Минимум, Максимум или Сумма). Если формула для итога не соответствует логике условия оформления, «раскраска» не сработает. Проанализируем ситуацию на примере: если вы используете функцию Минимум для числового флага, и хотя бы одна строка внизу имеет значение «0» (Ложь), то и вся верхняя группа получит «0», даже если остальные 99 строк — «1» (Истина).

Решение 1: Использование агрегатных функций «Каждый» и «Любой»

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

Для реализации этого метода перейдем на закладку «Ресурсы» и в поле выражения для нашего индикатора пропишем логику проверки. Рассмотрим пример кода в выражении ресурса:

Каждый(СтатусВыполнения = Истина)

Теперь в настройках условного оформления достаточно указать условие: ИмяПоля Равно Истина. СКД сама проверит выполнение условия для каждого уровня иерархии.

Решение 2: Разные формулы ресурсов для разных уровней

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

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

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

Решение 3: Сложные выражения с ВычислитьВыражениеСГруппировкойМассив

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

Проанализируем пример выражения для вычисляемого поля или ресурса:


// Проверяем, есть ли среди дочерних группировок "Заказ" хотя бы одна не выполненная (Ложь)
ВЫБОР 
    КОГДА Найти(
        ВычислитьВыражениеСГруппировкойМассив("Строка(Выполнено)", "Заказ"), 
        "Ложь"
    ) > 0 ТОГДА Ложь 
    ИНАЧЕ Истина 
КОНЕЦ

Такой подход гарантирует, что родительская строка получит статус «Истина» (и соответствующий цвет) только при отсутствии отрицательных результатов в массиве дочерних элементов.

Решение 4: Настройка области использования условного оформления

Даже если формулы рассчитаны верно, оформление может не отображаться из-за ограничений в настройках самого СКД. Выясним, на что стоит обратить внимание в окне настройки «Условное оформление»:

Важность обработки NULL

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

Совет: Всегда оборачивайте поля в функцию ЕСТЬNULL(Поле, Ложь) еще на уровне запроса или используйте аналогичную проверку в вычисляемых полях. Это избавит вас от «мистики», когда визуально данные кажутся пустыми/ложными, но оформление к ним не применяется.

Резюме для практической работы

Чтобы ваша иерархия в СКД всегда была «раскрашена» корректно, следуйте алгоритму:

  1. Проверьте, какое значение принимает ресурс на уровне родительской группировки. Выведите это поле в колонку рядом для отладки.
  2. Используйте агрегаты Каждый() или Любой() в выражениях ресурсов.
  3. Убедитесь, что в настройках условного оформления включена область «Общие итоги».
  4. Если иерархия сложная, создайте отдельное вычисляемое поле-флаг (маркер), пропишите его логику в ресурсах, и настраивайте оформление именно по этому флагу.

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

← На главную