Розробка кастомних 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 та переходити на кастомні обробники лише для конкретних ендпоінтів, де продуктивність критична та підтверджена профайлером.







