Настройка Click & Collect (заказ онлайн — забрать в магазине) 1С-Битрикс
Click & Collect — схема, при которой покупатель оформляет заказ в интернет-магазине и забирает его в физической точке. В Битрикс это реализуется через модуль доставки с типом «самовывоз» и привязкой к конкретным складам/точкам. Нетривиальная часть — показать реальное наличие товара по каждой точке до оформления заказа, зарезервировать товар на конкретном складе и уведомить покупателя о готовности.
Структура данных: точки самовывоза и склады
Битрикс хранит точки самовывоза в таблице b_sale_location (для типа «Самовывоз»). Складская логика — в b_catalog_store:
SELECT s.ID, s.TITLE, s.ADDRESS, sp.AMOUNT
FROM b_catalog_store s
JOIN b_catalog_store_product sp ON sp.STORE_ID = s.ID
WHERE sp.PRODUCT_ID = ? AND s.ACTIVE = 'Y' AND sp.AMOUNT > 0
ORDER BY s.SORT ASC;
Каждая точка самовывоза в Битрикс может быть привязана к складу. Настройка в Каталог → Склады — каждый склад имеет поле XML_ID для сопоставления с точкой доставки.
Служба доставки типа «Самовывоз»
В административной панели: Магазин → Доставка → Добавить службу доставки → Тип: Самовывоз.
Программное создание:
\Bitrix\Main\Loader::includeModule('sale');
$deliveryService = \Bitrix\Sale\Delivery\Services\Manager::getList([
'filter' => ['CODE' => 'self_pickup'],
])->fetch();
if (!$deliveryService) {
// Регистрируем службу самовывоза
\Bitrix\Sale\Delivery\Services\Manager::add([
'NAME' => 'Самовывоз из магазина',
'CODE' => 'self_pickup',
'ACTIVE' => 'Y',
'CLASS_NAME' => '\Bitrix\Sale\Delivery\Services\Base',
'CURRENCY' => 'RUB',
'PRICE' => 0,
]);
}
Выбор точки самовывоза в корзине
В шаблоне компонента оформления заказа (sale.order.ajax или sale.basket.order) — выпадающий список или карта с точками:
// Получаем активные склады с наличием товаров из корзины
$basketItems = $order->getBasket();
$productIds = [];
foreach ($basketItems as $item) {
$productIds[] = $item->getProductId();
}
// Для каждого склада проверяем, есть ли все товары корзины
$storesResult = \Bitrix\Catalog\StoreTable::getList([
'filter' => ['ACTIVE' => 'Y'],
'select' => ['ID', 'TITLE', 'ADDRESS', 'GPS_N', 'GPS_S'],
'order' => ['SORT' => 'ASC'],
]);
$availableStores = [];
while ($store = $storesResult->fetch()) {
$allAvailable = true;
foreach ($productIds as $productId) {
$stockResult = \Bitrix\Catalog\StoreProductTable::getList([
'filter' => ['PRODUCT_ID' => $productId, 'STORE_ID' => $store['ID']],
'select' => ['AMOUNT'],
])->fetch();
if (!$stockResult || $stockResult['AMOUNT'] < $basketItems->getQuantityByProductId($productId)) {
$allAvailable = false;
break;
}
}
if ($allAvailable) {
$availableStores[] = $store;
}
}
Резервирование на конкретном складе
После выбора точки самовывоза — резервируем товары на этом складе, а не в общем пуле:
// В обработчике сохранения заказа
\Bitrix\Main\EventManager::getInstance()->addEventHandler(
'sale', 'OnSaleOrderBeforeSaved',
function (\Bitrix\Main\Event $event) {
$order = $event->getParameter('ENTITY');
// Читаем выбранную точку самовывоза из свойств заказа
$pickupStoreId = $order->getPropertyCollection()
->getItemByOrderPropertyCode('PICKUP_STORE_ID')
?->getValue();
if (!$pickupStoreId) {
return;
}
// Резервируем на конкретном складе
foreach ($order->getBasket() as $basketItem) {
\Bitrix\Catalog\StoreProductTable::reserveProduct(
$basketItem->getProductId(),
(int)$pickupStoreId,
$basketItem->getQuantity(),
$order->getId()
);
}
}
);
Свойство заказа PICKUP_STORE_ID создаётся как пользовательское поле заказа: Магазин → Настройки → Свойства заказа.
Сроки настройки
Служба доставки самовывоза, выбор точки с проверкой наличия, резервирование на складе, сохранение в свойстве заказа — 2–4 рабочих дня в зависимости от сложности существующей инфраструктуры складов.







