Как в СКД выделить цветом минимальное значение в группировке?

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

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

Способ 1. Использование функций языка выражений СКД в условном оформлении

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

Для того чтобы выделить цветом минимальную цену в рамках группировки по поставщикам, проанализируем следующие шаги:

  1. Откроем вкладку Настройки в схеме компоновки данных.
  2. Перейдем на закладку Условное оформление.
  3. Добавим новый элемент оформления. В области Оформление выберем нужный нам цвет фона или шрифта.
  4. В списке Оформляемые поля выберем поле Цена.
  5. Самый важный этап — настройка Условия. Вместо стандартного сравнения полей выберем вид сравнения Произвольное выражение.

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

Цена = ВычислитьВыражение("Минимум(Цена)", "Поставщик")

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

Способ 2. Применение функции ВычислитьВыражениеСГруппировкойМассив

Бывают ситуации, когда в расчет минимального значения не должны попадать нулевые цены или определенные позиции. Рассмотрим ситуацию, когда нам нужно найти минимум только среди положительных значений. В этом случае нам поможет функция ВычислитьВыражениеСГруппировкойМассив.

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


Минимум(ВычислитьВыражениеСГруппировкойМассив("Выбор Когда Цена > 0 Тогда Цена Иначе NULL Конец", "Поставщик"))

В данном случае СКД сначала соберет все цены по поставщику в массив, исключив нулевые значения (заменив их на NULL), а затем функция Минимум выберет наименьшее из оставшихся чисел. Это позволяет избежать ложных срабатываний на пустых значениях.

Способ 3. Подготовка данных на уровне запроса

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

Нам необходимо создать временную таблицу с минимальными ценами и соединить её с основной таблицей. Проанализируем пример кода запроса:


ВЫБРАТЬ
    Продажи.Поставщик КАК Поставщик,
    МИНИМУМ(Продажи.Цена) КАК МинимальнаяЦенаГруппировки
ПОМЕСТИТЬ ВТ_МинимальныеЦены
ИЗ
    РегистрСведений.ЦеныНоменклатуры КАК Продажи
СГРУППИРОВАТЬ ПО
    Продажи.Поставщик
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    Цены.Поставщик,
    Цены.Номенклатура,
    Цены.Цена,
    ВТ_МинимальныеЦены.МинимальнаяЦенаГруппировки
ИЗ
    РегистрСведений.ЦеныНоменклатуры КАК Цены
    ЛЕВОЕ СОЕДИНЕНИЕ ВТ_МинимальныеЦены КАК ВТ_МинимальныеЦены
    ПО Цены.Поставщик = ВТ_МинимальныеЦены.Поставщик

После такой подготовки в настройках условного оформления СКД нам останется лишь сравнить два поля: Цена = МинимальнаяЦенаГруппировки. Это решение менее универсальное, так как при изменении группировок пользователем в режиме 1С:Предприятие расчет может стать неверным, но для фиксированной структуры отчета оно работает максимально быстро.

Способ 4. Настройка ресурсов для различных уровней группировок

Выясним, как использовать механизм ресурсов для решения нашей задачи. Мы можем создать ресурс МинимальнаяЦена и в колонке Рассчитывать по... указать конкретные уровни иерархии.

Рассмотрим по шагам:

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

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

Нюансы оформления для иерархических справочников

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

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

Что делать, если минимальных значений несколько?

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

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

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

← На главную