Когда в магазине несколько скидок сразу, важно понимать не «сколько процентов», а в каком порядке Битрикс их применяет. Движок скидок — это конвейер с чёткими правилами, и результат в корзине полностью предсказуем, если знать логику приоритетов, сортировки и остановки.
Два движка: каталог и корзина
В 1С-Битрикс скидки считают два разных механизма, и путать их нельзя. Первый — скидки на товары каталога (модуль catalog, класс \Bitrix\Catalog\Discount\DiscountManager). Они меняют цену ещё на витрине: в списке товаров, в детальной карточке и в фильтре по цене. Второй — правила работы с корзиной (модуль sale, раздел «Маркетинг → Правила работы с корзиной»). Они срабатывают уже в корзине и в оформлении заказа и умеют оперировать составом корзины, суммой, купонами и подарками.
Порядок между ними жёсткий: сначала полностью отрабатывают скидки каталога и формируют «цену со скидкой» для каждой позиции, а затем на этот результат накладываются правила корзины. Поэтому правило корзины «−10% от суммы» считается уже от цен, которые могли быть снижены каталожной скидкой.
b_sale_discount и обрабатываются одним ядром, но логическое разделение «сначала каталог, потом корзина» сохраняется.Как условия превращаются в код
Каждая скидка в Битрикс — это дерево условий и действий, собранное в визуальном конструкторе. При сохранении движок компилирует это дерево в исполняемый PHP-код и складывает его в поля скидки (CONDITIONS, ACTIONS, UNPACK). За счёт этого при каждом пересчёте корзины система не разбирает условия заново, а просто выполняет готовый предикат.
Практический вывод один: после любой правки скидки нужно её пересохранить, а при массовых изменениях — переиндексировать. Если скидка «не работает», в 90% случаев причина не в логике, а в том, что старый скомпилированный код не соответствует новым условиям либо товар не попал в выборку по типу цены, группе пользователя или разделу.
- Условия — кому и на что скидка (группа покупателя, тип цены, раздел, свойство, сумма корзины);
- Действия — что сделать (процент, фиксированная сумма, новая цена, подарок);
- Период и активность — даты действия и флаг
ACTIVE.
Общий порядок пересчёта
Когда корзина меняется (добавили товар, сменили количество, ввели купон), движок запускает пересчёт по устойчивой цепочке:
- Определяется покупатель: его группы, тип цены, регион — от этого зависит, какие скидки вообще применимы.
- Для каждой позиции применяются скидки каталога и фиксируется цена товара со скидкой.
- Собирается пул подходящих правил корзины, чьи условия выполнены на текущем составе.
- Правила сортируются по приоритетным группам, приоритету и полю сортировки.
- Правила применяются по очереди; на каждом шаге пересчитывается сумма, и следующее правило видит уже изменённые цены.
- Проверяются флаги остановки — если сработала «финальная» скидка, дальнейшие в её группе не применяются.
Ключевая идея: скидки применяются последовательно, а не параллельно. Каждое следующее правило работает поверх результата предыдущего, и именно это отличает «−20% и −10%» от честных «−30%».
Приоритет и сортировка
Очередь правил корзины определяют три параметра, и применяются они именно в таком старшинстве:
| Параметр | Поле | Что делает |
|---|---|---|
| Приоритетная группа | PRIORITY | Старший уровень: группы обрабатываются от большего значения к меньшему |
| Сортировка | SORT | Порядок внутри одной группы; чем меньше число, тем раньше |
| Идентификатор | ID | Крайний критерий, если приоритет и сортировка совпали |
На практике приоритет отвечает за «важность» набора скидок, а сортировка — за тонкий порядок внутри. Если две акции конфликтуют и вы хотите, чтобы одна гарантированно шла первой, поднимите ей приоритет, а не только сортировку. Настраивается всё это в карточке правила и в общем списке «Правил работы с корзиной», где столбцы можно менять прямо в таблице.
Приоритетные группы и флаг остановки
Самый недооценённый инструмент управления скидками — флаг «Прекратить дальнейшее применение скидок» (в ядре — признак «последней» скидки). Если у правила он включён и правило сработало, движок останавливает обработку остальных правил, стоящих ниже. Это и есть способ сделать скидки взаимоисключающими: например, «купон» и «накопительная скидка» не должны складываться.
Вместе с приоритетными группами это даёт гибкую модель:
- Скидки одной приоритетной группы считаются вместе и суммируются последовательно;
- Скидка с флагом остановки обрывает цепочку — товар получает её и выходит из дальнейшего расчёта;
- Разные группы позволяют, например, отдельно применить «скидку на товар» и «скидку на доставку», не мешая их между собой.
Именно комбинацией «приоритет + группа + флаг остановки» решаются задачи вроде «накопительная не действует на акционные товары» или «купон не суммируется со скидкой бренда».
Купоны, округление и итоговая цена
Купоны — это не отдельный тип скидки, а условие активации правила корзины. Правило со связанным купоном лежит в общей очереди и подчиняется тем же приоритетам; активируется оно только при вводе валидного кода. Один заказ может нести несколько купонов, и каждый включает своё правило — а сложатся они или нет, снова определяет флаг остановки.
После всех вычислений включается округление. В настройках модуля sale (Настройки → Настройки продуктов → Настройки модулей → «Интернет-магазин») задаётся правило округления итоговой цены — по разряду и по направлению. Округление применяется в самом конце, к финальной цене позиции, а не к каждой промежуточной скидке, поэтому копеечные расхождения «руками не считаются» и это нормально.
Как понять, какая скидка сработала
Когда в корзине «не та» сумма, не гадайте — используйте штатные средства диагностики:
- Трассировка скидок в корзине. В отладочном режиме и в служебных данных заказа Битрикс хранит список применённых скидок с их
ID, приоритетом и итоговой суммой — видно, что именно сработало и в каком порядке. - Проверка условий по одному. Временно отключайте правила и смотрите, как меняется сумма; так быстро находится «жадное» правило с флагом остановки, которое обрывает цепочку раньше нужного.
- Группа пользователя и тип цены. 70% «непримененных» скидок — это несовпадение группы покупателя или типа цены в условии скидки.
- Даты и активность. Проверяйте период действия и часовой пояс сайта — просроченная или ещё не начавшаяся акция в списке выглядит как рабочая.
Для сложных наборов удобно вести карту скидок: таблицу «правило — приоритет — сортировка — флаг остановки — с чем не суммируется». Она экономит часы при разборе конфликтов и при передаче магазина на поддержку.
Итог
Алгоритм применения скидок в 1С-Битрикс — это предсказуемый конвейер: сначала скидки каталога формируют цену позиции, затем правила корзины применяются по очереди согласно приоритетной группе, приоритету и сортировке, а флаг остановки определяет, где цепочка обрывается. Купоны встраиваются в ту же очередь, а округление завершает расчёт. Понимая эту логику, вы получаете именно ту скидку, которую задумали, а не случайную сумму в корзине.
Если акций много и они начинают конфликтовать, тормозить каталог или считаться неверно, мы помогаем навести порядок: проектируем прозрачную систему приоритетов, чиним пересчёт и ускоряем корзину под нагрузкой. Обращайтесь — разложим ваши скидки по полочкам и сделаем результат стабильным.
Частые вопросы
В каком порядке применяются скидки каталога и правила корзины?
Сначала полностью отрабатывают скидки каталога и формируют цену позиции, а затем на неё накладываются правила работы с корзиной. Правило корзины всегда считается от уже сниженной каталожной цены.
Скидки в Битрикс складываются или применяются по очереди?
По очереди: каждое следующее правило работает поверх результата предыдущего. Поэтому «−20%, затем −10%» дают не −30%, а меньшую суммарную скидку.
Что делает флаг «Прекратить дальнейшее применение скидок»?
Если правило с этим флагом сработало, движок останавливает применение остальных правил ниже по очереди. Так делают скидки взаимоисключающими, например купон и накопительную.
Чем приоритет отличается от сортировки?
Приоритет — это старший уровень, он группирует скидки по важности и обрабатывается первым. Сортировка задаёт порядок уже внутри одной приоритетной группы.
Почему выгодная покупателю скидка не применяется автоматически?
Движок не сравнивает выгоду, а применяет правила строго по приоритету и сортировке. Чтобы нужная скидка сработала первой, поднимите ей приоритет, а не рассчитывайте на «максимальную выгоду».
Как купоны участвуют в алгоритме?
Купон — это условие активации правила корзины, а не отдельный тип скидки. Правило с купоном стоит в общей очереди и подчиняется тем же приоритетам и флагам остановки.
На каком этапе происходит округление цены?
Округление применяется в самом конце, к финальной цене позиции после всех скидок, а не к каждому промежуточному шагу. Правило округления задаётся в настройках модуля «Интернет-магазин».
Как узнать, какие именно скидки сработали в корзине?
В служебных данных заказа и отладочном режиме Битрикс хранит список применённых скидок с их ID, приоритетом и суммой. Также помогает поочерёдное отключение правил для поиска конфликтов.
Поможем с настройкой и поддержкой 1С-Битрикс: Управление сайтом
Поможем с настройкой, доработкой и поддержкой 1С-Битрикс: Управление сайтом.