Один из частых вопросов при настройке магазина на 1С-Битрикс: какие скидки вообще можно показать покупателю на витрине, а какие «проявятся» только на этапе корзины. Ответ упирается в тип скидки: каталожные скидки видны в списке и карточке товара, а правила работы с корзиной — принципиально нет. Разберём, почему так, какими компонентами и полями цен это выводится и где чаще всего спотыкаются.
Два типа скидок — две зоны видимости
В 1С-Битрикс есть два разных механизма, и от того, каким из них создана акция, зависит, где её увидит покупатель.
- Скидки на товары (каталожные). Настраиваются в
Магазин → Настройки → Скидки → Скидки на товары. Они привязаны к самому товару и не зависят от состава корзины, поэтому их можно посчитать и показать прямо на витрине — в списке раздела и в детальной карточке. - Правила работы с корзиной. Настраиваются в
Магазин → Настройки → Скидки → Правила работы с корзиной. Они срабатывают от суммы, количества, набора товаров, купона — то есть от всей корзины целиком. Пока покупатель не собрал корзину, посчитать их нельзя, поэтому в каталоге они не отображаются.
Каталожные скидки в списке и карточке
Вывод старой цены, новой цены и процента скидки в каталоге включается параметрами компонентов bitrix:catalog.section, bitrix:catalog.element и комплексного bitrix:catalog. Ключевые параметры:
PRICE_CODE— какие типы цен выводить (например «Базовая»);SHOW_OLD_PRICE = Y— показывать зачёркнутую цену до скидки;SHOW_DISCOUNT_PERCENT = Y— показывать процент скидки;PRICE_VAT_INCLUDE— включать ли НДС в отображаемую цену.
После включения этих параметров каталожная скидка автоматически участвует в расчёте выводимой цены. Важно понимать: Битрикс показывает итоговую цену со скидкой как основную, а базовую — как «старую» зачёркнутую. Никакого дополнительного кода для типовой витрины не требуется — всё считается на уровне компонента.
Какие поля цены отдаёт компонент
Если витрина кастомная и вы верстаете шаблон компонента сами, скидочные данные лежат в $arResult['ITEMS'][n]['MIN_PRICE'] и в массиве PRICES. Основные поля:
| Поле | Что содержит |
|---|---|
BASE_PRICE | Цена до скидки (старая) |
PRICE / DISCOUNT_VALUE | Итоговая цена со скидкой |
DISCOUNT | Абсолютная величина скидки |
PERCENT | Процент скидки |
PRINT_* | Те же значения, отформатированные с валютой |
Для вывода на страницу удобнее брать готовые PRINT_BASE_PRICE, PRINT_PRICE и PRINT_DISCOUNT_VALUE — они уже содержат символ валюты и корректное форматирование. Процент округляйте на выводе, а не в расчёте, чтобы не искажать сумму.
Правила корзины видны только в корзине
Скидки от правил корзины рассчитываются в компоненте bitrix:sale.basket.basket и далее в оформлении заказа bitrix:sale.order.ajax. Именно там покупатель видит применённые акции, подарки и итоговую скидку на заказ.
- в строках корзины отображается цена позиции с учётом сработавших правил;
- в блоке итогов — суммарная скидка на заказ (поле
DISCOUNT_PRICE/PRICE_WITHOUT_DISCOUNT); - названия применённых правил можно вывести из результата расчёта скидок, если это предусмотрено шаблоном.
Почему их нельзя показать в каталоге? Потому что правило вида «скидка 10% при заказе от 5000 ₽» или «каждый третий товар в подарок» невозможно оценить, глядя на одну карточку: система не знает, что ещё положат в корзину. Любая попытка «предсказать» такую скидку на витрине будет вводить покупателя в заблуждение.
Купоны и промо-блоки на витрине
Отдельно стоит поле для купона. Ввод и проверка промокода выводятся компонентом bitrix:sale.basket.basket (встроенное поле) либо отдельным bitrix:catalog.coupon — покупатель вводит код, а результат применения снова считается на уровне корзины.
Саму же информацию об акции (баннер «-20% на бренд», плашку «Хит», условия распродажи) на витрине выводят не через скидочный механизм, а обычным контентом: инфоблоком акций, свойством товара или рекламным баннером. Это разделение важно держать в голове:
- расчёт цены — задача скидочного модуля;
- маркетинговая подача (плашки, баннеры, лендинги акций) — задача контента и вёрстки.
Поэтому «показать акцию на главной» и «применить скидку к цене» — это две разные, хоть и связанные, задачи.
Получить скидку в коде
Когда нужен нестандартный вывод (например, витрина через REST или собственный каталог), каталожную скидку по товару получают программно. В современных редакциях это делает \Bitrix\Catalog\Discount\DiscountManager и связанные методы модуля catalog; в более старом коде встречается CCatalogDiscount::GetDiscountByProduct().
- Получаете базовую цену товара по нужному типу цены.
- Запрашиваете применимые каталожные скидки для товара и группы пользователя.
- Считаете итоговую цену и процент, форматируете для вывода.
sale и рассчитываются объектом \Bitrix\Sale\Discount уже на собранном заказе или корзине.Не пытайтесь дублировать логику скидок вручную в шаблоне: при обновлении режима скидок (после конвертации на объединённые скидки) самописный расчёт разойдётся с тем, что посчитает корзина, и покупатель увидит одну цену в каталоге, а другую — при оформлении.
Ограничения и типовые ошибки
Вывод скидок в публичной части чаще всего ломается не на логике, а на инфраструктуре:
- Кэш каталога. Компоненты каталога кэшируются; при персональных скидках по группам обязательно учитывайте группу в ключе кэша, иначе гость увидит цену клиента.
- Композитный кэш. При композитном сайте статичная часть страницы может показывать устаревшую цену — динамику цен выносите в отложенную загрузку.
- Расхождение витрина/корзина. Если в каталоге показать «предполагаемую» скидку корзины, итог в корзине не совпадёт — классический источник претензий.
- Округление. Разное округление на витрине и в заказе даёт копеечные расхождения; используйте единый формат вывода.
- НДС и валюта. Проверьте согласованность
PRICE_VAT_INCLUDEи валюты между каталогом и корзиной.
Итог
В публичной части 1С-Битрикс без оговорок выводятся каталожные скидки — старая цена, новая цена и процент в списке и карточке товара, за это отвечают параметры SHOW_OLD_PRICE и SHOW_DISCOUNT_PERCENT компонентов каталога. Правила работы с корзиной покупатель видит только в корзине и при оформлении заказа, потому что они зависят от всего состава заказа. Купоны применяются в корзине, а маркетинговая подача акций — это отдельный контент, а не скидочный расчёт.
Если нужно аккуратно вывести скидки на витрине, свести цену каталога и корзины к одному значению и не потерять на этом производительность — мы в B2Bsite настраиваем витрину, кэширование и, при необходимости, кастомный расчёт цен под ваш магазин.
Частые вопросы
Какие скидки видно в каталоге, а какие только в корзине?
В каталоге (список и карточка) видны каталожные скидки на товары, потому что они зависят только от самого товара. Правила работы с корзиной зависят от состава заказа и отображаются лишь в корзине и при оформлении.
Как включить показ старой цены и процента скидки?
В параметрах компонентов каталога (catalog.section, catalog.element, catalog) установите SHOW_OLD_PRICE = Y и SHOW_DISCOUNT_PERCENT = Y. После этого зачёркнутая цена и процент считаются автоматически.
Почему скидку от суммы заказа нельзя показать в карточке товара?
Потому что такая скидка зависит от всей корзины, а не от одного товара. Пока покупатель не собрал заказ, посчитать её корректно нельзя, поэтому Битрикс показывает её только в корзине.
В каком поле лежит цена со скидкой в результате компонента?
Итоговая цена находится в массиве PRICES и полях MIN_PRICE элемента: базовая цена в BASE_PRICE, цена со скидкой в PRICE, процент в PERCENT. Для вывода удобнее готовые поля PRINT_*.
Где покупатель видит применённые правила корзины?
В компоненте sale.basket.basket и в оформлении заказа sale.order.ajax: цена позиций с учётом акций и суммарная скидка на заказ в блоке итогов.
Как вывести цену со скидкой в собственном шаблоне или через API?
Каталожную скидку получают программно через DiscountManager модуля catalog (в старом коде — CCatalogDiscount::GetDiscountByProduct). Правила корзины считаются объектом Bitrix\Sale\Discount уже на собранной корзине.
Почему цена в каталоге не совпадает с ценой в корзине?
Чаще всего из-за скидок корзины, которых нет в каталоге, устаревшего кэша или разного округления. Проверьте кэширование по группам, композит и единый формат вывода цены.
Можно ли показать баннер акции на витрине?
Да, но это отдельная задача: маркетинговая подача (плашки, баннеры, лендинги) выводится контентом или инфоблоком акций, а не скидочным модулем, который отвечает только за расчёт цены.
Поможем с настройкой и поддержкой 1С-Битрикс: Управление сайтом
Поможем с настройкой, доработкой и поддержкой 1С-Битрикс: Управление сайтом.