Настраиваем расчёт скидок только там, где они реально отображаются, а не на каждом товаре
Хочу себе такие же кнопкиЧто вы получите сразу после чтения
- Понимание, почему «общий» расчёт скидок замедляет работу сайта и приводит к неверным ценам.
- Чёткую схему, как ограничить вычисления только теми товарами, где скидка действительно показывается покупателю.
- Пошаговый инструктаж по настройке в админке Битрикс 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. -
Разработайте скрипт, который будет автоматически переключать точку применения правила с «Каталог» на «Корзина» в ночное время (период низкой нагрузки). Какие функции Битрикс вам потребуются?
-
Проанализируйте отчёт: в админке откройте «Отчёты → Скидки», отфильтруйте по точке «Каталог». Сколько правил применяются только в каталоге? Какой процент от общего количества правил? Что это говорит о вашей текущей стратегии?
Итого: вы теперь знаете, как правильно ограничить расчёт скидок в Битрикс только теми точками, где они действительно нужны, как построить эффективные условия и как проверять корректность работы. Применяйте эти принципы, и ваш сайт будет работать быстрее, а цены – всегда точными.
CamZamZam - онлайн фото с вебкамеры с эффектами
Cartoon Network: игры с персонажами
Чат рулетка в 2026: будущие функции
Эксперт по доменным стратегическим решениям
Хостинг для e-commerce проектов
Как играть в слоты
Как настроить CDN для сайта на хостинге Host.bg
Как настроить SSL-сертификат для сайта на Host.bg
Как оптимизировать производительность сайта с хостингом Host.bg
Как выбрать правильный хостинг для вашего сайта
Какие бывают ЛОР болезни у детей
Кассовые терминалы с оплатой картами
LOL куклы витрина детская
Лучшие видеорегистраторы для водителей
Онлайн QR-код сканер
Онлайн-связь
Оптимизация производительности баз данных на хостинге Host.bg
Основы настройки веб-хостинга: что вам нужно знать
Партнёрская программа без блога: как получать трафик из Telegram
Профессиональные хитрости для пользователей хостинга Host.bg
Регистрация ИП в Москве для иностранных граждан
Сравнение хостинга Host.bg с другими провайдерами
Субтитры — нет, уши — включены: погружение в английский за 5 минут
Сумки с бусинами
Техника для строительства загородных трасс
ТОП-10 VPS для разработчика: рейтинг серверов под рабочие задачи
WordPress блог для бизнеса