Налаштування 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' => 'UAH',
'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 робочих дні залежно від складності наявної інфраструктури складів.







