Разработка кастомной логики скидок 1С-Битрикс

Наша компания занимается разработкой, поддержкой и обслуживанием решений на Битрикс и Битрикс24 любой сложности. От простых одностраничных сайтов до сложных интернет магазинов, CRM систем с интеграцией 1С и телефонии. Опыт разработчиков подтвержден сертификатами от вендора.
Предлагаемые услуги
Показано 1 из 1 услугВсе 1626 услуг
Разработка кастомной логики скидок 1С-Битрикс
Средняя
~1-2 недели
Часто задаваемые вопросы
Наши компетенции:
Этапы разработки
Последние работы
  • image_website-b2b-advance_0.png
    Разработка сайта компании B2B ADVANCE
    1177
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Разработка веб-сайта для компании ФИКСПЕР
    811
  • image_bitrix-bitrix-24-1c_development_of_an_online_appointment_booking_widget_for_a_medical_center_594_0.webp
    Разработка на базе Битрикс, Битрикс24, 1С для компании Development of an Online Appointment Booking Widget for a Medical Center
    564
  • image_bitrix-bitrix-24-1c_mirsanbel_458_0.webp
    Разработка на базе 1С Предприятие для компании МИРСАНБЕЛ
    747
  • image_crm_dolbimby_434_0.webp
    Разработка сайта на CRM Битрикс24 для компании DOLBIMBY
    655
  • image_crm_technotorgcomplex_453_0.webp
    Разработка на базе Битрикс24 для компании ТЕХНОТОРГКОМПЛЕКС
    976

Разработка кастомной логики скидок 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, где хранятся индивидуальные скидки клиентов:

  1. При авторизации пользователя запрашиваем его скидочный профиль из внешней системы
  2. Сохраняем в сессии или в UF_ полях пользователя
  3. Обработчик события корзины читает эти данные и применяет скидку

Кеширование ответа от внешней системы обязательно — каждый запрос при каждом изменении корзины к внешнему API создаёт неприемлемую задержку. Кешируем в Redis/Memcached с TTL 15–60 минут.

Отладка кастомной логики скидок

Логирование применённых скидок: в b_sale_order_discount хранятся все применённые к заказу правила. Для отладки кастомных скидок добавляем запись в этот журнал с идентификатором «кастомное правило», чтобы в панели администратора было видно, что именно применилось.

Сроки выполнения

Задача Срок
Кастомный обработчик события для одного правила 1–2 дня
Новое условие в конструкторе маркетинговых правил 2–3 дня
Полный кастомный провайдер скидок 1–2 недели
Интеграция скидок из внешней CRM с кешированием 3–5 дней