Розробка кастомної логіки скидок 1С-Bitrix
Стандартний конструктор скидок Bitrix охоплює більшість типових сценаріїв. Але коли потрібна скидка, залежна від зовнішньої 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 днів |







