Модуль "Доставка за 30 минут"
Плагин для доставки за 30 минут через вызов водителя такси, велокурьера, грузовика, робота-доставщика. Поддерживаются сервисы Яндекс Доставка и Достависта.
Подходит для доставки горячей еды, товаров, мебели.
Основные возможности
- Расчёт стоимости доставки в момент оформления заказа.
- Установка и настройка за 5 минут. Просто укажите 3 настройки: API ключ яндекс доставки, API ключ яндекс карт, адрес вашего склада, создайте службу доставки и модуль готов к работе.
- Полная поддержка робота-доставщика.
- Поддержка всех стран и валют: Россия, Казахстан, Беларусь и другие страны.
- Подходит для фастфуда и ресторанов. Можно заказать курьера с термосумкой.
- Подходит для крупногабаритной доставки.
- Расчёт конечной стоимости доставки во время оформления заказа. И фиксация цены на 10 минут.
- Работа напрямую с кабинетом и API яндекс доставки. Никаких посреднических договоров и сервисов.
- Выбор из нескольких вариантов доставки с разной ценой и временем доставки.
- Возможность отложить приезд курьера на период от 30 до 240 минут, если менеджеру нужно время на сборку заказа.
- События Битрикс, через которые можно гибко настраивать работу модуля под себя.
- Изменение внешнего вида через стандартное изменение шаблона компонента в Битрикс.
- Указание адреса точкой на карте. Например, если пункт назначения — точка на трассе или определённый заезд в промышленной зоне.
- Подробнейшая документация для пользователей и разработчиков.
- Передача ID заказа в интерфейсе служб доставки.
- Онлайн-техподдержка в телеграм @pavelphp напрямую с разработчиком. Будьте уверены, что любая ваша проблема будет решена в течение 1–2 дней. Срочные проблемы — раньше. Также можете написать по любым вопросам на почту pavel@pavelphp.ru. Возможна техподдержка онлайн через демонстрацию экрана.
Интерфейс пользователя
- Для оформления доставки через вызов курьера пользователь выбирает способ доставки.

- Затем указывает адрес кликнув на карте или через форму поиска адреса.

- Далее выбирает одно из ценовых предложений.

Для служб доставки, которые предоставляют возможность фиксировать цену, цена будет зафиксированна. При создании заявки цена будет точно такой же, как указана у пользователя. Если в настройках модуля выбрана опция «Подтвердить заявку при оплате», то после оплаты заказ в доставке автоматически подтвердится и начнётся поиск курьера.
Интерфейс менеджера интернет-магазина

На странице просмотра заказа в административной панели появится «вкладка Доставка 30 минут», из неё менеджер может:
- Создавать, обновлять данные и отменять заявку на доставку.
- Для Яндекс доставки доступно открытие крышки робота-доставщика, а также запрос телефона курьера.
Установка
- Загрузите модуль из маркетплейса.
- Установите его через административную панель. Зайдите «Marketplace» → «Установленные решения». В списке найдите модуль «Доставка за 30 минут», наведите мышку на 3 полоски слева и выберите пункт «Установить».
Настройка
- Откройте страницу настроек модуля: «Настройки» → «Настройки продукта» → «Настройки модулей» → «Доставка за 30 минут». Либо откройте страницу https://[ваш сайт]/bitrix/admin/settings.php?lang=ru&mid=pavelphp.kurerskiedostavki&mid_menu=1.
- Заполните 4 обязательных поля: токен яндекс доставки или токен Dostavista, токен Яндекс карт, адрес склада, координаты склада. Также реккомендуем заполнить «Имя контактного лица», «Телефон контактного лица» и «Инструкции для водителя».
- Нажмите сохранить.
- В административной панели откройте «Магазин» → «Настройки» → «Службы доставки». Либо откройте страницу https://[ваш сайт]/bitrix/admin/sale_delivery_service_list.php?lang=ru&filter_group=0.
- Нажмите на стрелку справа от кнопки «Добавить» и выберите пункт «Доставка 30 минут».
- Нажмите сохранить.
После этого можно полноценно пользоваться доставкой. На странице оформления заказа появится пункт «Доставка за 30 минут».
Регистрация в яндекс доставки и получение API токена интеграции
Для начала работы с Яндекс Доставкой нужно:
- Зарегистрироваться или войти в кабинет по адресу https://dostavka.yandex.ru.
- Привязать компанию или ИП.
- Пополнить счёт Яндекс Доставки, сделав платёж с расчётного счёта вашей компании или ИП на реквизиты Яндекс Доставки на 500 рублей. Но мы рекомендуем пополнить минимум на 2000 рублей. В назначении платежа укажите номер договора с Яндекс Доставкой. Реквизиты доступны в разделе «Контакты».

- Дождитесь пока ваш платёж обработают и статус привязки вашей компании обновится.
- Перейдите на вкладку «Интеграции».

- В разделе «Активируйте интеграцию», нажмите «Получить токен».

- Укажите этот токен в настройках модуля. dostavista-forma-registracii.png
Регистрация в Dostavista и получение API токена интеграции
Для начала работы с Dostavista нужно:
- Зарегистрироваться или войти в качестве юридического лица в рабочий кабинет по адресу https://dostavista.ru/ и в тестовый кабинет по адресу https://apitest.dostavista.ru/. Всего 2 кабинета.
- В рабочем кабинете заполните данные договора в форме.

- Наведите курсор в правый верхний угол на название своего профила, всплывёт окно, нажмите на кнопку «Пополнить». Пополните баланс на 500 рублей с рассчётного счёта компании или ИП. Но мы рекомендуем пополнить минимум на 2000 рублей.
- В тестовом кабинете навести курсор на блок с вашим именем в правом верхнем углу и открыть раздел «Настройки» -> «Интеграции».
- Нажмите на кнопку «Скопировать токен» и укажите его в настройках модуля.

- Включите режим отладки в настройках модуля и сделайте несколько заказов.
- После этого согласно официальной документации напишите на адрес api@dostavista.ru с просьбой открыть вам доступ к API интеграции в рабочем кабинете.
- Повторите шаг 4 для рабочего кабинета и выключите режим отладки из шага 5.
Получение API токена яндекс карт
- Откройте кабинет разработчика https://yandex.ru/maps-api/console.
- Откройте раздел «Ключи». Нажмите на кнопку «Новый ключ».

- Для пункта «Продукт» выберите «JavaScript API». В поле «Название ключа» укажите любое название. Нажмите «Создать ключ». В таблице появится созданный ключь

- Для созданного ключа откройте меню, нажав на многоточие слева от ключа, и выберите пункт «Привязать продукт».

- В появившемся окне выберите «API Геосаджеста» и нажмите «Привязать продукт».

- Снова откройте меню и выберите пункт «Настройки».
- В поле «Ограничение по HTTP Referer» укажите домен вашего сайта. Нажмите «Создать».
- Запись о ключе должна выглядеть примерно так.

- Укажите значение из столбца «Значение ключа» в настройках модуля.
Опции модуля
Настройки модуля расположены на странице https://[ваш сайт]/bitrix/admin/settings.php?lang=ru&mid=pavelphp.kurerskiedostavki&mid_menu=1.
- Токен яндекс доставки. Создаётся в личном кабинете Яндекс Доставки в разделе «Интеграция». Пример: y0__wgBEJuzHGJGJD8762GLRU1aCGMHSBHqCPXnh645CcTK.
- Токен яндекс доставки. Создаётся в личном кабинете Dostavista в разделе «Интеграции». Пример: 7002B5AA6112EC1074E2795C8E0106938B6F3CBD.
- Метод рассчёта цены Яндекс Метод Яндекс API, которым рассчитывается стоимость доставки для создания заявки. Выбор зависит от страны, где осуществляется доставка.
- Токен Яндекс карт. Создаётся в кабинете управления яндекс картами. Пример: 48df0ca6-f242-acd0-91a8-98eed091a72c.
- Адрес склада. Откуда забирать товар водителю. Пример: Москва, Петровско-Разумовская аллея, 12Ас7, офис 17
- Координаты склада. Широта и долгота через запятую. Пример: 55.795347, 37.560934.
- Инструкции для водителя. Эта информация отобразится в приложении водителя, когда он будет брать заказ на складе. Пример: Подняться в БЦ на второй этаж, пройти в кабинет №215, позвонить в дверь.
- Имя контактного лица. Контактное лицо вашей компании, с которым водитель сможет связаться при необходимости. Пример: Менеджер Елена.
- Телефон контактного лица. Контактное лицо вашей компании, с которым водитель сможет связаться при необходимости. Пример: +7 123 456-78-90.
- По умолчанию доставка от двери до двери. При оформлении заказа, опция от двери до двери будет включена по умолчанию. Но клиент сможет её отключить.
- Возврат товара водителем. Если клиент не примет заказ, водитель вернёт товар в пункт назначения, а не оставит себе. Рекоммендуется отключить, так стоимость тарифа доставки при расчёте будет дешевле до 75%.
- Доставка товара роботом. Включить в варианты доставки Яндекс Доставки, доставку с помощью робота-доставщика.
- Термосумка. Требование к курьеру, что у него должна быть термосумка.
- Отправить СМС. Попросить сервис доставки отправить СМС пользователю. Рекоммендуется включить для повышения сервиса. Отключать стоит в случаях, когда вы сами отправляете СМС, и вам нужно чтобы сервис доставки не отправлял дубликат.
- Грузчики. Сколько грузчиков требуется включая водителя.
- Режим отладки. Запросы к API модулей будут отправляться на тестовые API, а для Яндекс Доставки заказа будут создаваться не подтверждёнными.
- Создать заявку при оплате. При оплате заказа, для заказа будет создана заявка на доставку.
- Размер товара по умолчанию. Если у товара в характеристиках не заполнена информация о его размере, то это значение будет использовано по умолчанию. Если реальный размер заказа и размер заказа, переданный в заявку Яндекс Доставки сильно отличаются, то водитель вправе отказаться от доставки. Но решение он принимает самостоятельно.
- Вес товара по умолчанию. Вес товара по умолчанию, если не указанно иное.
- Локаль. Язык сообщений от API Яндекс Доставки.
- Язык яндекс карты. Язык, на котором будут показываться адреса и карта.
- Включить логирование. Логирование всех запросов к API яндекс доставки. Полезно для отладки. Все записи хранятся в административной панели.
- Селектор формы заказа. CSS селектор до тега form на странице оформления заказа. Нужен для работы окна выбора адреса на странице оформления заказа. Для стандартного компонента равен #bx-soa-order-form
- Период обновления заявок. Берутся все заказы, чьё последнее изменение статуса произошло в течение указанного количества дней, если у них есть не отменённые или не выполненные заявки яндекс доставки, то происходит запрос к яндекс API для обновления информации. Обновление происходит раз в минуту.
- Хранить логи. Как долго хранить лог запросов к API сервисов доставки.
Настройка для стран кроме России
В настройках модуля выберите значение check-price у опции «Метод рассчёта цены».
Важные нюансы
- Убедитесь что на счёте достаточно средств. Получить расчёт стоимости по заказу будет невозможно, если стоимость заказа больше остатка суммы на счёте.
Как сделать доставку дешевле?
- В личном кабинете Яндекс Доставки в разделе «Настройки доставки» обратите внимание на настройку «Приоритет в API» о приоритете стоимости и скорости. Возможно, вам будет интересно, выбрать вариант оптимизации по стоимости.
- Для Достависы откажитесь от опции возврата товара. Она добавляет к стоимости +75%.
- При оформлении заказа несколько раз обновите цены. Сервисы доставки могут выдавать цену +-150 руб для подряд идущих запросов с интерфалом 1-2 секунды.
Кастомизация
Мы сделали наш модуль гибким и максимально дружелюбным к адаптации функционала под ваши задачи. Ниже перечислены примеры реализации частых доработок.
Адаптация под свой шаблон
Чтобы сменить дизайн, скопируйте папку /bitrix/components/pavelphp/create.delivery.claim/templates/.default/ в папку вашего шаблона сайта. Затем поменяйте дизайн. Это стандартный способ изменения шаблона в Битрикс.
Указание габаритов и веса товаров
Габариты и вес товаров берутся из стандартных свойств торгового каталога Битрикс. Но если вам нужна какая-то дополнительная логика, то используйте события OnBeforeSendCreateClaim. С помощью него вы можете получать и изменять все поля товаров.
Указание маркировки
Для указания маркировки также используйте события OnBeforeSendCreateClaim. С помощью него вы можете получать и изменять все поля товаров, в том числе добавлять и редактировать информацию о маркировке.
Заполнять подхезд, квартиру, этаж, код домофона
Если на странице оформления заказа у вас присутствуют эти поля, то чтобы передать их в форму оформления заявки, вам надо модифицировать шаблон компонента pavelphp:order.ajax.logic. В нём в обработчике события pavelphp.kurerskiedostavki_askOrderInfo добавить новые данные для передачи в iframe оформления заказа.
Далее, в шаблоне компонента pavelphp:create.delivery.claim в событии pavelphp.kurerskiedostavki_setOrderInfo использовать эти поля для заполнения формы.
Вывод данных о доставке в личном кабинете пользователя
Чтобы получить данные о заявке на доставку, используйте следующий код:
<?php
// Номер заказа
$orderID = '10';
Loader::includeModule('pavelphp.kurerskiedostavki');
$ClaimRecord = \pavelphp\kurerskiedostavki\ClaimTable::getList([
'filter' => ['ORDER_ID' => orderID],
'order' => ['CREATED_AT' => 'DESC'],
])->fetch();
// Тут содержится ответ API сервиса доставки со всеми данными
$claim_responce = json_decode($ClaimRecord['DATA'], true);
// Тут содержится унифицированный для всех служб доставки объект \pavelphp\kurerskiedostavki\Claim с информацией о доставке
$Claim = unserialize($ClaimRecord['CLAIM']);
// Получаем название класса работы с API используемого сервиса доставки
$delivery_service = $ClaimRecord['DELIVERY_SERVICE'];
$deliverClass = Helper::getServiceClass($delivery_service);
// Получаем унифицированные данные о статусе доставке
$statusInfo = $seriveClass::getClaimStatusInfo($Claim->service_status);
// Узнаём конечный ли статус у заказа, будет ли он ещё меняться, активен ли он.
$isActive = $seriveClass::isActiveStatus($Claim->service_status);
?>
Далее, просто выведите полученные данные в шаблоне компонента. Например:
Статус заказа: <?=$statusInfo['human_status']. ' ('.$Claim->service_status.')'?>
Информация о курьере:<br />
Имя: <?=$Claim->courier_name?><br />
Телефон: <?=$Claim->courier_phone?><br />
Автомобиль: <?=$Claim->courier_info?><br />
Сообщения об ошибках
При вводе адреса в яндекс картах выводится ошибка "Сервер не смог обработать запрос"
В настройках яндекс карт нужно включить API Геосаджеста.
Ошибки в консоли браузера
В консоли браузера могут появиться сообщения об ошибках с префиксом ERROR_kurerskiedostavki.
- ERROR_kurerskiedostavki_CANT_FIND_FORM - не можем найти форму оформления заказа по стандартному селектору #bx-soa-order-form, чтобы провести с ней нужные манипуляции. Скорее всего, вы используйте кастомный шаблон компонента sale.order.ajax. Заполните поле «Селектор формы заказа» в настройках модуля таким значением, чтобы этот селектор выбирал форму оформления заказа.
Документация для разработчиков
Модуль содержит 2 компонента:
- pavelphp:create.delivery.claim - компонент для оформления заявки на доставку. Именно в нём отображается карта, варианты доставки и происходит подтверждение заявки. Любые модификации дизайна и логики возможны простым переопределением шаблона компонента.
- pavelphp:order.ajax.logic - автоматически подключается при выводе компонента bitrix:sale.order.ajax. Содержит логику работы модуля для страницы оформления заказа. Любые модификации возможны простым переопределением шаблона компонента.
Модуль использует 3 таблицы:
- pavelphp_kurerskiedostavki_log - хранит HTTP запросы к API сервиса доставки. Можно отключить логирование через настройки модуля.
- pavelphp_kurerskiedostavki_claim - хранит последнюю полученную актуальную информацию о заявах на доставку у сервиса доставки.
- pavelphp_kurerskiedostavki_user_choose - хранит информацию о доставке указанную пользователем при оформлении заказа.
Основные классы:
- pavelphp\kurerskiedostavki\Helper - вспомогательные функции.
- pavelphp\kurerskiedostavki\Handlers - содержит функции для событий битрикс.
- pavelphp\kurerskiedostavki\YandexAPI - методы для работы с API яндекс доставки.
- pavelphp\kurerskiedostavki\DostavistaAPI - методы для работы с API Достависта.
- pavelphp\kurerskiedostavki\Claim - унифицированная структура для хранения данных о доставки.
- pavelphp\kurerskiedostavki\DeliveryOffer - унифицированная структура для хранения данных о варианте доставки.
- pavelphp\kurerskiedostavki\UserChoose - структура для хранения данных, которые заполнял пользователь при оформлении доставки.
- pavelphp\kurerskiedostavki\ResponseError - в случае, если запрос к API завершился ошибкой, то вернётся этот объект.
События
Используйте события для модификации запросов и ответов к API сервисов доставки.
Пример создания собственного обработчика события.
<?php
// Расположите этот код в файле bitrix/php_interfce/init.php либо local/php_interfce/init.php
use Bitrix\Main\EventManager;
use Bitrix\Main\Entity\EventResult;
$eventManager = EventManager::getInstance();
$eventManager->addEventHandler(
'pavelphp.kurerskiedostavki',
'OnBeforeSendCreateClaim',
function (\Bitrix\Main\Event $event) {
// Получаем параметры события
$params = $event->getParameters();
// Записываем данные в лог
\Bitrix\Main\Diag\Debug::writeToFile(
$params,
'params',
'events_kurerskiedostavki.log'
);
// Изменяем данные
$params['POST_DATA']['route_points'] = [];
// Сохраняем данные
$result = new EventResult;
$result->modifyFields($params);
// Возвращаем результат
return $result;
});
?>
OnBeforeSendCreateClaim
Вызывается перед отправкой запроса на создание заявки методом claims/create. Параметры:
- POST_DATA - содержит все данные о заявке. Можно изменить.
- INFO - дополнительная информация по запросу.
- INFO.URL - url по которому отправляются данные
- INFO.DELIVERY_SERVICE - код службы доставки.
OnAfterSendCreateClaim
Вызывается после отправки запроса на создание заявки методом claims/create. Параметры:
- RESPONSE - содержит ответ от яндекс API. Можно изменить.
- INFO - дополнительная информация по запросу.
- INFO.URL - url по которому отправляются данные.
- INFO.DELIVERY_SERVICE - код службы доставки.
- INFO.REQUEST - данные, отправленные при запросе.
- INFO.STATUS - код статуса.
OnBeforeSendGetPrice
Вызывается перед отправкой запроса на расчёт цен на доставку методом offers/calculate. Параметры:
- POST_DATA - содержит все данные о заявке. Можно изменить.
- INFO - дополнительная информация по запросу.
- INFO.URL - url по которому отправляются данные
- INFO.DELIVERY_SERVICE - код службы доставки.
OnAfterSendGetPrice
Вызывается после отправки запроса на расчёт цен на доставку методом offers/calculate. Параметры:
- RESPONSE - содержит ответ от яндекс API. Можно изменить.
- INFO - дополнительная информация по запросу.
- INFO.URL - url по которому отправляются данные.
- INFO.DELIVERY_SERVICE - код службы доставки.
- INFO.REQUEST - данные, отправленные при запросе.
- INFO.STATUS - код статуса.
OnBeforeSendGetInfo
Вызывается перед отправкой запроса на расчёт цен на доставку методом offers/calculate. Параметры:
- INFO - дополнительная информация по запросу.
- INFO.URL - url по которому отправляются данные.
- INFO.DELIVERY_SERVICE - код службы доставки.
OnAfterSendGetInfo
Вызывается после отправки запроса на обновление информации о заявке методом claims/info. Параметры:
- RESPONSE - содержит ответ от яндекс API. Можно изменить.
- INFO - дополнительная информация по запросу.
- INFO.URL - url по которому отправляются данные.
- INFO.DELIVERY_SERVICE - код службы доставки.
- INFO.REQUEST - данные, отправленные при запросе.
- INFO.STATUS - код статуса.
OnClaimStatusChanged
Вызывается когда после обновления заявки, статус заявки меняется.
- OLD_DATA - старые данные о заявке. Если заявка новая, то будет содержать значение NULL.
- NEW_DATA - новые обновлённые данные о заявке.
- INFO - дополнительная информация по событию.
- INFO.DELIVERY_SERVICE - код службы доставки.
Вопросы и ответы
Отсутствуют способы доставки на 2 шаге
Возможные причины:
- На вашем счёте в личном кабинете яндекс недостаточно средств на оформление доставки. Яндекс выдаёт только те варианты доставок, для которых на лицевом счёте достаточно средств. Если вы создадите заявку на доставку, а на её оплату будет недостаточно средств, то она отменится со статусом estimating_failed. Желательно, чтобы сумма на счёте была с запасом на 1000 руб. и более, чтобы учесть непредвиденные затраты на возврат товара курьером или штрафы.
- В настройках Яндекс Доставки ограничены способы доставки. Например, запрещена доставка на автомобиле.
Чтобы определить проблему, попробуйте оформить аналогичный заказ на доставку через личный кабинет Яндекс Доставки, чтобы увидеть содержание ошибки.
Время в заявках спешит/отстаёт на несколько часов
Вам нужно настроить в Битриксе часовой пояс. Для этого зайдите в административную панель сайта.
- Перейдите в «Настройки» → «Настройки продукта» → «Настройки модулей».
- Выберите модуль «Главный модуль».
- В секции «Часовые пояса» установите галочку «Разрешить использование часовых поясов».
- В выпадающем списке «Часовой пояс сервера по умолчанию» укажите ваш часовой пояс.

Как указать точный подъезд к которому будет подъезжать водитель?
На странице настройки модуля в поле «Инструкции для водителя».
Как указать необходимость термосумки?
На странице настройки модуля в поле «Термосумка».
Это указывается в настройках модуля. Настройка работает для всех заказов. Если вам нужно гибко управлять требованием наличия/отсутствия термосумки, вы можете программно прописать собственную логику используя событие OnBeforeSendCreateClaim.
Как указать колличество грузчиков
На странице настройки модуля в поле «Грузчики».
Это указывается в настройках модуля. Настройка работает для всех заказов. Если вам нужно гибко управлять требованием наличия/отсутствия грузчиков, вы можете программно прописать собственную логику используя событие OnBeforeSendCreateClaim.
Автообновление заявки
Заявки обновляются каждую минуту через вызов агента \pavelphp\kurerskiedostavki\Handlers::updateAgent();.
Для оптимизации нагрузки запросы к API отправляются для заказа только, если выполняются следующие условия:
- Способ доставки заказа «Доставка за 30 минут».
- Статус заказа сменился N дней назад. По умолчанию N равен 3, но его можно настроить на странице настройки модуля.
- Заявка автивна, то есть находится не в статусах: отменена, завершена, ошибка.
Доработка плагина по ТЗ
Мы предоставляем услуги по платной доработке плагина под ваши задачи. Напишите нам в ТГ @pavelphp, на почту pavel@pavelphp.ru или по телефону +7 (967) 062-76-00 . Возможна помощь в режиме демонстрации экрана.