Настройка калькулятора доставки на сайте 1С-Битрикс

Наша компания занимается разработкой, поддержкой и обслуживанием решений на Битрикс и Битрикс24 любой сложности. От простых одностраничных сайтов до сложных интернет магазинов, CRM систем с интеграцией 1С и телефонии. Опыт разработчиков подтвержден сертификатами от вендора.
Предлагаемые услуги
Показано 1 из 1 услугВсе 1626 услуг
Настройка калькулятора доставки на сайте 1С-Битрикс
Простая
~1 рабочий день
Часто задаваемые вопросы
Наши компетенции:
Этапы разработки
Последние работы
  • image_website-b2b-advance_0.png
    Разработка сайта компании B2B ADVANCE
    1230
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Разработка веб-сайта для компании ФИКСПЕР
    843
  • image_bitrix-bitrix-24-1c_development_of_an_online_appointment_booking_widget_for_a_medical_center_594_0.webp
    Разработка на базе Битрикс, Битрикс24, 1С для компании Development of an Online Appointment Booking Widget for a Medical Center
    580
  • image_bitrix-bitrix-24-1c_mirsanbel_458_0.webp
    Разработка на базе 1С Предприятие для компании МИРСАНБЕЛ
    749
  • image_crm_dolbimby_434_0.webp
    Разработка сайта на CRM Битрикс24 для компании DOLBIMBY
    657
  • image_crm_technotorgcomplex_453_0.webp
    Разработка на базе Битрикс24 для компании ТЕХНОТОРГКОМПЛЕКС
    980

Настройка калькулятора доставки на сайте 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 включено в базовую оценку