corsik corsik

Примеры использования

В этом разделе собраны пошаговые сценарии настройки модуля под типовые задачи интернет-магазина. Каждый кейс начинается с самого простого штатного варианта и при необходимости дополняется более гибкими решениями.


Кейс: разная стоимость доставки для физических и юридических лиц

Постановка задачи. На сайте есть два способа оформления заказа — как физическое лицо и как юридическое лицо. Нужно, чтобы при доставке в одну и ту же географическую зону стоимость для физлиц и юрлиц отличалась.

Решить задачу можно тремя способами — от самого простого (без программирования) к самому гибкому. Рекомендуем начать со Способа 2 — он закрывает задачу целиком штатными средствами модуля и Битрикса.


Способ 1. Базовая фиксированная цена по зонам

Подходит, если разделять цены по типу плательщика не требуется — все клиенты получают одинаковую стоимость в рамках одной зоны.

Фиксированная стоимость доставки для каждой зоны — это штатный функционал модуля.

  1. Перейдите в раздел Сервис → Расчёт стоимости доставки по зонам → Склады и откройте нужный склад.
  2. Перейдите на вкладку «Настройка стоимости доставки».
  3. Для каждой связки Склад → Зона укажите фиксированную цену в поле «Цена, руб.».
  4. (Опционально) Привяжите к строке правило доставки — например, бесплатная доставка от суммы заказа.

Подсказка

Подробное описание полей и интерфейса — в разделе Склады → Настройка стоимости доставки. Правила доставки описаны в разделе Правила доставки.


Способ 2. Отдельные профили доставки для физлиц и юрлиц (рекомендуется)

Это штатный сценарий вашей задачи. Битрикс сам подставит покупателю нужный профиль с нужными ценами в зависимости от выбранного типа плательщика — никакой код на стороне сайта писать не нужно.

В основе подхода — особенность модуля: зоны существуют в контексте одного профиля службы доставки. То есть каждой записи с зонами (своей «карте») соответствует свой профиль доставки. Это значит, что для физлиц и юрлиц можно создать две независимые карты с разными ценами, а Битрикс сам выберет нужную по типу плательщика.

Пошаговая инструкция

  1. Создайте две записи с зонами доставки.

    Перейдите в Сервис → Расчёт стоимости доставки по зонам → Зоны доставки и создайте две записи — например, «Карта для физлиц» и «Карта для юрлиц». Границы зон могут совпадать, но это две независимые сущности (см. Зоны доставки).

  2. Задайте свои цены для каждой карты в настройках складов.

    В разделе Склады на вкладке «Настройка стоимости доставки» укажите свои цены для каждой связки Склад → Зона — отдельно для зон физлиц и отдельно для зон юрлиц (см. Склады).

  3. Создайте два профиля доставки.

    Перейдите в Магазин → Службы доставки и откройте службу «Расчёт стоимости доставки по зонам с подсказками от DaData». На вкладке «Профиль» создайте два профиля — например, «Доставка для физлиц» и «Доставка для юрлиц». Каждый профиль будет работать со своей записью с зонами (см. Службы доставки).

  4. Ограничьте каждый профиль по типу плательщика.

    В стандартных настройках Битрикса (на странице профиля доставки) задайте ограничение по типу плательщика: для профиля «Доставка для физлиц» — физическое лицо, для «Доставка для юрлиц» — юридическое лицо.

После этого при оформлении заказа Битрикс автоматически покажет покупателю только тот профиль доставки, который соответствует выбранному типу плательщика, и расчёт стоимости пойдёт по соответствующей карте с нужными ценами.

Заметка

Если на сайте используется компонент калькулятора стоимости 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). Подробнее — в разделе Компонент «Калькулятор доставки».