Скидки — одна из самых частых причин медленного каталога и корзины в 1С-Битрикс. Каждое правило работы с корзиной и каждая скидка каталога участвуют в пересчёте цены, а на большом ассортименте и десятках акций это выливается в лишние запросы к базе и секунды ожидания. Разберём, где именно теряется скорость и какими штатными средствами её вернуть.
Почему скидки нагружают сайт
Скидки в 1С-Битрикс — это не статичная надпись на цене, а вычисление, которое выполняется при каждом расчёте. Есть два принципиально разных механизма, и тормозят они по-разному.
- Скидки каталога применяются к цене товара в списках и карточках. Чтобы вывести цену со скидкой, система должна для каждого товара определить, какие скидки на него распространяются, — а это перебор условий по разделам, брендам и свойствам.
- Правила работы с корзиной (модуль
sale) пересчитываются при каждом изменении корзины и оформлении заказа. Битрикс генерирует из дерева условий исполняемый PHP-код и прогоняет его по всему составу заказа.
Пока правил и товаров немного, нагрузка незаметна. Проблемы начинаются, когда в каталоге десятки тысяч позиций, а активных скидок и правил — десятки. Тогда на каждый вывод списка и каждый пересчёт корзины приходятся сотни лишних операций.
Как найти узкое место
Прежде чем оптимизировать, нужно убедиться, что тормозят именно скидки, а не шаблон или сторонний модуль. Помогают штатные инструменты платформы:
- Монитор производительности (модуль
perfmon) — раздел Настройки → Производительность → Монитор производительности. Он показывает время выполнения хитов, самые долгие SQL-запросы и разбивку по компонентам. - Отладка запросов — на странице каталога включите вывод статистики и посмотрите, не всплывают ли повторяющиеся запросы к таблицам
b_catalog_discountиb_sale_discount. - Панель разработчика компонентов показывает время рендеринга
catalog.sectionиsale.basket.basket— если время резко растёт при включённых акциях, причина в скидках.
Практический признак: страница списка товаров работает быстро с пустым каталогом скидок и заметно медленнее — когда акции включены. Это прямое указание на расчёт скидок как узкое место.
Индекс скидок каталога
Ключевой инструмент ускорения скидок каталога — индекс скидок. Вместо того чтобы при каждом выводе товара заново вычислять применимые акции, Битрикс заранее строит таблицу соответствия «товар → скидка» (b_catalog_discount2product) и при показе цены обращается уже к готовому индексу.
Управляется он в настройках модуля Торговый каталог: Настройки → Настройки продукта → Настройки модулей → Торговый каталог. После создания или изменения скидок каталога индекс нужно переиндексировать — вручную по кнопке в списке скидок или фоновым агентом. Пока переиндексация не выполнена, новые скидки могут либо не применяться, либо считаться «на лету» с полной нагрузкой.
Кэширование правил корзины
Правила работы с корзиной каждый раз собираются из базы и компилируются в PHP. Чтобы не повторять это на каждом хите, в настройках модуля Интернет-магазин (/bitrix/admin/settings.php?mid=sale) включается кэширование правил. Тогда скомпилированный набор условий и действий берётся из кэша, а не пересобирается заново.
Ещё один параметр, влияющий на скорость, — дискретный расчёт скидок. Он пересчитывает скидки пошагово, отдельными «порциями», и повышает точность в сложных сценариях, но ощутимо увеличивает нагрузку. Если такие сценарии не нужны, дискретный расчёт лучше отключить.
- Проверьте, что кэширование правил корзины включено;
- Отключите дискретный расчёт, если не используете вложенные пошаговые механики;
- Убедитесь, что тип кэша сайта — не «файлы» на медленном диске, а
memcachedили другой быстрый бэкенд.
Оптимизация самих правил
Часто проблема не в платформе, а в том, как настроены акции. Несколько приёмов, которые снижают стоимость пересчёта:
| Проблема | Решение |
|---|---|
| Десятки почти одинаковых правил | Объединить в одно правило с деревом условий вместо копий |
| Тяжёлое условие проверяется первым | Ставить сначала дешёвые условия (сумма, группа), затем перебор товаров |
| Все правила применяются каскадом | Использовать флаг «Прекращать дальнейшее применение правил» |
| Просроченные акции остались активными | Отключать или удалять неактуальные правила, а не копить их |
Каждое активное правило участвует в пересчёте, даже если по условиям не срабатывает, — потому что систему всё равно приходится проверять условие. Поэтому число активных правил напрямую влияет на скорость корзины. Регулярная чистка неактуальных акций — самый дешёвый способ ускорения.
Кэш и инфраструктура
Расчёт скидок опирается на общий стек кэширования, поэтому его настройка тоже важна:
- Управляемый кэш и тегированный кэш — при изменении скидки сбрасываются только связанные страницы, а не весь кэш. Убедитесь, что тегированный кэш включён в настройках главного модуля.
- Композитный кэш ускоряет отдачу каталога, но персональные цены и корзина в композит не попадают — их всё равно считает PHP, поэтому индекс и кэш правил остаются обязательными.
- Быстрый бэкенд кэша —
memcachedили Redis вместо файлового кэша на нагруженном магазине радикально снижают время доступа к скомпилированным правилам. - База данных — таблицы
b_sale_discountиb_catalog_discount2productдолжны обслуживаться: следите за размером индекса и не допускайте распухания от тысяч устаревших записей.
Короткий чек-лист
Если магазин тормозит и вы подозреваете скидки, пройдитесь по шагам по порядку:
- Замерьте время каталога и корзины через Монитор производительности, зафиксируйте базу.
- Проверьте, включён и переиндексирован ли индекс скидок каталога.
- Включите кэширование правил корзины и отключите дискретный расчёт, если он не нужен.
- Сократите число активных правил: объедините похожие, удалите просроченные.
- Упорядочьте условия внутри правил — дешёвые проверки первыми.
- Переведите кэш на
memcached/Redis и включите тегированный кэш. - Повторно замерьте показатели и сравните с исходными.
Такой порядок отсекает самые дорогие проблемы первыми и позволяет увидеть эффект каждого шага отдельно.
Итог
Скидки замедляют 1С-Битрикс не сами по себе, а из-за пересчёта: скидки каталога перебирают условия по каждому товару, а правила корзины компилируются и прогоняются на каждом хите. Лечится это предсказуемым набором мер — индекс скидок каталога, кэширование правил, отключение лишнего дискретного расчёта, чистка и объединение акций, быстрый бэкенд кэша. Диагностику всегда начинают с Монитора производительности, чтобы менять настройки по фактам, а не наугад.
Если акций много, они конфликтуют между собой и заметно тормозят каталог под нагрузкой, мы помогаем найти узкое место, перестроить логику скидок и разогнать магазин — от индекса и кэша до профилирования запросов и настройки инфраструктуры.
Частые вопросы
Как понять, что сайт тормозит именно из-за скидок?
Сравните время загрузки каталога и корзины с включёнными и отключёнными акциями через Монитор производительности. Если при активных скидках время резко растёт и всплывают запросы к таблицам b_catalog_discount и b_sale_discount, причина в расчёте скидок.
Что такое индекс скидок каталога?
Это заранее построенная таблица соответствия товаров и применимых к ним скидок. Она избавляет систему от вычисления акций на лету при каждом выводе товара, поэтому каталог со скидками работает значительно быстрее.
Почему новая скидка каталога не применяется или тормозит?
Скорее всего, не выполнена переиндексация индекса скидок. После создания или изменения скидки каталога индекс нужно перестроить вручную в списке скидок или дождаться работы фонового агента.
Где включается кэширование правил корзины?
В настройках модуля «Интернет-магазин» по адресу /bitrix/admin/settings.php?mid=sale. Кэш хранит скомпилированный набор условий и действий, чтобы не пересобирать правила из базы на каждом хите.
Влияет ли число активных правил на скорость?
Да, напрямую. Каждое активное правило проверяется при пересчёте корзины, даже если в итоге не срабатывает. Поэтому просроченные и дублирующие правила стоит отключать, а похожие — объединять в одно.
Нужен ли дискретный расчёт скидок?
Он повышает точность в сложных пошаговых сценариях, но заметно увеличивает нагрузку. Если вложенные пошаговые механики не используются, дискретный расчёт лучше отключить ради скорости.
Спасёт ли композитный кэш от медленных скидок?
Частично. Композит ускоряет отдачу каталога, но персональные цены и корзина в него не попадают и всё равно считаются PHP. Поэтому индекс скидок и кэш правил остаются обязательными.
Какой тип кэша выбрать для магазина со скидками?
На нагруженном магазине файловый кэш стоит заменить на memcached или Redis и включить тегированный кэш. Это ускоряет доступ к скомпилированным правилам и сбрасывает только связанные страницы при изменении акций.
Поможем с настройкой и поддержкой 1С-Битрикс: Управление сайтом
Поможем с настройкой, доработкой и поддержкой 1С-Битрикс: Управление сайтом.