Налаштування логіки замовлень з кількома постачальниками в 1С-Бітрікс
У дропшипінгу одне замовлення покупця може містити товари від різних постачальників. Кожен постачальник повинен отримати лише свою частину. Бітрікс не розділяє замовлення за постачальниками автоматично — логіка реалізується через обробники подій та користувацькі таблиці.
Варіанти реалізації
Варіант 1 — єдине замовлення, окремі сповіщення постачальникам. Замовлення в Бітріксі залишається єдиним у b_sale_order. При оформленні замовлення обробник OnSaleOrderSaved визначає, які позиції кошика належать яким постачальникам, та надсилає кожному постачальнику сповіщення лише з його товарами. Простіше, але не дозволяє окремо відстежувати відправлення кожного постачальника.
Варіант 2 — розділення на дочірні відправлення. Одне замовлення, але об'єкт \Bitrix\Sale\Shipment створюється окремо для кожного постачальника. Це нативний механізм Бітрікс — одне замовлення може мати кілька відправлень з різними параметрами.
Варіант 3 — розділення на окремі замовлення (підзамовлення). При оформленні створюється материнське замовлення та кілька дочірніх залежно від кількості постачальників. Складніше, але забезпечує повну незалежність статусів.
Реалізація через окремі відправлення (варіант 2)
При збереженні замовлення визначте постачальників та створіть відправлення:
AddEventHandler('sale', 'OnSaleOrderSaved', function(\Bitrix\Main\Event $event) {
$order = $event->getParameter('ENTITY');
$isNew = $event->getParameter('IS_NEW');
if (!$isNew) return;
$basket = $order->getBasket();
$supplierItems = [];
// Групуйте позиції кошика за постачальниками
foreach ($basket->getOrderableItems() as $item) {
$supplierId = getSupplierByProductId($item->getProductId());
if ($supplierId) {
$supplierItems[$supplierId][] = $item;
}
}
$shipmentCollection = $order->getShipmentCollection();
foreach ($supplierItems as $supplierId => $items) {
$shipment = $shipmentCollection->createItem();
$shipment->setField('DELIVERY_ID', getSupplierDeliveryId($supplierId));
$shipment->setField('CUSTOM_PRICE_DELIVERY', 'N');
$shipmentItemCollection = $shipment->getShipmentItemCollection();
foreach ($items as $basketItem) {
$shipmentItem = $shipmentItemCollection->createItem($basketItem);
$shipmentItem->setQuantity($basketItem->getQuantity());
}
}
$order->save();
});
Функція getSupplierByProductId() читає властивість SUPPLIER_ID з b_iblock_element_property.
Сповіщення постачальникам
Кожен постачальник отримує електронного листа або повідомлення лише з його товарами. Надсилання через \Bitrix\Main\Mail\Event::send() із користувацькою шаблоном:
foreach ($supplierItems as $supplierId => $items) {
$supplierEmail = getUserEmail($supplierId);
\Bitrix\Main\Mail\Event::send([
'EVENT_NAME' => 'SUPPLIER_ORDER_NOTIFY',
'LID' => SITE_ID,
'C_FIELDS' => [
'SUPPLIER_EMAIL' => $supplierEmail,
'ORDER_ID' => $order->getId(),
'ORDER_ITEMS' => formatItemsForEmail($items),
'BUYER_ADDRESS' => getOrderDeliveryAddress($order),
],
]);
}
Шаблон SUPPLIER_ORDER_NOTIFY створюється в "Поштових подіях" в адміністративному інтерфейсі.
Відстеження статусів за постачальниками
HL-блок SupplierOrderStatus фіксує статус кожної частини замовлення:
-
UF_ORDER_ID— ID замовлення Бітрікс -
UF_SUPPLIER_ID— постачальник -
UF_STATUS—new/confirmed/shipped -
UF_TRACKING_NUMBER— номер відстеження
Агент перевіряє, чи всі постачальники встановили shipped, та змінює статус основного замовлення:
function checkAllSuppliersShippedAgent(): string
{
// Знайдіть замовлення, де всі постачальники відправили товар
$connection = \Bitrix\Main\Application::getConnection();
$orders = $connection->query("
SELECT UF_ORDER_ID
FROM b_hl_supplier_order_status
GROUP BY UF_ORDER_ID
HAVING COUNT(*) = SUM(CASE WHEN UF_STATUS = 'shipped' THEN 1 ELSE 0 END)
AND UF_ORDER_ID IN (
SELECT ID FROM b_sale_order WHERE STATUS_ID NOT IN ('F','C')
)
");
while ($row = $orders->fetch()) {
$order = \Bitrix\Sale\Order::load($row['UF_ORDER_ID']);
if ($order) {
$order->setField('STATUS_ID', 'S'); // статус "Відправлено"
$order->save();
}
}
return __FUNCTION__ . '();';
}
Налаштування займає 2–5 днів залежно від обраного варіанта розділення та складності сповіщень.







