Налаштування мультипостачальникової логіки замовлень 1С-Бітрікс

Наша компанія займається розробкою, підтримкою та обслуговуванням рішень на Бітрікс та Бітрікс24 будь-якої складності. Від простих односторінкових сайтів до складних інтернет-магазинів, CRM систем з інтеграцією 1С та телефонії. Досвід розробників підтверджено сертифікатами від вендора.
Пропоновані послуги
Показано 1 з 1 послугУсі 1626 послуг
Налаштування мультипостачальникової логіки замовлень 1С-Бітрікс
Проста
~1 робочий день
Часті питання

Наші компетенції:

Етапи розробки

Останні роботи

  • image_website-b2b-advance_0.png
    Розробка сайту компанії B2B ADVANCE
    1262
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Розробка веб-сайту для компанії ФІКСПЕР
    851
  • 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
    585
  • image_bitrix-bitrix-24-1c_mirsanbel_458_0.webp
    Розробка на базі 1С Підприємство для компанії МИРСАНБЕЛ
    751
  • image_crm_dolbimby_434_0.webp
    Розробка сайту на CRM Бітрікс24 для компанії DOLBIMBY
    657
  • image_crm_technotorgcomplex_453_0.webp
    Розробка на базі Бітрікс24 для компанії ТЕХНОТОРГКОМПЛЕКС
    989

Налаштування логіки замовлень з кількома постачальниками в 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_STATUSnew / 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 днів залежно від обраного варіанта розділення та складності сповіщень.