Выбор ПВЗ на карте — это связка обработчика службы доставки, справочника пунктов и клиентского виджета в оформлении заказа. В 1С-Битрикс за это отвечает не одна галочка, а несколько согласованных механизмов, и если понимать, как они устроены, интеграция карты перестаёт быть чёрным ящиком.
Как устроен выбор ПВЗ в Битрикс
С точки зрения платформы пункт выдачи — это дополнительный параметр заказа, который служба доставки требует заполнить перед расчётом или оформлением. Технически всё держится на трёх слоях. Первый — обработчик службы доставки (класс-наследник Bitrix\Sale\Delivery\Services\Base), который сообщает системе, что для этого способа нужен профиль ПВЗ. Второй — хранилище точек: собственный справочник (highload-блок или инфоблок) либо данные, которые приходят от API перевозчика. Третий — виджет в компоненте оформления заказа sale.order.ajax, который рисует карту и записывает выбранную точку в свойство заказа.
Ключевая деталь: у службы доставки должно быть выставлено требование getRequiredInputProfilesList() с профилем terminal либо своя реализация, которая помечает доставку как «до пункта». Именно этот флаг заставляет чекаут показать блок выбора ПВЗ, а не адресную форму.
Откуда берутся точки: справочник и API
Есть два подхода к источнику данных, и выбор между ними определяет всю дальнейшую работу.
- Локальный справочник. Точки хранятся в highload-блоке (например,
PvzPoints) с полямиUF_CODE,UF_CITY,UF_ADDRESS,UF_LAT,UF_LON,UF_SCHEDULE. Данные обновляются по агенту или черезcronиз выгрузки перевозчика. Плюс — быстрый отклик карты и независимость от доступности чужого API в момент оформления. - Онлайн через API. Список ПВЗ запрашивается напрямую у СДЭК, Boxberry, 5Post и т. п. по городу. Плюс — всегда актуальные адреса и режимы работы; минус — задержки и необходимость кэшировать ответы.
На практике устойчивее гибрид: раз в сутки заливаем полный реестр в highload-блок, а онлайн проверяем только доступность конкретной точки на момент оформления. Для highload-блока не забудьте про индекс по UF_CITY и UF_LOCATION — иначе выборка по городу будет ощутимо тормозить на больших реестрах.
Карта на оформлении заказа
Визуальный выбор точки живёт в шаблоне компонента sale.order.ajax. Стандартной интерактивной карты «из коробки» под произвольного перевозчика нет — её добавляют в кастомизированный шаблон. Обычно берут Яндекс.Карты (JS API) или готовый виджет перевозчика (у СДЭК и Boxberry есть свои embed-скрипты).
Логика такая: при смене доставки на «до ПВЗ» скрипт запрашивает список точек по выбранному местоположению заказа (значение свойства LOCATION), расставляет метки на карте, а по клику на метку — сохраняет код пункта в скрытое свойство заказа и триггерит пересчёт корзины через BX.Sale.OrderAjaxComponent.
PVZ_CODE) должно быть привязано к нужной службе доставки и участвовать в передаче в 1С и перевозчику. Без сохранённого кода заказ уйдёт без точки, и логист будет уточнять адрес вручную.Связь с местоположением и фильтрация
Карта не должна показывать все пункты страны сразу — это и медленно, и бессмысленно. Точки фильтруются по городу из свойства заказа. В Битрикс за адрес отвечает система местоположений (sale.location), поэтому в справочнике ПВЗ удобно хранить не текстовый город, а код местоположения или его связь с кодом города перевозчика.
Типовая ошибка — рассинхрон справочников: у Битрикс своя иерархия местоположений, у перевозчика — свои коды городов (у СДЭК это city_code). Нужна таблица соответствий. Порядок работы виджета:
- Пользователь выбирает город в оформлении заказа.
- По коду местоположения находим соответствующий код города перевозчика.
- Запрашиваем точки этого города из highload-блока или API.
- Отрисовываем метки и центрируем карту по границам выборки.
Если для города нет ни одной точки, корректнее скрыть способ доставки через ограничения службы (Bitrix\Sale\Delivery\Restrictions), чем показывать пустую карту.
Передача выбранного пункта дальше
Выбранный ПВЗ важен не только для покупателя — он должен дойти до склада, до 1С и до перевозчика. Проверьте всю цепочку.
| Куда передаётся | Что именно | Механизм |
|---|---|---|
| В 1С | Код и адрес пункта | Свойство заказа в обмене commerceml |
| Перевозчику | Код терминала (pvz_code) | API создания отправления |
| В письмо клиенту | Адрес и режим работы | Почтовый шаблон заказа |
Отдельно проследите, чтобы значение свойства сохранялось при пересчёте корзины. Битрикс при каждом refreshOrderAjax пересобирает данные, и незакреплённое свойство легко «слетает». Записывайте код в постоянное свойство заказа, а не в сессию.
Отладка типовых проблем
Чаще всего сбои повторяются от проекта к проекту. Короткий чек-лист.
- Карта не появляется. Проверьте, что служба доставки помечена как «до пункта» и её профиль требует ввода терминала; без этого чекаут не покажет блок.
- Точки не грузятся. Смотрите ответ AJAX в консоли и логах: чаще всего нет соответствия кода местоположения коду города перевозчика.
- Пункт не сохраняется в заказ. Свойство не привязано к службе доставки или теряется при пересчёте корзины.
- Стоимость не пересчитывается. После выбора точки не вызывается пересчёт — добавьте триггер обновления в обработчик клика по метке.
Итог
Рабочий выбор ПВЗ на карте в 1С-Битрикс — это согласованные обработчик службы доставки, справочник точек с корректной привязкой к местоположениям и виджет карты в оформлении заказа, надёжно записывающий код пункта в заказ. Каждый слой проверяется отдельно: показ блока, загрузка точек, сохранение и передача дальше в 1С и перевозчику. Когда цепочка выстроена, покупатель выбирает точку в два клика, а логист получает готовый код терминала без ручных уточнений.
Если нужно подключить карту ПВЗ под конкретного перевозчика, наладить обмен точками с 1С или ускорить тяжёлый чекаут — мы проектируем и внедряем такие связки на 1С-Битрикс под ключ и берём проект на дальнейшее сопровождение.
Частые вопросы
Есть ли выбор ПВЗ на карте в Битрикс из коробки?
Механизм служб доставки «до пункта» есть, но универсальной интерактивной карты под произвольного перевозчика нет. Карту добавляют в кастомизированный шаблон оформления заказа, используя JS API карт или виджет самого перевозчика.
Где хранить список пунктов выдачи?
Оптимально — в highload-блоке с полями кода, города, адреса и координат, обновляемом из выгрузки перевозчика. Онлайн-запросы к API стоит применять для проверки актуальности конкретной точки, а не для загрузки всего списка при каждом оформлении.
Почему карта не показывается в оформлении заказа?
Обычно служба доставки не помечена как доставка до пункта, и её профиль не требует выбора терминала. Проверьте настройку обработчика службы и требование ввода профиля ПВЗ.
Как связать город заказа с точками перевозчика?
Через таблицу соответствий между системой местоположений Битрикс и кодами городов перевозчика. По коду местоположения находится код города, и уже по нему запрашиваются точки этого населённого пункта.
Куда сохраняется выбранный пункт?
В свойство заказа, привязанное к нужной службе доставки. Важно записывать код в постоянное свойство, а не в сессию, иначе значение теряется при пересчёте корзины.
Как передать выбранный ПВЗ в 1С и перевозчику?
Код и адрес пункта передаются в 1С через обмен заказами, а код терминала уходит перевозчику при создании отправления через его API. Проверьте, что свойство заказа включено в обмен и в вызов API.
Что делать, если в городе нет ни одного пункта?
Корректнее скрыть способ доставки через ограничения службы доставки, чем показывать покупателю пустую карту. Так пользователь сразу видит только реально доступные варианты.
Какую карту лучше использовать для виджета?
Часто берут Яндекс.Карты через JS API или готовый embed-виджет перевозчика, если он есть у СДЭК или Boxberry. Ключ доступа держите в настройках, а не в шаблоне, чтобы не потерять карту при смене домена.
Поможем с настройкой и поддержкой 1С-Битрикс: Управление сайтом
Поможем с настройкой, доработкой и поддержкой 1С-Битрикс: Управление сайтом.