Произвольная цена или скидка в bitrix

В рамках одной из задачь на работе потребовалось выводить цену со скидкой, которая бралась из свойства инфоблока. В документации bitrix сей процесс не описанн, поэтому описываю у себя.

Все действия будут проходить в init.php

Изначально нам необходимо подписаться на событие добавления товара в корзину. В нашем обработчике указываем класс провайдера который будет отвечать за обработку полей товара в корзине и оформлении заказа. И важно выставить флаг CUSTOM_PRICE в Y, без обработчик не работает на странице оформления заказа.

AddEventHandler('sale', 'OnBeforeBasketAdd', 'BeforeBasketAddHandler');

function BeforeBasketAddHandler(&$arFields)
{
    $arFields['PRODUCT_PROVIDER_CLASS'] = 'CCatalogProductProviderCustom';
    $arFields['CUSTOM_PRICE'] = 'Y';
}

После чего определяем класс провайдера

class CCatalogProductProviderCustom extends CCatalogProductProvider
{
    public static function GetProductData($arParams)
    {
        $arResult = CCatalogProductProvider::GetProductData($arParams);

        $arResult['PRICE'] = 100; // Здесь присваиваем новую цену без учёта скидки, общая цена будет равна $arResult['PRICE'] + $arResult['DISCOUNT_PRICE']
        $arResult['DISCOUNT_PRICE'] = 50; // Здесь определяем размер скидки

        return $arResult;
    }

    public static function OrderProduct($arParams)
    {
        $arResult = CCatalogProductProvider::OrderProduct($arParams);

        $arResult['PRICE'] = 100; // Здесь присваиваем новую цену без учёта скидки, общая цена будет равна $arResult['PRICE'] + $arResult['DISCOUNT_PRICE']
        $arResult['DISCOUNT_PRICE'] = 50; // Здесь определяем размер скидки

        return $arResult;
    }
}

Готово!