Как сделать скидку в корзине по количеству согласных букв в логине пользователя?

Чтобы добавить скидку в корзине на основе количества согласных букв в логине пользователя в 1С-Битрикс, вы можете использовать событие "OnSaleOrderBeforeSaved".

1. Создайте новый модуль в вашей установке 1С-Битрикс. Для этого создайте папку local/modules, в ней создайте папку модуля, например my.module, и файл my.module.php. В файле my.module.php определите информацию о вашем модуле:

<?php
use BitrixMainLocalizationLoc;

Loc::loadMessages(__FILE__);

class my_module extends CModule
{
    public function DoInstall()
    {
        // ваш код установки модуля
    }

    public function DoUninstall()
    {
        // ваш код удаления модуля
    }
}

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

<?php
use BitrixMainEventManager;
use BitrixSaleBasket;
use BitrixSaleBasketItem;
use BitrixSaleOrder;

class my_module extends CModule
{
    public function DoInstall()
    {
        // регистрация обработчика события OnSaleOrderBeforeSaved
        $eventManager = EventManager::getInstance();
        $eventManager->registerEventHandler(
            'sale',
            'OnSaleOrderBeforeSaved',
            'my.module',
            'MyModuleMyModuleClass',
            'onSaleOrderBeforeSaved'
        );
    }

    public function DoUninstall()
    {
        // удаление обработчика события OnSaleOrderBeforeSaved
        $eventManager = EventManager::getInstance();
        $eventManager->unRegisterEventHandler(
            'sale',
            'OnSaleOrderBeforeSaved',
            'my.module',
            'MyModuleMyModuleClass',
            'onSaleOrderBeforeSaved'
        );
    }
}

class MyModuleClass
{
    public static function onSaleOrderBeforeSaved(Event $event)
    {
        $order = $event->getParameter('ENTITY');
        $basket = $order->getBasket();

        foreach ($basket as $basketItem) {
            /** @var BasketItem $basketItem */
            $quantity = $basketItem->getQuantity();
            $login = $basketItem->getField('LOGIN_PROPERTY_VALUE');

            $consonantsCount = self::countConsonants($login);

            if ($consonantsCount > 0) {
                $discount = $consonantsCount * 10; // пример: скидка 10 рублей за каждую согласную букву

                $basketItem->setField('PRICE', $basketItem->getPrice() - $discount);
                $basketItem->setField('CUSTOM_PRICE', 'Y');
            }
        }

        return $event;
    }

    private static function countConsonants($string)
    {
        $consonants = array('B', 'C', 'D', 'F', 'G', 'H', 'J', 'K', 'L', 'M', 'N', 'P', 'Q', 'R', 'S', 'T', 'V', 'X', 'Z');
        $string = strtoupper($string);

        return count(array_intersect(str_split($string), $consonants));
    }
}

3. После создания модуля, вам необходимо его установить. Зайдите в административный раздел и перейдите в раздел "Marketplace" -> "Установленные решения", найдите свой модуль и установите его.

4. После установки модуля, необходимо будет настроить событие. В административной панели 1С-Битрикс перейдите в раздел "Магазин" -> "Настройки магазина" -> "Обработка заказов". Найдите событие "OnSaleOrderBeforeSaved" и добавьте ваш модуль в список обработчиков этого события.

Теперь, при оформлении заказа в корзине, скидка будет применяться к каждому товару в зависимости от количества согласных букв в логине пользователя.