- Допустим вы пишите код для битрикса, создаете компонент или модуль, и хотели бы через асинхронные вызовы менять сущности битрикса. Через классы D7 легко написать свой обработчик или бекенд, назвать его ajax.php и обращаться к нему. Но если нужно делать стандартные операции, которые есть в Bitrix REST, то незачем все писать с нуля. Можно использовать встроенный ajax.runAction https://dev.1c-bitrix.ru/api_help/js_lib/ajax/bx_ajax_runaction.php
Например, взять задачу из БД. Для этого нужно написать:
| 1 2 3 4 5 6 7 8 9 10 |     BX.ajax.runAction('tasks.task.get', {         data: {             taskId: 206,             select: ['ID', 'RESPONSIBLE_ID', 'UF_SOME_USER_FIELD']         }     }).then(function (response) {         console.log(response)     }) | 
Который вернет ответ
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | {     "task": {         "id": "206",         "responsibleId": "1",         "favorite": "N",         "ufSomeUserField": "YES",         "group": [],         "responsible": {             "id": "1",             "name": "Алмат Жандаулетов",             "link": "/company/personal/user/1/",             "icon": "/bitrix/images/tasks/default_avatar.png",             "workPosition": ""         },         "action": {             bla-bla         }     } } | 
Или обновить саму Задачу, для примера обновлю пользовательское поле UF_SOME_USER_FIELD:
| 1 2 3 4 5 6 7 8 9 10 | BX.ajax.runAction('tasks.task.update', {         data: {             taskId: 206,             fields: {'UF_SOME_USER_FIELD': 'awesome'}         }     }).then(function (response) {         console.log(response)     }) | 
Откуда брать параметры?
В этом поможет документация REST https://dev.1c-bitrix.ru/rest_help/tasks/task/tasks/tasks_task_get.php
Хоть в документации REST и используется другой класс JS BX24.callMethod его можно заменить на BX.ajax.runAction, то есть нам становятся доступны все операции над сущностями. Ура!🎉
Хотя странно, ведь документация REST говорит об обратном:
Для использования методов REST необходимо либо создать локальное приложение в рамках конкретного Битрикс24 или вебхук, либо разработать тиражное решение и добавить его в партнерский кабинет.
Если заглянуть под капот?
Этот же код можно вызвать другим способом
| 1 2 3 4 5 6 7 8 9 10 | BX.ajax.runAction('bitrix:tasks.rest.controllers.task.get', {         data: {             taskId: 206,             select: ['ID', 'RESPONSIBLE_ID', 'UF_SOME_USER_FIELD']         }     }).then(function (response) {         console.log(response)     }) | 
который вернет то самое

Откуда взялся bitrix:tasks.rest.controllers.task.get ?
Для этого нужно обратиться к документации Контроллеры
Контроллер — часть модуля, отвечаюший за REST or Ajax вызовы.
Посмотрим как они настроены в задачах
bitrix/modules/tasks/.settings.php
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | 'controllers' => [ 		'value' => [ 			'namespaces' => [ 				'\\Bitrix\\Tasks\\Rest\\Controllers' => 'api', 				'\\Bitrix\\Tasks\\Scrum\\Controllers' => 'scrum', 			], 			'defaultNamespace' => '\\Bitrix\\Tasks\\Rest\\Controllers', 			'restIntegration' => [ 				'enabled'=>true 			], 		], 		'readonly' => true, 	], | 
Namespace \\Bitrix\\Tasks\\Rest\\Controllers — как раз отвечает за первую часть пути bitrix:tasks.rest.controllers
Откуда взялся task.get?
В модуле есть класс bitrix/modules/tasks/lib/rest/controllers/task.php, который обрабатывает все запросы. Метод же называется \Bitrix\Tasks\Rest\Controllers\Task::getAction
get — название метода
Action — указывает что это роут, похожая система есть как в Laravel, так и в YII2
Откуда взялся taskId?
Пришлось долго подебажит, но в итоге оказалось, что с помощью цепочек, сложно запутанной, рефлексии, код анализирует параметры, которые поступают в метод. 99% этого кода вам не понадобиться, но если интересно, то посмотрите
\Bitrix\Main\Engine\AutoWire\Parameter::__construct вот эту строчку
| 1 2 3 4 5 | $externalNameConstructor = function(\ReflectionParameter $parameter){ 					return $parameter->getName() . 'Id'; 				}; | 
также в самом контроллере метод
| 1 2 3 | getAutoWiredParameters | 
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |  public function getAutoWiredParameters()     {         return [             new Parameter(                 \CTaskItem::class,                 function ($className, $id) { 					if (($id = (int)$id) <= 0) 					{ 						throw new SystemException('wrong task id'); 					}                     return new $className($id, CurrentUser::get()->getId());                 }             ),             new Parameter(                 Template::class,                 function ($className, $id) {                     return new $className($id, CurrentUser::get()->getId());                 }             ),         ];     } | 
