Изменить стоимость доставки в зависимости от общей стоимости корзины

Задача: изменить стоимость доставки при достижении суммы заказа

Одна из распространённых задач в интернет-магазине на Битрикс — предоставление бесплатной или льготной доставки при достижении определённой суммы в корзине. Например, «бесплатная доставка от 8 500 рублей» или «скидка на доставку 50% при заказе от 5 000 рублей». Стандартный функционал модуля продаж позволяет настроить это через событийную модель, не затрагивая ядро системы.

Для этой задачи используется событие onSaleDeliveryServiceCalculate из модуля sale. Обработчик события вызывается в момент расчёта стоимости доставки и позволяет программно изменить итоговую цену доставки.

Событие onSaleDeliveryServiceCalculate

Событие onSaleDeliveryServiceCalculate генерируется модулем продаж при расчёте стоимости каждой службы доставки. Обработчик получает два ключевых параметра:

  • RESULT — объект результата расчёта, через который можно установить новую цену доставки методом setDeliveryPrice().
  • SHIPMENT — объект отправления (Shipment), содержащий информацию о выбранной службе доставки, заказе и вложенных товарах.

Важно: событие срабатывает для каждой доступной службы доставки, поэтому в обработчике необходимо фильтровать по идентификатору службы ($deliveryId), чтобы изменить цену только у нужной.

Разбор кода обработчика

Полный рабочий код обработчика с пояснениями:

Как вычислить сумму корзины в обработчике

В коде выше используется загрузка корзины через Basket::loadItemsForFUser(). Эта функция принимает идентификатор fuserId (анонимный пользователь корзины) и код сайта. Сумма вычисляется в цикле по всем позициям: цена позиции умножается на количество и добавляется к итогу.

Альтернативно, если нужна сумма уже из объекта отправления, можно получить её через коллекцию корзины заказа:

Этот способ более надёжен, так как данные берутся напрямую из объекта заказа, а не из сессии пользователя.

Пример: бесплатная доставка от N рублей

Адаптируйте условие под свои нужды. Например, сделать бесплатную доставку для всех служб при заказе от 10 000 рублей:

Или задать фиксированную льготную цену доставки (например, 150 рублей вместо стандартной) при заказе от 5 000 рублей:

Идентификатор службы доставки ($deliveryId) можно найти в административной панели: Магазин → Доставка → Службы доставки. ID отображается в таблице.

Где разместить код

Код обработчика события размещается в файле инициализации Битрикс. Рекомендуется использовать пользовательский файл, чтобы изменения не потерялись при обновлении системы:

Если папки local нет — создайте её. Это стандартный способ хранения пользовательских обработчиков в Битрикс. Альтернативный путь (устаревший, но рабочий):

Использовать /bitrix/php_interface/init.php нежелательно, так как файл находится в системной директории и может быть перезаписан при обновлении ядра Битрикс.

Тестирование

После добавления кода проверьте работу следующим образом:

  • Добавьте товары в корзину на сумму ниже порогового значения и перейдите к оформлению заказа — стоимость доставки должна быть стандартной.
  • Добавьте товары на сумму выше порогового значения — стоимость нужной службы доставки должна измениться согласно условию.
  • Если цена не меняется, проверьте правильность $deliveryId — выведите его через var_dump() в обработчике для отладки.
  • Убедитесь, что файл init.php подключается корректно: синтаксических ошибок в нём быть не должно (иначе сайт может перестать работать).