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

Наша компанія займається розробкою, підтримкою та обслуговуванням рішень на Бітрікс та Бітрікс24 будь-якої складності. Від простих односторінкових сайтів до складних інтернет-магазинів, CRM систем з інтеграцією 1С та телефонії. Досвід розробників підтверджено сертифікатами від вендора.
Пропоновані послуги
Показано 1 з 1 послугУсі 1626 послуг
Налаштування калькулятора доставки на сайті 1С-Бітрікс
Проста
~1 робочий день
Часті питання

Наші компетенції:

Етапи розробки

Останні роботи

  • image_website-b2b-advance_0.png
    Розробка сайту компанії B2B ADVANCE
    1262
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Розробка веб-сайту для компанії ФІКСПЕР
    851
  • 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
    585
  • image_bitrix-bitrix-24-1c_mirsanbel_458_0.webp
    Розробка на базі 1С Підприємство для компанії МИРСАНБЕЛ
    751
  • image_crm_dolbimby_434_0.webp
    Розробка сайту на CRM Бітрікс24 для компанії DOLBIMBY
    657
  • image_crm_technotorgcomplex_453_0.webp
    Розробка на базі Бітрікс24 для компанії ТЕХНОТОРГКОМПЛЕКС
    989

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

Калькулятор доставки — віджет на сторінці товару або в кошику, що дозволяє покупцю ввести адресу/індекс і отримати вартість до оформлення замовлення. Знижує відмови: покупець знає ціну доставки заздалегідь і не кидає кошик на чекауті.

Де розміщувати калькулятор

Картка товару — показує вартість одразу при перегляді. Підходить для великогабаритних або дорогих товарів, де доставка суттєво впливає на рішення про покупку.

Кошик — стандартне місце. Покупець бачить підсумок з доставкою до натискання «Оформити».

Лендинг / акційна сторінка — для промоакцій з безкоштовною доставкою від суми: показуємо «Додайте товарів на X гривень для безкоштовної доставки».

Реалізація на стороні 1С-Бітрікс

Калькулятор працює через AJAX. На фронтенді — поле введення міста/індексу і кнопка. На бекенді — компонент 1С-Бітрікс, який викликає метод розрахунку служби доставки без створення замовлення.

// /local/components/delivery_calculator/class.php
class DeliveryCalculatorComponent extends \CBitrixComponent
{
    public function executeComponent(): void
    {
        if ($this->request->isAjaxRequest()) {
            $this->ajaxAction();
            return;
        }
        $this->includeComponentTemplate();
    }

    private function ajaxAction(): void
    {
        $city    = $this->request->getPost('city');
        $weight  = (int)$this->request->getPost('weight');
        $amount  = (float)$this->request->getPost('amount');

        $results = [];
        $services = $this->getActiveDeliveryServices();

        foreach ($services as $service) {
            $price = $this->calcServicePrice($service, $city, $weight, $amount);
            if ($price !== null) {
                $results[] = [
                    'name'   => $service->getName(),
                    'price'  => $price,
                    'period' => $service->getPeriodText(),
                ];
            }
        }

        \Bitrix\Main\Application::getInstance()->getContext()
            ->getResponse()->setContentType('application/json');
        echo json_encode(['items' => $results]);
        die();
    }
}

Стандартний механізм розрахунку 1С-Бітрікс

Виклик розрахунку вартості для конкретної служби без реального замовлення:

private function calcServicePrice(
    \Bitrix\Sale\Delivery\Services\Base $service,
    string $city,
    int $weight,
    float $amount
): ?float {
    // Створюємо тимчасовий об'єкт відправки для розрахунку
    $fakePropValues = ['CITY' => $city];
    $calcResult = $service->calculate(
        new \Bitrix\Sale\Delivery\CalculationResult(),
        $fakePropValues,
        $weight,
        $amount
    );

    if ($calcResult->isSuccess()) {
        return $calcResult->getPrice();
    }
    return null;
}

Для більш точного розрахунку створюємо тимчасовий об'єкт \Bitrix\Sale\Shipment через заглушковий заказ — це дозволяє використовувати повноцінний метод calculateConcrete() кожної служби.

Кешування результатів

Розрахунки вартості — це API-запити до зовнішніх служб. Кешуємо на 15–30 хвилин:

$cacheKey = 'delivery_calc_' . md5($city . $weight . $amount);
$cached = \Bitrix\Main\Data\Cache::createInstance();
if ($cached->startDataCache(1800, $cacheKey, '/delivery_calc')) {
    $results = $this->fetchPrices($city, $weight, $amount);
    $cached->endDataCache(['results' => $results]);
}
$results = $cached->getVars()['results'];

Без кешу кожне введення міста в поле робить запит до API СДЕК або Boxberry — це і затримка інтерфейсу, і витрата квоти.

Автозаповнення міста

Для зручності додаємо autocomplete з підказками міст. Джерело підказок — або власний список великих міст у JSON, або API геосервісу (Яндекс Geocoder, DaData).

const cityInput = document.getElementById('delivery_city');
cityInput.addEventListener('input', debounce(function() {
    fetch('/bitrix/services/main/ajax.php?action=delivery_city_suggest', {
        method: 'POST',
        body: new FormData(this.closest('form')),
    })
    .then(r => r.json())
    .then(data => showSuggestions(data.cities));
}, 300));

Функція debounce із затримкою 300 мс запобігає запиту при кожному натисканні клавіші — тільки після паузи у введенні.

Оновлення вартості в кошику без перезавантаження

При використанні калькулятора в кошику вартість підсумку повинна оновлюватися динамічно. У 1С-Бітрікс це реалізується через механізм ajax_reload у параметрах компонента bitrix:sale.basket.basket або через кастомну AJAX-логіку:

function recalcDelivery(city) {
    fetch('/bitrix/services/main/ajax.php', {
        method: 'POST',
        body: JSON.stringify({ action: 'calc_delivery', city, weight: cartWeight }),
        headers: { 'Content-Type': 'application/json' },
    })
    .then(r => r.json())
    .then(data => {
        document.getElementById('delivery-price').textContent = data.price + ' ₽';
        document.getElementById('total-price').textContent = (cartAmount + data.price) + ' ₽';
    });
}

Відображення кількох варіантів доставки

Калькулятор у кошику показує одразу всі доступні варіанти: «СДЕК — 350 ₽, 3 дні», «Пошта Росії — 180 ₽, 7 днів», «Самовивіз — 0 ₽». Покупець обирає потрібний — ціна підсумку оновлюється. Вибраний спосіб передається на наступний крок оформлення замовлення через приховане поле DELIVERY_ID.

Терміни виконання

Налаштування калькулятора доставки з AJAX-запитом і кешуванням — 2–3 робочі дні. З автозаповненням міста, динамічним оновленням підсумку кошика та інтеграцією кількох служб — 3–4 дні.