@borisevstratov

Почему при ручном добавлении товара в корзину заказа товар добавляется со статусом «не активен»?

Приветствую! Столкнулся с такой проблемой:

Редактирую заказ через API D7: необходимо добавить товар в корзину заказа.
Ниже приведён фрагмент кода, который добавляет товар в корзину заказа:

<?php
// Данные для примера
$orderId = 100;
$catalogId = 457;
$quantity = 1;
$price = 100;

// Загружаем заказ и получаем его корзину
$orderBx = Sale\Order::loadByAccountNumber($orderId);
$basketBx = $orderBx->getBasket();

// Добавляем товар в корзину заказа
$ProductAdd = $basketBx->createItem('catalog', $catalogId);
                        
// Так как товар добавляется "пустым" (практически без свойств), то подгрузим свойства из БД
$iblock = CIBlockElement::GetByID($catalogId)->GetNext();
$cprice = CPrice::GetList(array(),array("PRODUCT_ID" => $catalogId))->GetNext();
$ccatalog_res = CCatalogProduct::GetByID($catalogId);                         
$measure = CCatalogMeasure::getList(array(),array("ID" => $ccatalog_res['MEASURE']))->GetNext();

$dimensions = serialize(array(
    "WIDTH"     => $ccatalog_res["WIDTH"],
    "HEIGHT"    => $ccatalog_res["HEIGHT"],
    "LENGTH"    => $ccatalog_res["LENGTH"]
));

// Заполним поля товара
$ProductAdd->setFields(array(
    'NAME' 			    => $iblock['NAME'],
    'DETAIL_PAGE_URL'   => $iblock['DETAIL_PAGE_URL'],
    'PRODUCT_ID'	    => $catalogId,
    'PRODUCT_PRICE_ID'  => $cprice['ID'],
    'QUANTITY'		    => $quantity,
    'CURRENCY'		    => Bitrix\Currency\CurrencyManager::getBaseCurrency(),
    'LID' 			    => Bitrix\Main\Context::getCurrent()->getSite(),
    'PRICE' 		    => $price,
    'BASE_PRICE'	    => $price,
    'CUSTOM_PRICE' 	    => 'Y',
    'WEIGHT'		    => $ccatalog_res['WEIGHT'],
    'DIMENSIONS'	    => $dimensions,
    'NOTES'			    => $cprice['CATALOG_GROUP_NAME'],
    'MEASURE_CODE'	    => $measure['CODE'],
    'MEASURE_NAME'	    => $measure['SYMBOL'],
    'CATALOG_XML_ID'    => 'aspro_mshop_catalog_s1',
    'PRODUCT_XML_ID'    => $catalogId,
    'PRODUCT_PROVIDER_CLASS' => 'CCatalogProductProvider',
    'DELAY'			    => 'N',
    'CAN_BUY'		    => 'Y',
    'IGNORE_CALLBACK_FUNC'	=> 'Y'
));
 
// Сохраним товар
$ProductAdd->save();

// Сохраним корзину
$basketBx->save();
?>


После выполнения кода товар действительно попадает в корзину со всеми назначенными свойствами и сохраняется в заказе. Но при просмотре заказа через админ.панель товары иногда (скорее всего, когда в корзине уже присутствовала данная позиция — см. скриншот) помечаются зачёркнутыми и при наведении на название возникает надпись "Товар не активен".

5d762aa91fa5a790524474.png

Подскажите, в чём может быть проблема и как её можно решить?
  • Вопрос задан
  • 1928 просмотров
Пригласить эксперта
Ответы на вопрос 1
winer
@winer
занимаюсь разработкой сайтов на 1c-bitrix
<?
\Bitrix\Main\Loader::includeModule("sale");
\Bitrix\Main\Loader::includeModule("catalog");


\Bitrix\Sale\Order::load($orderId);
$basket = $order->getBasket();
$shipmentCollection = $order->getShipmentCollection();

$products = [1, 2, 3];
$quantity = 1;
$newBasketItems = [];

//Добавляем новые товары в корзину
foreach ($products as $productId) {
    $item = $basket->createItem('catalog', $productId);
    $item->setFields(array(
        'QUANTITY' => $quantity,
        'CURRENCY' => \Bitrix\Currency\CurrencyManager::getBaseCurrency(),
        'LID' => $order->getSiteId(),
        'PRODUCT_PROVIDER_CLASS' => 'CCatalogProductProvider',
    ));
    $item->setField("QUANTITY", $quantity);
    $newBasketItems[] = $item;
}

//Теперь эти товары надо добавить в отгрузку. В примере добавляю в первую попавшуюся
foreach ($shipmentCollection as $shipment) {
    if (!$shipment->isSystem()) {
        foreach ($newBasketItems as $newBasketItem) {
            /** @var \Bitrix\Sale\Shipment $shipment */
            $shipmentItemCollection = $shipment->getShipmentItemCollection();
            $shipmentItem = $shipmentItemCollection->createItem($newBasketItem);
            $shipmentItem->setQuantity($item->getQuantity());
        }
        break;
    }
}



//Пересчитываем заказ
$discount = $order->getDiscount();
$result = new \Bitrix\Main\Result();

\Bitrix\Sale\DiscountCouponsManager::clearApply(true);
\Bitrix\Sale\DiscountCouponsManager::useSavedCouponsForApply(true);
$discount->setOrderRefresh(true);
$discount->setApplyResult(array());

$res = $basket->refreshData(array('PRICE', 'COUPONS'));

if (!$res->isSuccess())
    $result->addErrors($res->getErrors());


$res = $discount->calculate();
if (!$res->isSuccess())
    $result->addErrors($res->getErrors());

if (!$order->isCanceled() && !$order->isPaid()) {
    /** @var \Bitrix\Sale\PaymentCollection $paymentCollection */
    if (($paymentCollection = $order->getPaymentCollection()) && count($paymentCollection) == 1) {
        /** @var \Bitrix\Sale\Payment $payment */
        if (($payment = $paymentCollection->rewind()) && !$payment->isPaid()) {
            $payment->setFieldNoDemand('SUM', $order->getPrice());
        }
    }
}

//Сохраняем заказ, а не корзину
//Если обработка идет в каком то событии заказа, то метод save вызывать не надо
$order->save();
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы