Эта проблема на форуме не однократно поднималась, единственное рабочее решение, которое я видел это использовать старое CSaleDiscount::DoProcessOrder
Я и тут где-то писал, что не работает и в техподдержку (2176105) даже привел пример в демолаборатории(правда пока ответили на тикет срок истек), но дальше копаться не мог. Предполагаю, что большую роль играет версия модуля sale(На 17 у меня так и не заработало) и ошибка кроется либо в каком-то не указанном параметре, либо не подключенном методе.
Александр Яровой, попробуйте еще указать конкретный купон
$discount->setApplyResult(array(
'COUPON_LIST' =>
array (
'код купона' => 'Y',
)
));