Настраиваем расчёт скидок только там, где они реально отображаются, а не на каждом товаре
Хочу себе такие же кнопкиЧто вы получите сразу после чтения
- Понимание, почему «общий» расчёт скидок замедляет работу сайта и приводит к неверным ценам.
- Чёткую схему, как ограничить вычисления только теми товарами, где скидка действительно показывается покупателю.
- Пошаговый инструктаж по настройке в админке Битрикс 24/1С‑Ритейл, а также через API.
1. Почему важно считать скидку лишь там, где она видна
| Проблема | Последствия | Как решается |
|---|---|---|
| Глобальный расчёт (на каждый SKU) | Нагрузка на базу, увеличение времени генерации страницы, «залипание» в кеш‑слое. | Перенести расчёт в точки применения – только в каталоге и/или в корзине. |
| Скидка, не отображаемая (например, только для определённого пользовательского сегмента) | Пользователь видит обычную цену, а в бэкенде уже списана скидка → разница в отчётах. | Установить условие отображения в правиле скидки. |
| Дублирование правил (одна и та же скидка в нескольких модулях) | Конфликт приоритетов, непредсказуемый результат. | Сконсолидировать правила в одном модуле – «Скидки в каталоге» или «Скидки в корзине». |
2. Основные места, где Битрикс может применять скидку
- Каталог (Catalog) – цена, которую пользователь видит в карточке товара и в списках.
- Корзина (Basket) – окончательная цена перед оформлением заказа.
- Заказ (Order) – итоговая цена в документе, часто используется для отчётов и интеграций.
Каждая из этих точек имеет свой триггер. Если правило скидки привязано к “все места”, Битрикс будет выполнять запросы к базе три раза для одного SKU, даже если пользователь никогда не увидит цену в каталоге (например, скидка только для партнёров в корзине).
3. Как ограничить расчёт только нужными точками
3.1. Создаём правило скидки в админке
- Маркетинг → Скидки и наценки → Добавить правило.
- В поле «Тип правила» выбираем «Скидка».
- В секции «Точки применения» ставим галочки только там, где нужно:
- «Каталог» – если скидка должна быть видна в карточке и списках.
- «Корзина» – если скидка применяется только при оформлении.
Важно: Если галочка «Все» оставлена, система будет вычислять скидку в каждом из трёх модулей, даже если пользователь не увидит её в двух из них.
3.2. Условие отображения (Condition)
| Условие | Пример | Как влияет |
|---|---|---|
| Группа пользователей | USER_GROUP = "Оптовики" |
Скидка будет рассчитана только для этой группы; остальные пользователи не будут участвовать в запросе. |
| Наличие свойства | PRODUCT_PROPERTY["SHOW_DISCOUNT"] = "Y" |
Если у товара нет свойства SHOW_DISCOUNT, правило просто игнорируется. |
| Минимальная сумма заказа | BASKET_TOTAL >= 5000 |
Скидка будет вычислена только в корзине, когда сумма превысит порог. |
3.3. Пример практического правила
Сценарий: Скидка 10 % только для товаров, у которых в каталоге включён флаг «Акция», и только для оптовых клиентов.
| Шаг | Действие |
|---|---|
| 1 | Тип правила – Скидка. |
| 2 | Точки применения – Каталог. |
| 3 | Условие – PRODUCT_PROPERTY["SALE_FLAG"] = "Y" И USER_GROUP = "Оптовики". |
| 4 | Ставка – 10 %. |
| 5 | Приоритет – 100 (чтобы перекрывать общие правила). |
В результате Битрикс будет выполнять запрос к базе только для товаров, у которых SALE_FLAG = Y. Для всех остальных товаров запросы не будет, экономя ресурсы.
4. Технические детали: как работает механизм в коде
// Пример получения цены с учётом только нужных точек
$price = \Bitrix\Catalog\Product\Price::getBasePrice($productId);
$discount = \Bitrix\Sale\Discount::getDiscountList([
'PRODUCT_ID' => $productId,
'USER_ID' => $userId,
'APPLY' => ['CATALOG'] // <-- ограничиваем точку применения
]);
$finalPrice = $price - $discount;
- Параметр
APPLYпринимает массив точек (CATALOG,BASKET,ORDER). - Если передать пустой массив, система будет искать скидку во всех точках, что замедляет работу.
4.1. Кеширование
Битрикс кэширует результат расчёта в зависимости от ключа:
discount_{PRODUCT_ID}_{USER_GROUP}_{APPLY}
Если точка применения меняется, кэш‑ключ меняется, и кэш будет построен заново. Поэтому уменьшение количества точек ускоряет не только расчёт, но и повышает hit‑rate кэша.
5. Как проверить, что правило работает только в нужных местах
- Откройте карточку товара в публичной части сайта.
- Если скидка не должна показываться, цены должна быть оригинальная.
- Добавьте товар в корзину и перейдите в корзину.
- Если правило привязано к корзине, цена должна измениться.
- Откройте админку → Отчёты → Скидки и отфильтруйте по полю Точка применения.
| Точка | Ожидаемый результат |
|---|---|
| Каталог | Цена в карточке изменена. |
| Корзина | Цена в корзине изменена, в каталоге – нет. |
| Заказ | Цена в документе изменена, в каталоге и корзине – нет. |
Если наблюдается расхождение, проверьте приоритеты и условия в правиле.
6. Частые ошибки и как их избежать
| Ошибка | Почему происходит | Как исправить |
|---|---|---|
| Скидка считается в всех точках, хотя нужна только в каталоге. | Галочка «Все» оставлена в «Точках применения». | Снимите галочки, оставьте только Каталог. |
| Пользователь видит цену без скидки, но в отчёте скидка учтена. | Условие отображения (SHOW_DISCOUNT) не добавлено. |
Добавьте условие PRODUCT_PROPERTY["SHOW_DISCOUNT"] = "Y". |
| Система генерирует «запросы к базе» в цикле для каждого SKU. | Правило без фильтра по свойствам, применяется к всех товарам. | Добавьте фильтр по свойству, например PRODUCT_PROPERTY["SALE_FLAG"] = "Y". |
| Кеш не обновляется после изменения правила. | Ключ кэша не меняется, потому что точка применения не изменилась. | Очистите кеш вручную или измените приоритет/условие, чтобы ключ изменился. |
7. Как масштабировать на крупном магазине
- Разделите правила по модулям – один набор для каталога, другой для корзины.
- Группируйте товары по свойствам (
SALE_FLAG,DISCOUNT_GROUP) и создавайте правила уровня группы. - Используйте API‑метод
\Bitrix\Sale\Discount::setApplyPointsдля динамического переключения точек применения в зависимости от нагрузки.
$discount = \Bitrix\Sale\Discount::load($discountId);
$discount->setApplyPoints(['BASKET']); // переключаем только на корзину
$discount->save();
- Отслеживайте метрики: запросы к
b_sale_discount→b_sale_discount_applies. При росте количества запросов в логах, проверяйте, не «перепрыгивают» правила в лишние точки.
8. Лучшие практики
| Практика | Описание |
|---|---|
| Минимальный набор условий | Чем меньше условий, тем быстрее фильтрация в базе. |
| Явные приоритеты | Указывайте приоритеты, чтобы избежать конфликтов. |
| Тестирование в режиме «Только для админа» | Позволяет проверить логику без влияния на реальных покупателей. |
| Регулярный аудит кэша | Очистка кэша после массовых изменений правил избавит от «залипания» старых цен. |
| Документирование правил | Внутренний вики‑список с описанием, где и почему применяется каждая скидка. |
Практика для закрепления
-
Создайте правило скидки 15 % для товаров с свойством
SHOW_DISCOUNT = "Y"и привяжите его только к корзине. Проверьте, что в каталоге цена не меняется, а в корзине — меняется. -
Сделайте тест: у вас есть две группы пользователей – «Розничные» и «Оптовые». Настройте правило, которое дает 20 % скидку только оптовым клиентам, но только в каталоге. Какой запрос к базе будет выполнен для розничного пользователя?
-
Оптимизируйте существующее правило: в вашей базе есть правило «Скидка 5 % на все товары», привязанное к «Все». Перепишите его так, чтобы оно учитывалось только в корзине, а в каталоге цены оставались оригинальными. Оцените, насколько сократилось количество запросов к таблице
b_sale_discount. -
Разработайте скрипт, который будет автоматически переключать точку применения правила с «Каталог» на «Корзина» в ночное время (период низкой нагрузки). Какие функции Битрикс вам потребуются?
-
Проанализируйте отчёт: в админке откройте «Отчёты → Скидки», отфильтруйте по точке «Каталог». Сколько правил применяются только в каталоге? Какой процент от общего количества правил? Что это говорит о вашей текущей стратегии?
Итого: вы теперь знаете, как правильно ограничить расчёт скидок в Битрикс только теми точками, где они действительно нужны, как построить эффективные условия и как проверять корректность работы. Применяйте эти принципы, и ваш сайт будет работать быстрее, а цены – всегда точными.
Английский видеочат для путешествий
Чат рулетка 2026: Интерактивные элементы
Чат-рулетка: случайный собеседник в одно нажатие
Чат с Аней: Моё общение
Этикетки для упаковки и доставки
Как настроить бэкапы для вашего сайта на хостинге Host.bg
Как обновить PHP на хостинге Host.bg
Как решить проблемы с загрузкой сайта на Host.bg
Калькулятор зарплаты SEO-оптимизатора
Курска: автошколы с бесплатной консультацией
Лайфхаки для управления хостингом на Host.bg
Монетизация через платные услуги
Мск: ИП или ООО — лучший старт для бизнеса?
Общение в интернете без риска
Ошибки при настройке хостинга и их решения
Проблемы с доменами и их решения на хостинге Host.bg
Продвижение сайтов: поисковое продвижение + ИИ
Ремонт квартир с использованием норм
Roblox: игровая культура
Сайтостроение: основы и секреты
Сколько стоит биткоин
Сравнение ценовых диапазонов хостинга Host.bg
Трубная продукция для трубопроводных конструкций
Утепление в Твери и Брянской области
Vdsina: Великая сила
Видео рулетка 18+
Видеочат с случайным собеседником онлайн
Видеообщения по всему миру
Выбор оптимального плана хостинга на Host.bg