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