Настройка калькулятора доставки на сайте 1С-Битрикс
Стандартный компонент sale.order.ajax в Битрикс считает доставку только в оформлении заказа. Для отображения стоимости доставки на странице товара, в корзине или на отдельном лендинге нужно либо кастомизировать существующий компонент, либо строить отдельный калькулятор.
Встроенные возможности Битрикс
Битрикс рассчитывает стоимость доставки через \Bitrix\Sale\Delivery\Services\Manager::calculateDeliveries(). Это метод, который принимает объект отправления и возвращает массив рассчитанных служб доставки с ценами.
// Получить все доступные варианты доставки для отправления
$shipment = $order->getShipmentCollection()->createItem();
$shipment->setField('WEIGHT', $weight);
$shipment->setField('PRICE_DELIVERY', 0);
$availableServices = \Bitrix\Sale\Delivery\Services\Manager::getRestrictedObjectsList($shipment);
$calculatedList = [];
foreach ($availableServices as $serviceId => $service) {
$calcResult = $service->calculate($shipment);
if ($calcResult->isSuccess()) {
$calculatedList[$serviceId] = [
'name' => $service->getName(),
'price' => $calcResult->getPrice(),
'days' => $calcResult->getPeriodDescription(),
];
}
}
AJAX-калькулятор на странице корзины
Типовая задача — показывать стоимость доставки при вводе города без перехода к оформлению заказа:
// Контроллер (local/ajax/delivery_calc.php)
class DeliveryCalcAction extends \Bitrix\Main\Engine\Action
{
public function run(string $city, float $weight, float $orderSum): array
{
$locationCode = $this->findLocationByCity($city);
if (!$locationCode) {
return ['error' => 'Город не найден'];
}
$order = \Bitrix\Sale\Order::create(SITE_ID, null);
$order->setPersonTypeId(1);
$order->setField('CURRENCY', \Bitrix\Currency\CurrencyManager::getBaseCurrency());
$basket = \Bitrix\Sale\Basket::create(SITE_ID);
// Добавляем фиктивный товар для расчёта
$basketItem = $basket->createItem('catalog', 0);
$basketItem->setFields([
'QUANTITY' => 1,
'PRICE' => $orderSum,
'WEIGHT' => $weight * 1000, // кг → г
'NAME' => 'Расчёт',
'PRODUCT_PROVIDER_CLASS' => '',
]);
$order->setBasket($basket);
$shipment = $order->getShipmentCollection()->createItem();
$shipment->setField('WEIGHT', $weight * 1000);
// Установить локацию
$propCollection = $order->getPropertyCollection();
$locationProp = $propCollection->getDeliveryLocation();
if ($locationProp) {
$locationProp->setValue($locationCode);
}
$services = \Bitrix\Sale\Delivery\Services\Manager::getRestrictedObjectsList($shipment);
$result = [];
foreach ($services as $service) {
$calc = $service->calculate($shipment);
if ($calc->isSuccess()) {
$result[] = [
'id' => $service->getId(),
'name' => $service->getName(),
'price' => $calc->getPrice(),
'days' => $calc->getPeriodDescription(),
];
}
}
return ['services' => $result];
}
}
Фронтенд посылает AJAX-запрос при изменении города или весе корзины, получает список вариантов и обновляет UI. Результат кэшируется на фронте по ключу city + weight.
Кейс
Интернет-магазин мебели: клиент хотел калькулятор прямо на карточке товара — «введите город, узнайте стоимость доставки». Реализовали виджет с автодополнением города (из справочника Битрикс b_sale_location). При вводе 3+ символов посылается запрос /local/ajax/city_suggest.php, возвращает список подходящих городов. При выборе города — второй запрос с расчётом доставки. Результат сохраняется в localStorage по ключу last_city, при следующем визите поле города заполняется автоматически.
Сроки
| Состав | Срок |
|---|---|
| AJAX-калькулятор + автодополнение города | 2–3 дня |
| + Виджет на карточке товара | +1 день |
+ Кэширование + localStorage |
включено в базовую оценку |







