Зачёркнутая старая цена и яркий бейдж «−20%» — стандартный инструмент конверсии, и в 1С-Битрикс он собирается штатными средствами. Важно понимать, какие именно скидки попадают на витрину, где включается их вывод и откуда шаблон берёт цифры, чтобы не изобретать расчёт заново.
Какие скидки вообще видны на карточке
Прежде чем настраивать вывод, нужно определиться с источником цифры. В магазине на Битрикс скидки бывают двух принципиально разных типов, и на витрине товара они ведут себя по-разному.
- Скидки на товары каталога (раздел Магазин → Скидки → Скидки на товары) — уменьшают цену самого товара. Именно они формируют старую и новую цену на карточке и в списках.
- Правила работы с корзиной (промо-акции) — применяются только на этапе корзины и оформления заказа. На странице товара их результат по умолчанию не отображается.
Параметры компонента: где включается вывод
За отображение цен на витрине отвечают компоненты семейства bitrix:catalog — catalog.section, catalog.element, а внутри них шаблонный компонент catalog.item. У них есть готовые параметры, включающие и старую цену, и процент.
PRICE_CODE— какие типы цен показывать (например,BASE). Скидка считается относительно базовой цены этого типа.SHOW_OLD_PRICE = Y— выводить старую (базовую) цену рядом с итоговой, обычно зачёркнутой.SHOW_DISCOUNT_PERCENT = Y— показывать бейдж с процентом скидки.DISCOUNT_PERCENT_POSITION— положение бейджа (например,bottom-right).
Проще всего включить их через визуальный редактор: откройте настройки комплексного компонента каталога и в разделе «Цены» отметьте нужные флажки. Если правите шаблон руками, ищите вызов компонента в файле шаблона страницы и добавляйте параметры в массив arParams.
Откуда шаблон берёт цифры
В результатах компонента цена каждого товара лежит в массиве $arResult['ITEM_PRICES'] (для торговых предложений — в данных выбранного оффера). Каждый элемент содержит и исходные, и уже отформатированные значения.
| Поле | Что содержит |
|---|---|
BASE_PRICE | Базовая (старая) цена до скидки |
PRICE | Итоговая цена со скидкой |
DISCOUNT | Величина скидки в деньгах |
PERCENT | Процент скидки (число) |
PRINT_BASE_PRICE, PRINT_PRICE | Те же цены, отформатированные с валютой |
Готовые PRINT_*-поля удобны тем, что уже учитывают валюту, разряды и настройки формата — не нужно вручную вызывать CurrencyFormat().
Свой вывод старой цены и бейджа
Если штатной вёрстки не хватает — например, нужен свой дизайн бейджа — цену можно собрать в шаблоне вручную. Копируйте шаблон компонента в /local/templates/ и правьте template.php, не трогая исходники ядра.
Логика простая: показываем старую цену только когда есть реальная скидка, иначе выводим одну цену без зачёркивания.
$price = $arResult['ITEM_PRICES'][$arResult['ITEM_PRICE_SELECTED']];
if (!empty($price['PERCENT']) && $price['DISCOUNT'] > 0) {
echo '<span class="old-price">'.$price['PRINT_BASE_PRICE'].'</span>';
echo '<span class="discount-badge">−'.$price['PERCENT'].'%</span>';
}
echo '<span class="price">'.$price['PRINT_PRICE'].'</span>';Зачёркивание делается версткой — оберните старую цену в <del> или задайте text-decoration: line-through. Проверяйте условие именно по DISCOUNT > 0, чтобы бейдж «−0%» не появлялся на товарах без скидки.
Расчёт цены и процента через API
Иногда цену нужно показать там, где нет компонента каталога: в кастомном блоке «Хиты продаж», письме о снижении цены, выгрузке. Тогда оптимальную цену со скидкой считают напрямую через API.
\CCatalogProduct::GetOptimalPrice($productId, $quantity, $userGroups, ...)— возвращает и базовую цену, и итоговую с учётом всех применимых каталожных скидок, и массив сработавших скидок.- В ответе есть
RESULT_PRICEс полямиBASE_PRICE,DISCOUNT_PRICEиPERCENT— процент считать вручную не нужно.
Если процент всё же считаете сами, формула стандартная: round((BASE_PRICE − PRICE) / BASE_PRICE * 100). Округляйте до целого — дробный процент на бейдже выглядит неопрятно и путает покупателя.
Нюансы: SKU, кэш и валюты
На боевом магазине вывод скидки упирается в несколько типовых деталей.
- Торговые предложения (SKU). У товара с офферами цена и скидка меняются при выборе цвета/размера. За это отвечает JS-логика компонента и поле
JS_OFFERS— бейдж и старая цена должны пересчитываться при переключении, иначе покажут скидку от «первого» оффера. - Кэширование. Компоненты каталога кэшируются, а скидки зависят от группы пользователя. Убедитесь, что включено кэширование с учётом прав/групп, иначе гость увидит скидку, положенную другой группе.
- Минимальная цена в списке. В каталоге у товара с офферами показывается минимальная цена — процент скидки должен считаться от неё же, чтобы «старая» и «новая» цена относились к одному офферу.
- Валюта и формат. Для мультивалютности используйте
PRINT_*-поля — они уже приводят цену к нужной валюте отображения.
Итог
Чтобы на витрине появились старая цена и процент, нужно: во-первых, чтобы скидка была каталожной, а не только правилом корзины; во-вторых, включить в компоненте SHOW_OLD_PRICE и SHOW_DISCOUNT_PERCENT; в-третьих, при своей вёрстке брать данные из ITEM_PRICES или считать цену через GetOptimalPrice. Отдельно проверьте поведение на SKU, кэш по группам и формат валют.
Если нужно аккуратно вывести скидки в дизайне вашего шаблона, увязать их с обменом цен из 1С или ускорить каталог, который просел от расчёта скидок, — мы в B2Bsite настраиваем это на 1С-Битрикс под ключ и берём магазин на поддержку.
Частые вопросы
Почему настроил скидку, а старая цена не появляется?
Скорее всего, скидка сделана правилом работы с корзиной — оно применяется только в корзине и не влияет на карточку товара. Для зачёркнутой цены на витрине нужна скидка на товары каталога.
Где включить вывод процента скидки без правки кода?
В настройках комплексного компонента каталога, раздел «Цены»: отметьте флажки «Показывать старую цену» и «Показывать процент скидки». Изменения сохранятся в параметрах компонента.
Из какого поля брать процент скидки в шаблоне?
Из массива ITEM_PRICES: поле PERCENT содержит процент, DISCOUNT — сумму скидки, BASE_PRICE — старую цену, PRICE — итоговую. Есть и готовые отформатированные PRINT_-версии.
Как показать цену со скидкой вне компонента каталога?
Используйте \CCatalogProduct::GetOptimalPrice с ID товара, количеством и группами пользователя. Метод вернёт базовую и итоговую цену вместе с процентом скидки.
Как правильно зачеркнуть старую цену?
Это делается вёрсткой: оберните старую цену в тег del или задайте стиль text-decoration: line-through. Битрикс отдаёт только значения, оформление остаётся за шаблоном.
Почему на товаре с размерами показывается не тот процент?
У торговых предложений цена зависит от выбранного оффера. Бейдж и старая цена должны пересчитываться JS-логикой при переключении SKU, иначе останется скидка от первого предложения.
Гость видит чужую скидку — в чём причина?
Обычно это кэш компонента без учёта групп пользователей. Скидки каталога зависят от группы, поэтому кэширование должно учитывать права, иначе показывается цена другой группы.
Нужно ли округлять процент скидки?
Да, до целого числа по формуле round((BASE_PRICE − PRICE) / BASE_PRICE * 100). Дробный процент на бейдже выглядит неаккуратно и хуже воспринимается покупателем.
Поможем с настройкой и поддержкой 1С-Битрикс: Управление сайтом
Поможем с настройкой, доработкой и поддержкой 1С-Битрикс: Управление сайтом.