Задать вопрос
@Alexer05

Из-за чего возникает ошибка «В корзине недостаточное количество не распределенного товара»?

Не получается изменить сумму доставки через функцию CSaleOrder::Update(), появляется ошибка "В корзине недостаточное количество не распределенного товара". Из-за чего может быть ошибка?
  • Вопрос задан
  • 744 просмотра
Подписаться 1 Простой 1 комментарий
Помогут разобраться в теме Все курсы
  • Нетология
    Фронтенд-разработчик
    11 месяцев
    Далее
  • Skillfactory
    DevOps-инженер
    6 месяцев
    Далее
  • Яндекс Практикум
    Python-разработчик
    10 месяцев
    Далее
Пригласить эксперта
Ответы на вопрос 2
usvmak
@usvmak
Программист bitrix
Возникает данная ошибка, когда происходит изменение количества в корзине, привязанной к заказу, но при этом сам заказ не сохранили. На D7 этот момент решается следующим образом:

Bitrix\Main\Loader::includeModule("sale");
создаем экземпляр заказа
$order = Order::load($orderId);
получаем корзину
$basket = $order->getBasket();
изменям количество
foreach ($basketItems as $basketItem) {
$basketItem->setField('QUANTITY', 10); // тут вводим нужное количество нужному товару
}
сохраняем корзину
$basket->save();
перезаписываем данные в заказе
$order->refreshData();
сохраняем заказ
$order->save();
Ответ написан
Комментировать
Ошибка возникает из-за несоответствия кол-ва товаров в корзине (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;
                }
            }
        }
    }
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы