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