Настройка бесплатной доставки по условиям на 1С-Битрикс
Бесплатная доставка при заказе от N рублей — один из главных инструментов увеличения среднего чека. В Битрикс это настраивается через встроенные ограничения обработчиков, но как только условия становятся нестандартными (бесплатно только для определённых товаров, для новых покупателей, по промокоду), начинается кастомная разработка.
Стандартный способ: ограничение по сумме заказа
В административной части для каждого обработчика доставки: «Ограничения» → «По стоимости заказа» → установить «Минимальная сумма заказа» = 0, «Максимальная» = пусто. Это подключит метод для любой суммы.
Для бесплатной доставки создаётся отдельный экземпляр обработчика (например, «СДЭК бесплатно») с нулевой ценой и ограничением «сумма заказа от 5000 руб.»:
// Обработчик с фиксированной нулевой ценой
class FreeDeliveryWrapper extends \Bitrix\Sale\Delivery\Services\Base
{
protected function calculateConcrete(
\Bitrix\Sale\Shipment $shipment
): \Bitrix\Sale\Delivery\CalculationResult {
$result = new \Bitrix\Sale\Delivery\CalculationResult();
$result->setDeliveryPrice(0);
$result->setPeriodDescription('2–5 дней');
return $result;
}
}
Ограничение по сумме настраивается через стандартный UI. Порог суммы для бесплатной доставки лучше вынести в настройки обработчика — чтобы менять без правки кода.
Бесплатная доставка только для определённых товаров
Задача: доставка бесплатна, если в корзине есть товар из раздела «Акционные» или товар с определённым свойством.
class ConditionalFreeDelivery extends \Bitrix\Sale\Delivery\Services\Base
{
public static function isCompatible(\Bitrix\Sale\Shipment $shipment): bool
{
$basket = $shipment->getOrder()->getBasket();
foreach ($basket as $item) {
$productId = $item->getProductId();
// Проверяем свойство товара FREE_DELIVERY = Y
$props = \CIBlockElement::GetProperty(
$item->getField('MODULE'),
$productId,
[],
['CODE' => 'FREE_DELIVERY']
)->Fetch();
if ($props && $props['VALUE'] === 'Y') {
return true;
}
}
return false;
}
protected function calculateConcrete(
\Bitrix\Sale\Shipment $shipment
): \Bitrix\Sale\Delivery\CalculationResult {
$result = new \Bitrix\Sale\Delivery\CalculationResult();
$result->setDeliveryPrice(0);
return $result;
}
}
Отображение прогресса до бесплатной доставки
В корзине показываем: «До бесплатной доставки осталось 1 230 руб.». Это не фича Битрикс из коробки — реализуется на уровне шаблона компонента корзины.
// В шаблоне компонента
$threshold = 5000; // порог бесплатной доставки
$basketTotal = $APPLICATION->IncludeComponent('bitrix:sale.basket.basket', '', ['GET_BASKET_TOTAL' => 'Y'], false, ['HIDE_ICONS' => 'Y']);
$currentTotal = $GLOBALS['BASKET_TOTAL'] ?? 0;
$remaining = max($threshold - $currentTotal, 0);
if ($remaining > 0) {
echo 'До бесплатной доставки: ' . \CCurrencyLang::CurrencyFormat($remaining, 'RUB');
} else {
echo 'Доставка бесплатна!';
}
Значение $threshold лучше получать из настроек обработчика доставки, а не хардкодить в шаблоне — при изменении порога нужно обновить только одно место.
Кейс
Магазин спортивного питания: бесплатная доставка от 3000 руб. для Москвы и от 5000 руб. для регионов. Стандартными средствами Битрикс это не решается одним обработчиком — разные пороги для разных зон. Решение: два экземпляра FreeDeliveryWrapper с разными настройками порога и ограничениями по зонам.
Сроки
| Состав | Срок |
|---|---|
| Стандартное ограничение по сумме | 0,5 дня |
| + Прогресс-бар «до бесплатной доставки» | +1 день |
| + Условия по товарам или зонам | +1–2 дня |







