# 15. События Bitrix (EventManager)

[← Оглавление](./index.md)

---

События — ключевой механизм расширения Битрикс без изменения ядра. Тонкие подписчики и делегирование в сервис — обязательный стандарт.

## Тонкий обработчик — логика в сервисе

**ПЛОХО — ВСЯ ЛОГИКА В ТЕЛЕ ОБРАБОТЧИКА**
```php
AddEventHandler('crm', 'OnAfterCrmLeadAdd', function(array &$fields): void {
    // 50+ строк: отправка писем, запись в лог, вызов внешних API...
    $mailer = new \PHPMailer\PHPMailer\PHPMailer();
    $mailer->setFrom(['no-reply@example.com']);
    $mailer->addAddress($fields['EMAIL']);
    // ...
});
```

**ХОРОШО — ПОДПИСЧИК ДЕЛЕГИРУЕТ В СЕРВИС**
```php
class LeadEventSubscriber {
    /** Обработчик намеренно тонкий — вся логика в сервисе. */
    public static function onAfterLeadAdd(array &$fields): void {
        \Bitrix\Main\DI\ServiceLocator::getInstance()
            ->get(LeadNotificationService::class)
            ->notifyOnLeadCreated((int)$fields['ID']);
    }
}

// Регистрация в init.php (условно):
\Bitrix\Main\EventManager::getInstance()->addEventHandler(
    'crm',
    'OnAfterCrmLeadAdd',
    [LeadEventSubscriber::class, 'onAfterLeadAdd'],
);
```

---

## Современный API событий (Bitrix\Main\Event)

**ОБЪЕКТНО-ОРИЕНТИРОВАННЫЙ EVENT API ВМЕСТО AddEventHandler**
```php
\Bitrix\Main\EventManager::getInstance()->addEventHandlerCompatible(
    'crm',
    '\Bitrix\Crm\Service\Operation\Add::onAfterRun',
    static function (\Bitrix\Main\Event $event): \Bitrix\Main\EventResult {
        $lead = $event->getParameter('ITEM');
        if ($lead instanceof \Bitrix\Crm\Item\Lead) {
            \Bitrix\Main\DI\ServiceLocator::getInstance()
                ->get(LeadNotificationService::class)
                ->notifyOnLeadCreated($lead->getId());
        }
        return new \Bitrix\Main\EventResult(\Bitrix\Main\EventResult::SUCCESS);
    }
);
```