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