Примеры использования
В этом разделе собраны пошаговые сценарии настройки модуля под типовые задачи интернет-магазина. Каждый кейс начинается с самого простого штатного варианта и при необходимости дополняется более гибкими решениями.
Кейс: разная стоимость доставки для физических и юридических лиц
Постановка задачи. На сайте есть два способа оформления заказа — как физическое лицо и как юридическое лицо. Нужно, чтобы при доставке в одну и ту же географическую зону стоимость для физлиц и юрлиц отличалась.
Решить задачу можно тремя способами — от самого простого (без программирования) к самому гибкому. Рекомендуем начать со Способа 2 — он закрывает задачу целиком штатными средствами модуля и Битрикса.
Способ 1. Базовая фиксированная цена по зонам
Подходит, если разделять цены по типу плательщика не требуется — все клиенты получают одинаковую стоимость в рамках одной зоны.
Фиксированная стоимость доставки для каждой зоны — это штатный функционал модуля.
- Перейдите в раздел Сервис → Расчёт стоимости доставки по зонам → Склады и откройте нужный склад.
- Перейдите на вкладку «Настройка стоимости доставки».
- Для каждой связки Склад → Зона укажите фиксированную цену в поле «Цена, руб.».
- (Опционально) Привяжите к строке правило доставки — например, бесплатная доставка от суммы заказа.
Подсказка
Подробное описание полей и интерфейса — в разделе Склады → Настройка стоимости доставки. Правила доставки описаны в разделе Правила доставки.
Способ 2. Отдельные профили доставки для физлиц и юрлиц (рекомендуется)
Это штатный сценарий вашей задачи. Битрикс сам подставит покупателю нужный профиль с нужными ценами в зависимости от выбранного типа плательщика — никакой код на стороне сайта писать не нужно.
В основе подхода — особенность модуля: зоны существуют в контексте одного профиля службы доставки. То есть каждой записи с зонами (своей «карте») соответствует свой профиль доставки. Это значит, что для физлиц и юрлиц можно создать две независимые карты с разными ценами, а Битрикс сам выберет нужную по типу плательщика.
Пошаговая инструкция
-
Создайте две записи с зонами доставки.
Перейдите в Сервис → Расчёт стоимости доставки по зонам → Зоны доставки и создайте две записи — например, «Карта для физлиц» и «Карта для юрлиц». Границы зон могут совпадать, но это две независимые сущности (см. Зоны доставки).
-
Задайте свои цены для каждой карты в настройках складов.
В разделе Склады на вкладке «Настройка стоимости доставки» укажите свои цены для каждой связки Склад → Зона — отдельно для зон физлиц и отдельно для зон юрлиц (см. Склады).
-
Создайте два профиля доставки.
Перейдите в Магазин → Службы доставки и откройте службу «Расчёт стоимости доставки по зонам с подсказками от DaData». На вкладке «Профиль» создайте два профиля — например, «Доставка для физлиц» и «Доставка для юрлиц». Каждый профиль будет работать со своей записью с зонами (см. Службы доставки).
-
Ограничьте каждый профиль по типу плательщика.
В стандартных настройках Битрикса (на странице профиля доставки) задайте ограничение по типу плательщика: для профиля «Доставка для физлиц» — физическое лицо, для «Доставка для юрлиц» — юридическое лицо.
После этого при оформлении заказа Битрикс автоматически покажет покупателю только тот профиль доставки, который соответствует выбранному типу плательщика, и расчёт стоимости пойдёт по соответствующей карте с нужными ценами.
Заметка
Если на сайте используется компонент калькулятора стоимости corsik:yadelivery.map, передайте нужный тип плательщика через параметр «Тип плательщика» (PERSON_TYPE) — компонент посчитает стоимость по соответствующему профилю.
Подсказка
Дублировать карты вручную и «переключать» их со стороны сайта не нужно — этим занимается стандартный механизм профилей доставки Битрикса.
Схема работы
┌─────────────────────────┐ ┌──────────────────────────┐
│ Покупатель в оформлении│ │ Покупатель в оформлении │
│ заказа выбирает: │ │ заказа выбирает: │
│ «Физическое лицо» │ │ «Юридическое лицо» │
└────────────┬────────────┘ └──────────────┬───────────┘
│ │
▼ ▼
┌──────────────────┐ ┌──────────────────┐
│ Профиль доставки │ │ Профиль доставки │
│ «Для физлиц» │ │ «Для юрлиц» │
└────────┬─────────┘ └────────┬─────────┘
│ │
▼ ▼
┌──────────────────┐ ┌──────────────────┐
│ Карта зон │ │ Карта зон │
│ «Для физлиц» │ │ «Для юрлиц» │
│ + цены по зонам │ │ + цены по зонам │
└──────────────────┘ └──────────────────┘
Способ 3. Программное переопределение цены через события модуля
Подходит, если по каким-то причинам не получается использовать профили (например, нужно сохранить один профиль и одну карту, но цена зависит от сложной логики — индивидуальные договоры, акции, тип товара в корзине и т.д.).
Цену можно переопределить программно через событие OnYandexAfterCalculatePrice. В обработчик приходят: идентификатор зоны ($data['delivery']['stop']), сумма и вес заказа, расстояние и тип расчёта in/out. Тип плательщика берётся из текущего заказа Битрикса.
use Bitrix\Main\EventManager;
EventManager::getInstance()->addEventHandler(
"corsik.yadelivery",
"OnYandexAfterCalculatePrice",
'onAfterCalculatePriceByPersonType'
);
function onAfterCalculatePriceByPersonType(&$price, $data, &$params)
{
if ($data['type'] !== 'in') {
return;
}
// Определите тип плательщика текущего заказа из вашего контекста
// (например, из $_SESSION, свойства заказа или из объекта \Bitrix\Sale\Order)
$personTypeId = (int)getCurrentPersonTypeId(); // 1 — физлицо, 2 — юрлицо
// Таблица цен: зона → цена для физлица / юрлица
$prices = [
'do-10-km-ot-mkad' => ['fiz' => 300, 'ur' => 450],
'10-20-km-ot-mkad' => ['fiz' => 500, 'ur' => 700],
];
$zone = $data['delivery']['stop'];
if (isset($prices[$zone])) {
$price = $personTypeId === 2
? $prices[$zone]['ur']
: $prices[$zone]['fiz'];
}
}
Внимание
Программный способ менее прозрачен в поддержке — изменение цен потребует правки кода, а не настроек в админке. Используйте его только тогда, когда штатных средств действительно недостаточно.
Полный список событий и их параметры — в разделе Для разработчиков.
Что выбрать
| Задача | Рекомендуемый способ |
|---|---|
| Одинаковая цена для всех клиентов, фиксированная по зонам | Способ 1 — настройки склада |
| Разная цена для физлиц и юрлиц на одни и те же зоны | Способ 2 — отдельные профили доставки |
| Сложная логика: индивидуальные клиенты, договоры, состав корзины и т.д. | Способ 3 — событие OnYandexAfterCalculatePrice |
Часто задаваемые вопросы (FAQ)
- Вопрос: Нужно ли создавать две одинаковые карты зон руками и переключать их со стороны сайта?
- Ответ: Нет. Достаточно создать две независимые записи с зонами и привязать каждую к своему профилю доставки с ограничением по типу плательщика — Битрикс сам выберет нужный профиль.
- Вопрос: Если границы зон у физлиц и юрлиц совпадают, можно ли использовать одну карту?
- Ответ: Технически — да, но тогда штатно задать разные цены не получится: цена привязывается к связке «Склад → Зона» внутри одного профиля. Если границы действительно полностью совпадают и разница только в цене, используйте Способ 3 (программное переопределение).
- Вопрос: Как передать тип плательщика в калькулятор доставки
corsik:yadelivery.map?- Ответ: Через параметр компонента «Тип плательщика» (
PERSON_TYPE). Подробнее — в разделе Компонент «Калькулятор доставки».