Стоимость доставки в 1С-Битрикс считается не в одном месте, а в связке служб доставки, ограничений, зон и калькуляторов перевозчиков. Чтобы цифра совпадала на сайте и в CRM, важно понимать, откуда она берётся и как её кэшируют.
Как устроен расчёт в модуле продаж
Расчёт стоимости живёт в модуле sale и опирается на объект службы доставки (\Bitrix\Sale\Delivery\Services\Base). Каждая служба реализует метод calculate(), который возвращает \Bitrix\Sale\Delivery\CalculationResult с ценой, сроком и валютой. Список служб настраивается в Магазин → Настройки → Службы доставки (страница sale_delivery.php).
Есть два типа служб: группы (папки-обёртки) и профили — конкретные тарифы. Именно профиль отдаёт цену. Для фиксированных тарифов используется настраиваемая служба, для внешних перевозчиков — обработчик, который дергает API и возвращает расчёт.
- Фиксированная цена — простое число или правила по сумме заказа.
- По весу/сумме — таблица диапазонов внутри профиля.
- Внешний калькулятор — модуль перевозчика (СДЭК, Boxberry, Почта России) обращается к его API.
Какие данные нужны для корректной цены
Любой калькулятор перевозчика требует минимум три параметра: вес, габариты и точку назначения. Если их нет, цена либо не считается, либо возвращается по умолчанию.
| Параметр | Откуда берётся | Где задать |
|---|---|---|
| Вес | Свойство товара «Вес» | Карточка товара, вкладка каталога |
| Габариты | Свойства ширина/высота/длина | Товар или настройки службы (по умолчанию) |
| Локация | Свойство заказа типа «Местоположение» | Свойства заказа + привязка к КЛАДР |
| Объявленная ценность | Сумма корзины | Рассчитывается автоматически |
Зоны доставки и ограничения
Чтобы служба показывалась только там, где реально работает, используются ограничения (\Bitrix\Sale\Delivery\Restrictions). Их настраивают на вкладке «Ограничения» профиля.
- По местоположению — привязка к зонам доставки (группам локаций).
- По весу и сумме — например, курьер только до 30 кг.
- По способу оплаты — наложенный платёж не для всех служб.
Зоны доставки создаются в Магазин → Настройки → Местоположения → Зоны доставки. Одна зона может объединять несколько регионов, и к ней привязывается фиксированный тариф. Для перевозчиков с собственным калькулятором зоны обычно не нужны — API само знает географию по коду города.
Расчёт в CRM и на стороне менеджера
Когда заказ создаётся или редактируется менеджером в админке (Магазин → Заказы) или в CRM Битрикс24, работает тот же движок: выбирается служба, подставляются вес и локация, вызывается calculate(). Разница в источнике данных — менеджер вводит адрес вручную, и здесь легко получить расхождение с сайтом.
- На сайте локация приходит из компонента
sale.order.ajaxи обычно точнее. - В CRM менеджер может выбрать «город» без привязки к КЛАДР — калькулятор перевозчика его не распознает.
- Ручная правка цены доставки в заказе перекрывает автоматический расчёт — это нормальный сценарий для нестандартных отправлений.
Кэш, наценки и производительность
Обращение к API перевозчика на каждый чих замедляет корзину, поэтому результаты расчёта кэшируются. Многие модули хранят ответ калькулятора на несколько минут по ключу «служба + вес + город». Это ускоряет оформление, но иногда прячет свежие тарифы.
Наценку к цене доставки удобно вешать не в коде перевозчика, а поверх — через обработчик события OnSaleDeliveryCalculate или наценкой профиля. Так проще менять маржу, не трогая интеграцию.
| Приём | Зачем | |
|---|---|---|
| Кэш расчёта | Снизить нагрузку и число запросов к API | |
| Наценка профиля | Заложить упаковку и обработку | |
| Fallback-тариф | Показать цену, если API недоступно |
Обязательно закладывайте fallback: если API перевозчика не ответило, покупатель должен видеть хотя бы усреднённую цену, а не пустой блок доставки.
Отладка расхождений цены
Чаще всего «на сайте одно, в CRM другое» — это не баг движка, а разные входные данные. Проверяйте по цепочке.
- Совпадает ли вес заказа в корзине и в карточке заказа.
- Одинаковый ли город и есть ли у него код КЛАДР/город перевозчика.
- Не сработало ли ограничение, скрывшее выгодный тариф.
- Не отдаёт ли кэш устаревший ответ — сбросьте его.
Логи модулей перевозчиков обычно пишутся в их настройках или в bitrix/modules/*/log. Включайте детальное логирование запросов к API на время диагностики — там видно, какой вес и город реально ушли в расчёт.
Итог
Единая цена доставки — результат аккуратной настройки: корректный вес и габариты из каталога, точная локация с привязкой к КЛАДР, продуманные зоны и ограничения, разумный кэш и обязательный fallback. Тогда цифра совпадает и в корзине, и в сделке CRM.
Мы в B2Bsite настраиваем расчёт так, чтобы он был предсказуемым на всех этапах — от витрины до выгрузки заказа в учётную систему. Подключаем калькуляторы перевозчиков, синхронизируем данные с CRM и закрываем частые причины расхождений цены.
Частые вопросы
Почему доставка на сайте бесплатная, а должна считаться?
Скорее всего, у товаров не заполнен вес или не выбрана локация, и калькулятор возвращает нулевой либо тариф по умолчанию. Проверьте свойство веса и привязку города к КЛАДР.
Можно ли показывать несколько служб с ценами сразу?
Да, все подходящие профили выводятся списком на шаге доставки. Каждый считает свою цену через собственный calculate(), покупатель выбирает подходящий.
Как заложить наценку на упаковку?
Удобнее всего добавить наценку на уровне профиля службы или через обработчик события расчёта, а не внутри модуля перевозчика. Так проще менять сумму.
Почему в CRM цена отличается от сайта?
Обычно из-за разных исходных данных: менеджер ввёл город без кода КЛАДР или изменился вес заказа. Движок расчёта один, различаются входные параметры.
Что показывать, если API перевозчика не отвечает?
Нужен запасной фиксированный тариф или усреднённая цена, чтобы блок доставки не был пустым. Это закладывается как fallback в логике службы.
Кэшируется ли расчёт доставки?
Да, большинство модулей кэшируют ответ калькулятора на несколько минут по ключу службы, веса и города. При тестах тарифов кэш стоит сбрасывать.
Где хранится вес товара для расчёта?
В свойстве каталога «Вес» у товара или торгового предложения. Оно должно корректно приходить из 1С при обмене, иначе расчёт будет неточным.
Можно ли зафиксировать согласованную с клиентом цену?
Да, ручная цена доставки в заказе перекрывает автоматический расчёт. Но следите, чтобы пересчёт состава заказа её не затёр.
Поможем с настройкой и поддержкой Интеграции и связки систем
Поможем с настройкой, доработкой и поддержкой Интеграции и связки систем.