Настройка расчёта стоимости доставки на 1С-Битрикс
Расчёт стоимости доставки в Битрикс работает через модуль sale. Служба доставки — это PHP-класс, унаследованный от \Bitrix\Sale\Delivery\Services\Base, который реализует метод calculateConcrete(). Всё, что делает Битрикс при оформлении заказа — вызывает этот метод и ожидает объект CalculationResult с ценой и сроком.
Варианты расчёта
Фиксированная цена. Настраивается в административной части без кода: в свойствах службы доставки указывается фиксированная сумма. Подходит для «доставка 300 рублей по Москве».
По тарифным сеткам. Цена зависит от веса и/или суммы заказа. В административной панели: Магазин → Службы доставки → таблица тарифов. Таблица хранится в b_sale_delivery_zone_rate.
По местоположению (локациям). Битрикс поддерживает привязку тарифа к местоположению (модуль sale.location). В b_sale_location хранится дерево регионов. Тариф привязывается к узлу дерева — автоматически применяется ко всем дочерним населённым пунктам.
Расчёт через внешний API. Запрос к API службы доставки в реальном времени. СДЭК, Boxberry, DHL и другие — каждый имеет свой обработчик. Описание конкретных интеграций — в отдельных статьях.
Ключевые настройки в административной части
В разделе Интернет-магазин → Службы доставки для каждой службы доступны:
| Параметр | Где в базе | Что делает |
|---|---|---|
| Режим расчёта (фиксированный/по весу/по цене) | b_sale_delivery_service |
Переключает алгоритм calculateConcrete |
| Тарифные ставки | b_sale_delivery_zone_rate |
Таблица «вес/сумма → стоимость» |
| Ограничения веса и суммы | b_sale_delivery_service_params |
При превышении служба не отображается |
| Привязка к локациям | b_sale_delivery_service_lang |
Для каких регионов доступна |
| Наценка и скидка | b_sale_delivery_service_params |
Процент или сумма поверх расчёта |
Расчёт по весу
Самый распространённый сценарий. В модуле настраивается таблица: вес до X кг → стоимость Y рублей. Битрикс суммирует вес всех товаров в корзине через $shipment->getParcelCollection() и применяет подходящую строку тарифа.
Нюанс: вес товара берётся из поля WEIGHT элемента инфоблока каталога. Если вес не заполнен — расчёт по весу даёт 0. Перед настройкой тарифов проверяем заполненность весов в каталоге.
Бесплатная доставка от суммы
Реализуется двумя способами:
- Создать отдельную службу «Бесплатная доставка» и ограничить её минимальной суммой заказа в параметре
MIN_ORDER_PRICE. - В
calculateConcrete()кастомной службы проверять сумму заказа и возвращать0при превышении порога.
Первый вариант — через стандартный UI, второй — если нужна дополнительная логика (разные пороги для разных регионов, исключение определённых категорий товаров и т.д.).
Расчёт с учётом габаритов (объёмный вес)
Логистические компании часто считают по объёмному весу: (длина × ширина × высота) / 5000 (коэффициент зависит от перевозчика). Стандартный механизм Битрикс объёмный вес не учитывает — добавляем в calculateConcrete():
$dimensionWeight = ($length * $width * $height) / 5000;
$chargeableWeight = max($actualWeightKg, $dimensionWeight);
Размеры берём из свойств товара (b_iblock_element_prop) или из полей товарного предложения.
Отладка расчёта
При неверной стоимости доставки удобно включить вывод отладочной информации: в calculateConcrete() логируем входящие параметры (вес, сумма, регион) в файл или AddMessage2Log(). Смотрим, какие данные реально приходят в метод.
Частые причины неверного расчёта:
- Вес товаров не заполнен в каталоге
- Регион покупателя не определяется (свойство заказа
LOCATIONне заполнено) - Несколько служб доставки с перекрывающимися тарифными зонами







