В обработчике события OnSaleComponentOrderResultPrepared делаем следующее: 1) Получаем список активных правил корзины 2) Проверяем, подходит ли какое-либо правило под сумму товаров в корзине. 3) Получаем размер скидки этого правила (пусть например 15%) 4) Ищем среди существующих купонов многоразовый купон, который даёт скидку 15% (заранее создать в админке по одному многоразовому купону для каждого правила) 5) Применяем этот купон через CCatalogDiscountCoupon::SetCoupon .
Решение похоже на финт ушами, админ делает лишнюю работу : к каждому правилу работы с корзиной создаётся по купону, хотя правила работы с корзиной должны и так работать. До конца не уверен, все ли пункты можно реализовать средствами API. Да и решение это корявое, по сути делаем ту работу, которую должен бы был сделать битрикс.
Потом ещё один ньюанс: если применяется в корзине одновременно купон и правило работы с корзиной, то скидка формируется по какому-то хитрому алгоритму, т.е., например купон на скидку 50% и правило работы со скидкой 10% дадут в итоге 53.5% . Соответственно, мой велосипед это пока-что не учитывает и велосипед придётся модифицировать ещё и под эту ситуацию.