Задать вопрос
  • Из-за чего возникает ошибка "В корзине недостаточное количество не распределенного товара"?

    Ошибка возникает из-за несоответствия кол-ва товаров в корзине (b_sale_basket) и кол-ва товаров в выгрузках (b_sale_order_dlv_basket), либо отсутствии некоторых позиций в выгрузках

    Прикладываю небольшой скрипт, который приводит состояние b_sale_order_dlv_basket к b_sale_basket по составу и количеству

    <?
    use Bitrix\Sale\Internals\ShipmentItemTable;
    use Bitrix\Sale\Order;
    
    require($_SERVER["DOCUMENT_ROOT"] . "/bitrix/modules/main/include/prolog_before.php");
    
    \CModule::IncludeModule("sale");
    
    // ID заказа для корректировки
    $orderId = 19680;
    repairOrder($orderId);
    
    function repairOrder($orderId)
    {
        $order = Order::load($orderId);
        echo "Попытка исправления отгрузок у заказа " . $orderId . PHP_EOL;
    
        $shipmentId = 0;
        $shipmentCollection = $order->getShipmentCollection();
        foreach ($shipmentCollection as $shipment) {
            if (!$shipment->isSystem()) {
                $shipmentId = $shipment->getId();
            }
        }
    
        $basket = $order->getBasket();
        foreach ($basket as $basketItem) {
            $basketQuantity = $basketItem->getField('QUANTITY');
            $rsShipment = ShipmentItemTable::getList(
                [
                    "filter" => ['BASKET_ID' => $basketItem->getId()],
                ]
            );
            if ($arShipment = $rsShipment->Fetch()) {
                if (abs($arShipment['QUANTITY'] - $basketQuantity) > 0.000001) {
                    $resUpdate = ShipmentItemTable::update($arShipment['ID'], [
                        "QUANTITY" => $basketQuantity,
                        "RESERVED_QUANTITY" => $basketQuantity
                    ]);
    
                    if ($resUpdate) {
                        echo "Изменено количество с " . $arShipment['QUANTITY'] . "на " . $basketQuantity . " у отгрузки " . $arShipment['ID'] . PHP_EOL;
                    } else {
                        echo "Ошибка изменения количества с " . $arShipment['QUANTITY'] . "на " . $basketQuantity . " у отгрузки " . $arShipment['ID'] . PHP_EOL;
                    }
                }
            } else {
                echo "Не найдена позиция для элемента корзины " . $basketItem->getId() . PHP_EOL;
    
                if ($shipmentId) {
                    $addFields = [
                        'ORDER_DELIVERY_ID' => $shipmentId,
                        'BASKET_ID' => $basketItem->getId(),
                        "QUANTITY" => $basketQuantity,
                        "RESERVED_QUANTITY" => $basketQuantity,
                        "XML_ID" => uniqid('bx_')
                    ];
                    if (ShipmentItemTable::add($addFields)) {
                        echo "Добавлен недостающий элемент " . $basketItem->getId() . " в отгрузку " . $shipmentId . PHP_EOL;
                    } else {
                        echo "Ошибка добавления недостающего элемента " . $basketItem->getId() . " в отгрузку " . $shipmentId . PHP_EOL;
                    }
                }
            }
        }
    }
    Ответ написан
    Комментировать