# 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);
}
);
```