В 1С-Битрикс скидки по накопительным скидкам и скидки на заказ в правилах работы с корзиной суммируются. Техническая поддержка 1С-Битрикс говорит, что изменить этот механизм в продукте нельзя. Я написал небольшой модуль, который выбирают большую скидку и оставляет только её. Но для его работы необходимо добавить пару строк кода в модуль sale. Если вы не готовы к правке исходников — этот способ не для вас.

Предисловие

Есть следующий сценарий в работе с интернет-магазинов:
1. Пользователь попадает под одно из правил накопительной программы, например 5%
2. Сумма заказа попадает по правило работы с корзиной, например 10%

Сейчас в таком случае скидки применяются последовательно и в итоге суммируются.
Как применять только одну, самую большую скидку? В нашем случае: применить правило работы с корзиной — 10%

Модуль

Метод CSaleDiscountActionApply::ApplyBasketDiscount применяет скидку из правил работы с корзиной. В него и надо добавить кусок кода.

Конечно, я позаботился о том, где и как нужно поправить в модуле sale. На странице обновления продукта выводится огромное сообщение, что нужно внимательно обновляться и инструкция куда вставить нужный кусок кода.

В методе ApplyBasketDiscount я добавил вызов события:

// {{{ Olegpro
$bApply = false;
foreach(GetModuleEvents("sale", "CSaleDiscountActionApplyOlegpro", true) as $arEvent){
    if(ExecuteModuleEventEx($arEvent, Array(&$arOrder, $func, $dblValue, $strUnit)) === true){
        $bApply = true;
        break;
    }
}
 
if($bApply){
    return;
}
// }}}

Далее, в своём модуле я подписываюсь на это событие. Если накопительная скидка уже применена и меньше, чем скидка попадающая под правило работы с корзиной, то я отменяю эту скидку и даю применится скидке по правилу работы с корзиной. Если нет, то оставляю только накопительную скидку.

Кому нужен модуль — пишите, вышлю архив.

P.S.
Конечно, надо бы написать это на сайте идей. Но идеи там очень тяжко принимаются к рассмотрению. Напишу как-нибудь. Написал.