В итоге получилась вот такая ерундовина, которая автоматически добавляет подарки в корзину:
[CODE]<?
AddEventHandler("sale", "OnBasketAdd", "OnBasketAddHandler2");
function OnBasketAddHandler2($ID, $arFields) {
$productsNeedAdd = array();
$productsInBasketID = array();
$userID = \Bitrix\Sale\Fuser::getId();
$allSum = 0; $allWeight = 0; $basketItems = array();
$dbBasketItems = CSaleBasket::GetList(
array(),
array(
'FUSER_ID' => $userID,
'LID' => 's1',
'ORDER_ID' => 'NULL'
),
false,
false,
array()
);
while($arItem = $dbBasketItems->Fetch()) {
$productsInBasketID[] = $arItem['PRODUCT_ID'];
$allSum += ($arItem["PRICE"] * $arItem["QUANTITY"]);
$allWeight += ($arItem["WEIGHT"] * $arItem["QUANTITY"]);
$basketItems[] = $arItem;
}
$arOrder = array(
'SITE_ID' => 's1',
'USER_ID' => $userID,
'ORDER_PRICE' => $allSum,
'ORDER_WEIGHT' => $allWeight,
'BASKET_ITEMS' => $basketItems
);
$arOptions = array();
$arErrors = array();
CSaleDiscount::DoProcessOrder($arOrder, $arOptions, $arErrors);
$basket = \Bitrix\Sale\Basket::loadItemsForFUser($userID, 's1');
$giftManager = \Bitrix\Sale\Discount\Gift\Manager::getInstance();
$giftManager->setUserId($userID);
$giftCollection = $giftManager->getCollectionsByBasket($basket, $arOrder['FULL_DISCOUNT_LIST'], $arOrder['DISCOUNT_LIST']);
foreach($giftCollection as $collection) {
foreach($collection as $gift) {
$pID = $gift->getProductId();
$productsNeedAdd[] = $pID;
}
}
foreach($productsNeedAdd as $key => $val) {
if(!in_array($val, $productsInBasketID)) {
Add2BasketByProductID($val, 1);
}
}
}
?>[/CODE]
Как видно из кода, срабатывает только при добавлении нового товара в корзину, поэтому для обработки купонов с подарками есть ещё код, добавляющий и сразу удаляющий из корзины специальный служебный товар.