Налаштування калькулятора доставки на сайті 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 дні.







