Система событий в Битрикс широко развита, что позволяет добавлять свою бизнес логику в проект, не затрагивая ядра продукта. В этой статье мы разберем как добавить своё событие в систему, а так же создадим обработчик для него.
$event = new \Bitrix\Main\Event("mymodule", "OnCustomBeforeSave", array($value));
$event->send();
if ($event->getResults()) {
	foreach ($event->getResults() as $evenResult) {
		if ($evenResult->getResultType() == \Bitrix\Main\EventResult::SUCCESS) {
			//Необязательно. Код для случая когда обработчик вернул успешных результат
		}
		else {
			//Необязательно. Код для случая когда обработчик вернул неуспешный результат
		}
	}
}
mymodule - код модуля в котором происходит событие. 
 OnCustomBeforeSave - код события.
 array($value) - массив параметров передоваемых в обработчик события.
Пример: обработчик внутри компонента
На одной из страниц сайта подключается компонент test:event:
<?php $APPLICATION->IncludeComponent("test:event", "", array()); ?>
Код компонента test:event:
<?php
class EventExample extends \CBitrixComponent {
	
	public function executeComponent() {
		if(!empty($_REQUEST["DATA"])) {
			if($this->beforeSaveData()) {
				/** code save data */
				
				$this->afterSaveData();
			}
		}
		$this->IncludeComponentTemplate();
	}
	
	protected function beforeSaveData() {
		$event = new \Bitrix\Main\Event("mymodule", "OnEventExampleBeforeSave", array('arData' => $_REQUEST["DATA"]));
		$event->send();
		if ($event->getResults()) {
			foreach ($event->getResults() as $evenResult) {
				if ($evenResult->getResultType() == \Bitrix\Main\EventResult::SUCCESS) {
					return true;
				}
				else {
					$arParameters = $evenResult->getParameters();
					var_dump($arParameters['errorText']);
					return false;
				}
			}
		}
	}
	
	protected function afterSaveData() {
		$event = new \Bitrix\Main\Event("mymodule", "OnEventExampleAfterSave", array($value));
		$event->send();
		if ($event->getResults()) {
			foreach ($event->getResults() as $evenResult) {
				if ($evenResult->getResultType() == \Bitrix\Main\EventResult::SUCCESS) {
					//Необязательно. Код для случая когда обработчик вернул успешных результат
				}
				else {
					//Необязательно. Код для случая когда обработчик вернул неуспешный результат
				}
			}
		}
	}
} 
При получении запроса с массивом DATA компонент производит сохранение полученных данных. Непосредственно перед сохранением и после сохранения данных вызываются методы beforeSave() и afterSave(). В обоих этих методах регистрируется событие, на которые можно добавить свои обработчики. Обработчики могут быть разными, например после сохранения полученных данных нужно так же обновить еще какие-то данные, которые с ними связаны или отправить письмо об успешном сохранении и т.д.
Важно, что если метод beforeSave() вернет false, то сохранение данных не произайдет, то есть с помощью своего обработчика события OnEventExampleBeforeSave можно влиять на то будут сохранены данные или нет.
Обработчик:
<?php 
$eventManager = \Bitrix\Main\EventManager::getInstance();
$eventManager->addEventHandler("mymodule", "OnEventExampleBeforeSave", "CustomOnEventExampleBeforeSave");
function CustomOnEventExampleBeforeSave($event) {
	$arData = $event->getParameter('arData');
	if(empty($arData["name"])) {
		$result = new \Bitrix\Main\EventResult(\Bitrix\Main\EventResult::ERROR, array("errorText" => "Empty name field"));
	}
	else {
		$result = new \Bitrix\Main\EventResult(\Bitrix\Main\EventResult::SUCCESS, ["VALUE" => 'Y']);
	}
	return $result;	
}
Внутри обработчика происходит проверка был ли передан в массиве DATA параметр name, если параметр name не был передан, то обработчик вернет ошибку.
Константы:
\Bitrix\Main\EventResult::ERROR - обработчик вернул ошибку
\Bitrix\Main\EventResult::SUCCESS - обработчик отработал успешно