Настройка Click & Collect (заказ онлайн — забрать в магазине) 1С-Битрикс

Наша компания занимается разработкой, поддержкой и обслуживанием решений на Битрикс и Битрикс24 любой сложности. От простых одностраничных сайтов до сложных интернет магазинов, CRM систем с интеграцией 1С и телефонии. Опыт разработчиков подтвержден сертификатами от вендора.
Предлагаемые услуги
Показано 1 из 1 услугВсе 1626 услуг
Настройка Click & Collect (заказ онлайн — забрать в магазине) 1С-Битрикс
Простая
~1 рабочий день
Часто задаваемые вопросы
Наши компетенции:
Этапы разработки
Последние работы
  • image_website-b2b-advance_0.png
    Разработка сайта компании B2B ADVANCE
    1177
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Разработка веб-сайта для компании ФИКСПЕР
    811
  • image_bitrix-bitrix-24-1c_development_of_an_online_appointment_booking_widget_for_a_medical_center_594_0.webp
    Разработка на базе Битрикс, Битрикс24, 1С для компании Development of an Online Appointment Booking Widget for a Medical Center
    564
  • image_bitrix-bitrix-24-1c_mirsanbel_458_0.webp
    Разработка на базе 1С Предприятие для компании МИРСАНБЕЛ
    747
  • image_crm_dolbimby_434_0.webp
    Разработка сайта на CRM Битрикс24 для компании DOLBIMBY
    655
  • image_crm_technotorgcomplex_453_0.webp
    Разработка на базе Битрикс24 для компании ТЕХНОТОРГКОМПЛЕКС
    976

Настройка 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 рабочих дня в зависимости от сложности существующей инфраструктуры складов.