Настройка BOPIS (Buy Online Pick up In Store) 1С-Битрикс
BOPIS — сценарий, при котором покупатель оформляет заказ онлайн, но забирает его в физическом магазине. Звучит просто, но за этим стоит связка нескольких модулей: управление складами, геолокация магазинов, резервирование остатков, уведомления о готовности заказа.
Компоненты Битрикс для BOPIS
В Битрикс BOPIS строится на трёх стандартных модулях:
sale — управление заказами. Способы доставки создаются через CSaleDelivery::Add(). Для самовывоза создаётся отдельный способ с нулевой стоимостью и типом PICKUP.
catalog — управление складами. Склады (магазины самовывоза) хранятся в b_catalog_store. Остатки по складам — в b_catalog_store_product. Ключевые поля: STORE_ID, PRODUCT_ID, AMOUNT.
sale.location — локации. Привязка магазинов к городам через b_sale_location и b_sale_location_service.
Модель данных для сети магазинов
Каждый физический магазин настраивается как склад в b_catalog_store:
-
TITLE— название магазина -
ADDRESS— адрес для отображения покупателю -
GPS_N,GPS_S— координаты для карты -
PHONE— контактный телефон -
SCHEDULE— график работы (произвольный текст или JSON-структура) -
IMAGE_ID— ссылка на фото магазина изb_file
Время работы удобнее хранить как JSON в отдельном UF-поле UF_SCHEDULE_JSON:
{"mon": "10:00-21:00", "tue": "10:00-21:00", "sun": "11:00-20:00"}
Выбор магазина на этапе оформления заказа
На странице оформления заказа покупатель видит карту или список магазинов с актуальными остатками выбранного товара. Запрос доступности:
$storeData = CCatalogStoreProduct::GetList(
['STORE_ID' => 'ASC'],
['PRODUCT_ID' => $productId, '>AMOUNT' => 0],
false,
false,
['STORE_ID', 'AMOUNT']
);
Список складов с ненулевым остатком отображается на карте через Яндекс.Карты API или Leaflet. Координаты берутся из b_catalog_store.GPS_N и b_catalog_store.GPS_S.
Резервирование товара при выборе магазина
При выборе конкретного магазина и оформлении заказа остаток в b_catalog_store_product уменьшается на количество заказа. В Битрикс это происходит автоматически при списании через модуль каталога, если включены настройки резервирования:
Настройки → Интернет-магазин → Настройки → Резервирование и отгрузка → «Резервировать при оформлении»
Но для BOPIS резервирование должно быть привязано к конкретному складу (магазину). Это требует доработки: в стандартном обработчике события OnSaleOrderSaved добавляется логика резервирования остатка именно на складе, выбранном покупателем. Склад передаётся через свойство заказа STORE_ID.
Уведомление о готовности к выдаче
Смена статуса заказа на «Готов к выдаче» (кастомный статус, например READY_PICKUP) отправляет SMS и/или email покупателю. Обработчик:
AddEventHandler('sale', 'OnSaleStatusOrder', function($orderId, $statusId) {
if ($statusId === 'READY_PICKUP') {
// Отправка SMS через шлюз
// Отправка email через CEvent::Send()
}
});
Что входит в настройку
- Создание складов-магазинов в
b_catalog_storeс координатами и расписанием - Настройка способа доставки «Самовывоз» в модуле
sale - Компонент выбора магазина с картой и отображением остатков
- Резервирование остатка на конкретном складе при оформлении заказа
- Кастомный статус заказа «Готов к выдаче» и уведомления при его установке
- Административный интерфейс для сотрудника магазина (смена статуса заказа)







