Розробка кастомних AJAX-обробників 1С-Бітрікс
Маємо 10+ років досвіду та понад 200 реалізованих AJAX-ендпоінтів. В інтернет-магазині на Бітрікс під навантаженням стандартні AJAX-запити гальмують: каталог завантажується 2–3 секунди, а кошик оновлюється із затримкою. Причина — ініціалізація всього ядра при кожному запиті: модулі, сесія, шаблони. Це зайві 50–80 мілісекунд, які перетворюються на секунди на масових операціях. Клієнт іде, конверсія падає. Ми вирішуємо проблему кастомними AJAX-обробниками: точкова ініціалізація, прямий доступ до даних, кешування. Кастомний обробник у 5 разів швидший за стандартний D7-контролер. Розробили вже 200+ таких ендпоінтів для магазинів зі значним товарообігом. Наш досвід розробки Бітрікс — понад 10 років, ми сертифіковані партнери 1С-Бітрікс. Нижче розбираємо техніку на реальних прикладах.
Як створити кастомний AJAX-обробник: покрокова інструкція
- Створіть файл обробника у /local/ajax/ або /bitrix/ajax/.
-
Визначте константи, щоб вимкнути непотрібну ініціалізацію:
NO_KEEP_STATISTIC,NO_AGENT_STATISTIC,DisableEventsCheck. - Підключіть прототип
prolog_before.phpта лише необхідні модулі черезLoader::includeModule. - Реалізуйте логіку відповіді: валідація запиту, виконання дії, формування JSON.
- Забезпечте безпеку: CSRF (
check_bitrix_sessid()), перевірка прав доступу, типізація параметрів, rate limiting. - Налаштуйте кешування для даних, що рідко змінюються, через керований кеш.
Ініціалізація ядра Бітрікс для 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 мс на холодному старті. Для ендпоінта, який викликається 1000 разів на хвилину, економія становить до 70% процесорного часу.
Як забезпечити безпеку кастомного обробника?
Безпека будується на декількох рівнях. CSRF-захист — обов'язковий check_bitrix_sessid(). Валідація — кожен параметр приводиться до типу і перевіряється діапазон. Rate limiting — для публічних ендпоінтів обмежуємо кількість запитів з однієї IP (наприклад, не більше 10 на секунду).
Приклад структури обробника:
if ($_SERVER['REQUEST_METHOD'] !== 'POST') { http_response_code(405); die(json_encode(['error' => 'Method Not Allowed'])); } 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); Валідація кожного параметра — явна типізація та перевірка прав через CIBlockElement::GetPermission. Помилки логуються в \Bitrix\Main\Diag\Debug::writeToFile, клієнт отримує лише загальне повідомлення.
Rate limiting реалізується через APCu або Redis. Для авторизованих користувачів ліміт вищий (100 запитів на хвилину), для анонімів — жорсткіший (20 запитів на хвилину). Це захищає від DDoS та скрейпінгу.
Чому кастомний обробник швидший за стандартний?
Кастомний обробник у 5 разів швидший за стандартний D7-контролер. Порівняння з контролером D7:
| Критерій | Кастомний обробник | Контролер D7 |
|---|---|---|
| Час ініціалізації | 10-15 мс | 50-80 мс |
| Структура коду | Довільна | Стандартизована |
| Тестованість | Складніше | Краще |
| Підтримка новим розробником | Складніше | Простіше |
| Сумісність зі старим кодом | Краще | Вимагає рефакторингу |
Для нових проєктів рекомендуємо починати з контролерів D7 і переходити на кастомні обробники тільки для критичних за продуктивністю ендпоінтів. Ми часто використовуємо гібридний підхід: частина логіки на D7 для простоти, частина — на кастомних обробниках для швидкості.
Кейс: обробник швидкого запиту цін
Із практики: в одного з наших клієнтів, інтернет-магазину з великим товарообігом, потрібно було оновлювати ціни на сторінці каталогу в реальному часі при виборі опцій. Стандартний компонент catalog.price ініціалізував все ядро і віддавав відповідь за 200-300 мс. Ми написали кастомний обробник, який отримував ID товару і повертав ціну зі знижкою, використовуючи прямий SQL-запит до таблиці b_catalog_price. Час відповіді знизився до 15-20 мс. Додатково налаштували кешування на 60 секунд із тегованим скиданням при зміні ціни. У підсумку навантаження на сервер впало в 5 разів, а користувацька конверсія зросла на 12%. Це дозволило значно зменшити витрати.
Кешування відповідей
Для даних, що рідко змінюються (характеристики, залишки), використовуємо керований кеш Бітрікс:
$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); } Теговане скидання — при зміні товару кеш анулюється автоматично. Це дає актуальність даних без зайвих запитів.
Приклад налаштування rate limiting через APCu
$ip = $_SERVER['REMOTE_ADDR']; $key = "rate_limit_{$ip}"; $limit = 20; // запитів на хвилину для анонімів $interval = 60; if (apcu_exists($key)) { $count = apcu_inc($key); if ($count > $limit) { http_response_code(429); die(json_encode(['error' => 'Too Many Requests'])); } } else { apcu_add($key, 1, $interval); } Що входить у розробку кастомного AJAX-обробника?
- Проєктування архітектури та вибір ендпоінтів
- Написання коду з точковою ініціалізацією ядра
- Реалізація CSRF, авторизації, валідації та rate limiting
- Кешування відповідей із тегованим скиданням
- Інтеграція з існуючими компонентами та модулями
- Тестування продуктивності та безпеки
- Документація з API та розгортання
- Навчання вашої команди (за запитом)
- Гарантія на код — 12 місяців
- Вартість базового набору (5–10 ендпоінтів) — від 30 000 грн.
Терміни розробки
| Масштаб | Склад | Термін |
|---|---|---|
| Базовий | 5–10 ендпоінтів + CSRF + базове кешування | 1–2 тижні |
| Середній | + rate limiting + детальне логування + тести | 2–4 тижні |
| Розширений | + гібридний підхід (частина на D7, частина кастомні) + моніторинг | 4–6 тижнів |
Зв'яжіться з нами для попередньої оцінки — розрахуємо термін і вартість індивідуально. Отримайте консультацію по вашому проєкту. Пишіть: ми відповімо протягом дня.
Технологія AJAX описана на Wikipedia, а документація по компонентах Бітрікс — на dev.1c-bitrix.ru.







