Правила работы с корзиной — гибкий, но не всесильный инструмент. Понимание его границ экономит дни отладки: вы заранее видите, где визуального конструктора хватит, а где придётся писать обработчик или менять архитектуру акции.
Что такое правила корзины и почему у них есть предел
Правила работы с корзиной (модуль sale, раздел Магазин → Маркетинг → Правила работы с корзиной) — это конструктор акций, который срабатывает на этапе расчёта заказа. Он состоит из двух частей: условия (когда применять) и действия (что сделать со скидкой, доставкой или подарком). Всё это собирается мышкой из готовых блоков, без единой строки кода.
Именно в этом — источник ограничений. Конструктор оперирует фиксированным набором полей и операций, которые заложил разработчик модуля. Как только акция выходит за рамки этого набора (нестандартное поле, сложная логика «если-иначе», обращение к внешним данным), визуальных средств перестаёт хватать. Ниже — конкретные границы, с которыми чаще всего сталкиваешься на боевых проектах.
Ограничения в условиях
Дерево условий строится по свойствам товара, корзины и покупателя. Но набор проверяемых полей закрыт: доступны цена, количество, разделы каталога, бренды, группы пользователя и несколько атрибутов заказа. Чего в конструкторе штатно нет:
- проверки произвольных пользовательских свойств инфоблока (кроме тех, что явно проиндексированы для скидок);
- логики «применить, если товара X нет в корзине» — отрицание доступно ограниченно и работает не для всех блоков;
- условий по истории заказов клиента (например, «первый заказ» или «покупал ли раньше бренд»);
- обращения к внешним системам — остаткам на складе в реальном времени, данным CRM, статусу в 1С;
- сложных временны́х правил вроде «только по будням с 18:00» — есть период действия, но не расписание.
Отдельная тонкость — вложенность и логика И/ИЛИ. Группы условий комбинировать можно, но глубокая вложенность с разнородными операторами быстро становится нечитаемой и провоцирует ошибки: правило молча не срабатывает, а понять почему без пошаговой отладки трудно.
Ограничения в действиях
Действия ещё жёстче ограничены, чем условия. Штатно правило умеет: дать скидку в процентах или сумме, установить фиксированную цену, начислить скидку на доставку и добавить товар-подарок. За пределами этого списка начинаются проблемы.
| Хочу сделать | Штатно |
|---|---|
| Скидка % / фикс. сумма на товар | Да |
| Подарок при покупке | Да |
| Механика «3 по цене 2» на самый дешёвый | Частично, через отдельное действие |
| Разная скидка на каждую N-ю единицу | Нет |
| Начисление бонусных баллов | Нет (нужен модуль лояльности) |
| Подмена состава заказа / замена SKU | Нет |
Ключевое ограничение: одно действие применяет один тип модификации. Сложные подарочные механики («выбери один подарок из трёх») собираются костылями и часто требуют доработки корзины в публичной части.
Приоритеты, суммирование и конфликты
Когда правил больше одного, вступает в силу сортировка и приоритеты. Правила выполняются сверху вниз по полю сортировки внутри приоритета; более высокий приоритет вытесняет более низкий. Здесь кроется частая ошибка проектирования:
- Клиент ждёт, что скидки сложатся (например, акция + накопительная), а по факту сработает только одна — с высшим приоритетом.
- Флаг «Прекратить дальнейшее применение правил» останавливает всю цепочку, и нижние правила молчат, хотя формально их условия выполнены.
- Округление промежуточных скидок даёт расхождение в копейках между корзиной и итогом заказа.
Ограничения в публичной части
Правила корзины считаются на этапе корзины и оформления, а не в карточке товара или каталоге. Из этого следует важное практическое ограничение: клиент не видит акционную цену до того, как положит товар в корзину. Штатно скидка правила не выводится ни бейджем «−20%», ни зачёркнутой старой ценой в списке товаров.
- В карточке и каталоге отображаются только скидки каталога (модуль
catalog), а не правила корзины. - Подарок, доставка со скидкой и условные бонусы видны исключительно внутри корзины.
- Персональные правила (по группе пользователя) требуют авторизации, поэтому в анонимном каталоге показать их корректно нельзя.
Если задача — именно витринная коммуникация акции, часть механик придётся дублировать скидкой каталога или выносить в собственный компонент. Подробнее об этом — в материале о том, какие скидки можно вывести в публичной части.
Производительность и кэширование
Каждое активное правило — это дополнительный проход по корзине при расчёте. На магазине с десятками правил и большой корзиной это ощутимо бьёт по времени пересчёта, особенно в ajax-обновлениях корзины и на шаге оформления.
- Правила плохо кэшируются: их результат зависит от состава корзины и пользователя, поэтому расчёт идёт на каждый запрос.
- Тяжёлые условия по разделам и брендам разворачиваются в объёмные выборки — чем шире дерево каталога, тем дороже.
- Множество «спящих» правил с невыполнимыми условиями всё равно проверяются и тратят ресурсы.
Как обходят ограничения
Когда конструктора не хватает, границы раздвигают кодом — не заменяя механизм, а расширяя его. Основные штатные точки расширения:
- Собственные условия и действия. Модуль
saleпозволяет регистрировать пользовательские классы условий/действий, которые появятся в том же визуальном конструкторе. - События пересчёта корзины (
OnSaleBasketItemBeforeSavedи связанные) — тонкая корректировка цен и полей на лету. - Обработчик
OnSaleComponentOrderResultPreparedи правка шаблонов корзины — для нестандартного вывода подарков и бейджей. - Для витрины — собственный компонент, который показывает потенциальную выгоду до попадания товара в корзину.
Каждый из этих способов требует аккуратности: неверный обработчик ломает расчёт заказа целиком и трудно диагностируется. Такие доработки стоит покрывать тестами и вести в отдельном модуле, а не в init.php вперемешку с остальным.
Итог
Правила работы с корзиной закрывают подавляющее большинство типовых акций без строчки кода, но упираются в закрытый набор условий и действий, отсутствие витринного вывода, непрозрачные приоритеты и цену пересчёта на больших корзинах. Знание этих границ — половина успеха: вы сразу выбираете между настройкой, скидкой каталога и полноценной доработкой.
Мы в B2Bsite регулярно проектируем сложные акционные механики на 1С-Битрикс: пишем собственные условия и действия, аккуратно расширяем расчёт корзины через события и следим, чтобы новые правила не тормозили магазин. Если ваша акция не укладывается в штатный конструктор — поможем спроектировать её так, чтобы она работала предсказуемо и быстро.
Частые вопросы
Можно ли в правиле проверить пользовательское свойство товара?
Штатно конструктор оперирует фиксированным набором полей — цена, количество, разделы, бренды. Произвольное свойство инфоблока напрямую недоступно, для этого регистрируют собственное условие через API модуля sale.
Почему складываются не все скидки, а срабатывает только одна?
Правила выполняются по приоритетам и сортировке. Более высокий приоритет вытесняет нижние, а флаг «Прекратить дальнейшее применение правил» и вовсе обрывает цепочку. Суммирование нужно проектировать осознанно.
Видит ли покупатель акционную цену правила в каталоге?
Нет. Правила корзины считаются на этапе корзины и оформления, поэтому в списке товаров и карточке выводятся только скидки каталога. Для витрины механику дублируют или пишут отдельный компонент.
Есть ли в интерфейсе трассировка применённых скидок?
Наглядного отчёта «какое правило и почему сработало» штатно нет. Поведение реконструируют по приоритетам и сортировке либо через отладку в коде на этапе расчёта заказа.
Замедляют ли правила корзину?
Да, при большом количестве активных правил и объёмной корзине. Результат плохо кэшируется и пересчитывается на каждый запрос, поэтому завершённые акции лучше деактивировать, а не хранить включёнными.
Можно ли начислять бонусные баллы правилом корзины?
Нет, набор действий ограничен скидками, фиксированной ценой, скидкой на доставку и подарком. Начисление баллов реализует отдельный модуль лояльности или собственная доработка.
Как сделать действие, которого нет в списке?
Модуль sale поддерживает регистрацию собственных классов условий и действий — они появляются в том же визуальном конструкторе. Это штатный способ расширения без замены механизма.
Работают ли сложные условия «если товара нет в корзине»?
Отрицание в конструкторе поддерживается ограниченно и не для всех блоков условий. Надёжнее реализовать такую логику отдельным условием или обработчиком события пересчёта корзины.
Поможем с настройкой и поддержкой 1С-Битрикс: Управление сайтом
Поможем с настройкой, доработкой и поддержкой 1С-Битрикс: Управление сайтом.