Разработка кастомных AJAX-обработчиков 1С-Битрикс
Есть два сценария, когда нужны именно кастомные AJAX-обработчики, а не стандартные контроллеры D7. Первый — интеграция со старым кодом, который ещё не переведён на D7, и нужно дать ему AJAX-интерфейс без рефакторинга. Второй — высоконагруженные эндпоинты, где важен полный контроль над каждой миллисекундой: минимум инициализаций ядра, прямые запросы к БД, максимальная скорость ответа.
Точечная инициализация ядра Битрикс
Стандартный header.php инициализирует весь сайт — модули, сессию, права, шаблоны. Для AJAX-эндпоинта всё это — лишний overhead. Кастомный обработчик инициализирует только необходимое:
<?php
// /local/ajax/catalog-prices.php
define('NO_KEEP_STATISTIC', true); // не пишем статистику
define('NO_AGENT_STATISTIC', true); // не запускаем агентов
define('DisableEventsCheck', true); // пропускаем часть инициализации
require_once $_SERVER['DOCUMENT_ROOT'] . '/bitrix/modules/main/include/prolog_before.php';
// Только необходимые модули
\Bitrix\Main\Loader::includeModule('catalog');
\Bitrix\Main\Loader::includeModule('sale');
Такой подход сокращает время инициализации с 50–80 мс до 10–15 мс на холодном старте.
Детально: структура кастомного обработчика
Кастомный обработчик — это обычный PHP-файл с явной структурой: проверка метода, CSRF, авторизация, роутинг действий, формирование ответа:
// Проверка метода
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
http_response_code(405);
die(json_encode(['error' => 'Method Not Allowed']));
}
// CSRF-проверка
if (!check_bitrix_sessid()) {
http_response_code(403);
die(json_encode(['error' => 'CSRF check failed']));
}
// Авторизация
global $USER;
if (!$USER->IsAuthorized()) {
http_response_code(401);
die(json_encode(['error' => 'Unauthorized']));
}
// Роутинг
$action = $_POST['action'] ?? '';
$result = match($action) {
'get_price' => getPriceAction((int)($_POST['product_id'] ?? 0)),
'check_stock' => checkStockAction((int)($_POST['product_id'] ?? 0)),
default => ['error' => 'Unknown action'],
};
header('Content-Type: application/json; charset=utf-8');
echo json_encode($result, JSON_UNESCAPED_UNICODE);
Этот паттерн — с явным match по действию — предпочтительнее чем eval или call_user_func по пользовательскому вводу.
Безопасность обработчика
Валидация входных данных. Каждый параметр проходит явную типизацию и проверку диапазона:
function getPriceAction(int $productId): array {
if ($productId <= 0) {
return ['error' => 'Invalid product ID'];
}
// Проверяем доступ к товару для текущего пользователя
if (!\CIBlockElement::GetPermission($productId) >= 'R') {
return ['error' => 'Access denied'];
}
// ...
}
Rate limiting. Для публичных эндпоинтов (без авторизации) обязательна защита от злоупотреблений: не более N запросов с одного IP за M секунд. Реализуется через APC / APCu или Redis как быстрое хранилище счётчиков.
Логирование ошибок. PHP-исключения внутри обработчика не должны выводиться в HTTP-ответ — только в лог. Оборачиваем логику в try/catch с записью в \Bitrix\Main\Diag\Debug::writeToFile.
Кеширование ответов
Для данных, которые редко меняются (например, характеристики товара), ответ кешируется:
$cacheManager = \Bitrix\Main\Application::getInstance()->getManagedCache();
$cacheKey = "product_attrs_{$productId}";
if (!$cacheManager->read(3600, $cacheKey)) {
$data = loadProductAttributes($productId);
$cacheManager->set($cacheKey, $data);
} else {
$data = $cacheManager->get($cacheKey);
}
Управляемый кеш Битрикс (getManagedCache) работает с тегированным сбросом — при изменении товара тег сбрасывается автоматически.
Когда выбрать кастомный обработчик vs контроллер D7
| Критерий | Кастомный обработчик | Контроллер D7 |
|---|---|---|
| Максимальная скорость | Лучше | Хуже (больше инициализации) |
| Структура кода | Произвольная | Стандартизованная |
| Тестируемость | Сложнее | Лучше |
| Поддержка новым разработчиком | Сложнее | Проще |
| Совместимость со старым кодом | Лучше | Требует рефакторинга |
Сроки разработки
| Масштаб | Состав | Срок |
|---|---|---|
| Базовый | 5–10 эндпоинтов + CSRF + базовое кеширование | 1–2 недели |
| Средний | + rate limiting + детальное логирование + тесты | 2–4 недели |
| Расширенный | + гибридный подход (часть на D7, часть кастомные) + мониторинг | 4–6 недель |
Для новых проектов рекомендуем начинать с контроллеров D7 и переходить на кастомные обработчики только для конкретных эндпоинтов, где производительность критична и подтверждена профилировщиком.







