Разработка кастомной логики скидок 1С-Битрикс
Стандартный конструктор скидок Битрикс покрывает большинство типовых сценариев. Но когда нужна скидка, зависящая от внешней CRM, от истории заказов за квартал, от остатков конкурентов или от часа суток — стандартные инструменты заканчиваются. Тогда пишется кастомная логика.
Два уровня расширения
Уровень 1: Кастомный обработчик события корзины
Событие OnBeforeSaleOrderFinalAction позволяет вмешаться в момент расчёта корзины до финального применения скидок. Событие OnSaleBasketItemAdd позволяет перехватить добавление товара.
Пример: скидка 5% на весь заказ, если покупатель в этом месяце уже делал заказ:
AddEventHandler('sale', 'OnBeforeSaleOrderFinalAction', function(&$order) {
$userId = $order->getUserId();
$currentMonth = date('Y-m');
$prevOrders = \Bitrix\Sale\Order::load(/* фильтр по userId и месяцу */);
if (!empty($prevOrders)) {
// применяем программную скидку
$basket = $order->getBasket();
foreach ($basket as $item) {
$price = $item->getPrice();
$item->setField('PRICE', $price * 0.95);
$item->setField('DISCOUNT_PRICE', $price * 0.05);
}
}
});
Уровень 2: Кастомный провайдер скидок
Более чистый подход — реализовать интерфейс \Bitrix\Sale\Discount\DiscountProviderInterface и зарегистрировать свой провайдер. Провайдер получает корзину на вход и возвращает список применённых скидок в стандартном формате. Стандартные правила из b_sale_discount при этом продолжают работать параллельно или заменяются полностью — зависит от конфигурации.
Кастомные условия в конструкторе правил
Расширить список доступных условий в конструкторе маркетинговых правил можно без замены всего механизма. Создаётся класс-наследник \Bitrix\Sale\Discount\Actions\Base или условие-наследник \Bitrix\Sale\Discount\Condition\Base:
namespace MyModule\Discount\Condition;
class PreviousOrdersCount extends \Bitrix\Sale\Discount\Condition\Base
{
public function check(\Bitrix\Sale\Order $order): bool
{
// логика проверки
}
}
Класс регистрируется через events.php модуля, и в конструкторе правил появляется новое условие «Количество предыдущих заказов».
Кастомные скидки из внешних систем
Для интеграции с внешней CRM или ERP, где хранятся индивидуальные скидки клиентов:
- При авторизации пользователя запрашиваем его скидочный профиль из внешней системы
- Сохраняем в сессии или в
UF_полях пользователя - Обработчик события корзины читает эти данные и применяет скидку
Кеширование ответа от внешней системы обязательно — каждый запрос при каждом изменении корзины к внешнему API создаёт неприемлемую задержку. Кешируем в Redis/Memcached с TTL 15–60 минут.
Отладка кастомной логики скидок
Логирование применённых скидок: в b_sale_order_discount хранятся все применённые к заказу правила. Для отладки кастомных скидок добавляем запись в этот журнал с идентификатором «кастомное правило», чтобы в панели администратора было видно, что именно применилось.
Сроки выполнения
| Задача | Срок |
|---|---|
| Кастомный обработчик события для одного правила | 1–2 дня |
| Новое условие в конструкторе маркетинговых правил | 2–3 дня |
| Полный кастомный провайдер скидок | 1–2 недели |
| Интеграция скидок из внешней CRM с кешированием | 3–5 дней |







