Ошибка возникает из-за несоответствия кол-ва товаров в корзине (
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;
}
}
}
}
}