1) Нужно добавить товар в корзину заказа:
//$products массив id товаров, которые надо добавить
$basket = $order->getBasket();
$quantity = 1;
foreach ($products as $productId) {
$item = $basket->createItem('catalog', $productId);
$item->setFields(array(
'CURRENCY' => \Bitrix\Currency\CurrencyManager::getBaseCurrency(),
'LID' => \Bitrix\Main\Context::getCurrent()->getSite(),
'PRODUCT_PROVIDER_CLASS' => 'CCatalogProductProvider',
));
$item->setField("QUANTITY", quantity);
$newBasketItems[] = $item;
}
2) Добавить новые товары из корзины в отгрузку (или создать новую отгрузку и добавить туда)
//В этом примере товары добавляются в первую попавшуюся НЕ СИСТЕМНУЮ отгрузку.
$shipmentCollection = $order->getShipmentCollection();
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;
}
}
3) Пересчитать заказ
$discount = $order->getDiscount();
\Bitrix\Sale\DiscountCouponsManager::clearApply(true);
\Bitrix\Sale\DiscountCouponsManager::useSavedCouponsForApply(true);
$discount->setOrderRefresh(true);
$discount->setApplyResult(array());
/** @var \Bitrix\Sale\Basket $basket */
if (!($basket = $order->getBasket())) {
throw new \Bitrix\Main\ObjectNotFoundException('Entity "Basket" not found');
}
$basket->refreshData(array('PRICE', 'COUPONS'));
$discount->calculate();
$order->save();