Настройка дропшиппинга на 1С-Битрикс
Магазин принимает заказы, поставщик отгружает напрямую покупателю — логика простая, реализация нет. Стандартный модуль торговли Битрикс не имеет встроенной поддержки дропшиппинга: нет маршрутизации заказов по поставщикам, нет синхронизации остатков в реальном времени, нет разделения выплат. Всё это собирается из модулей и кастомного кода.
Архитектурная схема
Минимальная дропшиппинг-система на Битрикс держится на трёх элементах:
- Привязка товар → поставщик через свойство инфоблока или HL-блок
- Маршрутизация заказов — при создании заказа определяем, каким поставщикам передавать позиции
- Синхронизация остатков — поставщик передаёт актуальные данные по API или через файл
Привязка товаров к поставщикам
Два подхода. Первый — свойство SUPPLIER_ID в инфоблоке каталога (тип «Привязка к элементу» или «Список»). Быстро, но неудобно масштабировать.
Второй — HL-блок SupplierProduct:
| Поле | Тип | Описание |
|---|---|---|
UF_PRODUCT_ID |
integer | ID товара в b_iblock_element |
UF_SUPPLIER_ID |
integer | ID поставщика (b_user) |
UF_SUPPLIER_SKU |
string | Артикул товара у поставщика |
UF_SUPPLIER_PRICE |
float | Закупочная цена |
UF_STORE_ID |
integer | Склад поставщика (b_catalog_store) |
HL-блок удобнее: поддерживает множество поставщиков на один товар, хранит закупочные цены отдельно от розничных.
Обработчик событий создания заказа
При создании заказа обработчик на событие OnSaleOrderSaved разбивает позиции по поставщикам и отправляет уведомления:
// /local/php_interface/init.php
AddEventHandler('sale', 'OnSaleOrderSaved', ['\\Local\\Dropshipping\\OrderRouter', 'route']);
// /local/lib/Dropshipping/OrderRouter.php
namespace Local\Dropshipping;
use Bitrix\Main\Application;
class OrderRouter
{
public static function route(\Bitrix\Sale\Order $order): void
{
$supplierItems = [];
foreach ($order->getBasket() as $item) {
$productId = (int)$item->getProductId();
$supplierId = self::getSupplierByProduct($productId);
if ($supplierId) {
$supplierItems[$supplierId][] = [
'product_id' => $productId,
'name' => $item->getField('NAME'),
'quantity' => $item->getQuantity(),
'price' => $item->getPrice(),
'sku' => self::getSupplierSku($productId, $supplierId),
];
}
}
foreach ($supplierItems as $supplierId => $items) {
self::notifySupplier($order, $supplierId, $items);
}
}
private static function notifySupplier(\Bitrix\Sale\Order $order, int $supplierId, array $items): void
{
// Email-уведомление или POST на вебхук поставщика
$supplier = self::getSupplierData($supplierId);
if (!empty($supplier['WEBHOOK_URL'])) {
self::sendWebhook($supplier['WEBHOOK_URL'], $order, $items);
} else {
self::sendEmail($supplier['EMAIL'], $order, $items);
}
}
}
Складской учёт по поставщикам
Каждый поставщик получает отдельный склад в b_catalog_store. Остатки хранятся в b_catalog_store_product. Это позволяет видеть не только общий остаток, но и остаток конкретного поставщика.
// Создание склада для нового поставщика
$storeId = \CCatalogStore::Add([
'TITLE' => 'Склад поставщика ' . $supplierId,
'ACTIVE' => 'Y',
'XML_ID' => 'supplier_' . $supplierId,
'SORT' => 100,
]);
Сроки реализации
| Конфигурация | Состав | Срок |
|---|---|---|
| Базовая (1 поставщик, email-уведомления) | HL-блок + обработчик + шаблон письма | 3–5 дней |
| Стандартная (несколько поставщиков, вебхуки) | + личный кабинет поставщика + API | 2–3 недели |
| Полная (синхронизация в реальном времени, аналитика) | + фид остатков + отчёты + разделение выплат | 1–2 месяца |







