На одном из наших недавних внедрений Битрикс24 использовался как бекенд для другой внешней системы — для личного кабинета студента. Через личный кабинет абитуриенты и студенты могут подать заявку на обучение по выбранному курсу, загрузить необходимые для оформления документы, следить за статусом своей заявки, оплачивать счета за обучение, а так же взаимодействовать со своими кураторами. Все это очень плотно интегрированно с бизнес-процессами Битрикс24. Для такой плотной интеграции Битрикс со сторонней системой нам не хватало стандартных REST-методов — логика использования запросов становилась слишком сложной и запутанной.
До нашего прихода на проект много логики уже было реализовано на стороне кабинета студента, что делало его слишком сильно связанным с Битрикс24 и нарушало принципы SOLID-разработки.
Выходом оказалось написание собственных REST-методов. Конечно, кому-то может показаться, что можно было бы просто создать публичную страницу которая будет отдавать на внешний запрос результат в виде JSON объекта, но такой подход является неправильным по нескольким причинам:
1. Это может быть не безопасно.
2. Это не удобно, так как во внешней системе в ходе интеграции придется по-разному писать запросы к стандартным REST-методам и к таким страницам.
К счастью, разработчики Битрикс24 предусмотрели возможность писать собственные REST-методы для расширения стандартных. Это очень просто. Пишем собственный класс-провайдер для своих методов:
class CustomRestProvider
{
public static function OnRestServiceBuildDescription()
{
return array(
'custom' => array(
'custom.hello.world' => array('callback' =>
array(__CLASS__, 'HelloWorld'),'options' =>
array()),
)
);
}
public static function HelloWorld($query, $n, \CRestServer $server){
$result = array();
$result['HELLO']='WORLD';
return $result;
}
}
И регистрируем его в php_interface, повесив обработчик на событие:
$eventManager->addEventHandler("rest","OnRestServiceBuildDescription",array('CustomRestProvider', 'OnRestServiceBuildDescription'));

Все готово.
Класс CustomRestProvider содержит метод OnRestServiceBuildDescription вызывающийся на одноименном событии. Данный метод возвращает массив, ключами которого являются ваши новые scope а значения — массив методов этого scope. Работать со scope можно также как и со стандартными.
Теперь можно обратиться к методу custom.hello.world также как и к стандартным REST-методам. Не забудьте дать права на новые scope вашим вебхукам:
