Настройка розрахунку вартості доставки на 1С-Bitrix
Розрахунок вартості доставки в Bitrix працює через модуль sale. Служба доставки — це PHP-клас, успадкований від \Bitrix\Sale\Delivery\Services\Base, що реалізує метод calculateConcrete(). Все, що робить Bitrix при оформленні замовлення — викликає цей метод та очікує об'єкт CalculationResult з ціною та строком.
Варіанти розрахунку
Фіксована ціна. Настроюється в адміністративній частині без коду: у властивостях служби доставки вказується фіксована сума. Підходить для «доставка 300 рублів по Москві».
За тарифними сітками. Ціна залежить від ваги та/або суми замовлення. В адміністративній панелі: Магазин → Служби доставки → таблиця тарифів. Таблиця зберігається в b_sale_delivery_zone_rate.
За місцезнаходженням (локаціями). Bitrix підтримує привязку тарифу до місцезнаходження (модуль 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 рублів. Bitrix підсумовує вагу всіх товарів у кошику через $shipment->getParcelCollection() і застосовує відповідну строку тарифу.
Нюанс: вага товару береться з поля WEIGHT елемента інфоблока каталога. Якщо вага не заповнена — розрахунок за вагою дає 0. Перед настройкою тарифів перевіряємо заповненість ваг у каталозі.
Безплатна доставка від суми
Реалізується двома способами:
- Створити окрему службу «Безплатна доставка» і обмежити її мінімальною сумою замовлення в параметрі
MIN_ORDER_PRICE. - У
calculateConcrete()користувацької служби перевіряти суму замовлення та повертати0при перевищенні порогу.
Перший варіант — через стандартний UI, другий — якщо потрібна додаткова логіка (різні пороги для різних регіонів, виключення певних категорій товарів і т.д.).
Розрахунок з урахуванням габаритів (об'ємна вага)
Логістичні компанії часто рахують за об'ємною вагою: (довжина × ширина × висота) / 5000 (коефіцієнт залежить від перевозника). Стандартний механізм Bitrix об'ємну вагу не враховує — додаємо в calculateConcrete():
$dimensionWeight = ($length * $width * $height) / 5000;
$chargeableWeight = max($actualWeightKg, $dimensionWeight);
Розміри беремо з властивостей товара (b_iblock_element_prop) або з полів товарного пропозиції.
Відладка розрахунку
При неправильній вартості доставки зручно включити вивід відладочної інформації: у calculateConcrete() логуємо вхідні параметри (вага, сума, регіон) у файл або AddMessage2Log(). Дивимось, які дані реально приходять у метод.
Частісті причини неправильного розрахунку:
- Вага товарів не заповнена в каталозі
- Регіон покупця не визначається (властивість замовлення
LOCATIONне заповнена) - Кілька служб доставки з перекриваючимися тарифними зонами







