Разработка кастомных AJAX-обработчиков 1С-Битрикс
В интернет-магазине на Битрикс под нагрузкой стандартные AJAX-запросы тормозят: каталог грузится 2–3 секунды, а корзина обновляется с задержкой. Причина — инициализация всего ядра при каждом запросе: модули, сессия, шаблоны. Это лишние 50–80 миллисекунд, которые превращаются в секунды на массовых операциях. Клиент уходит, конверсия падает. Мы решаем проблему кастомными AJAX-обработчиками: точечная инициализация, прямой доступ к данным, кеширование. Разработали уже 200+ таких эндпоинтов для магазинов с товарооборотом от 10 млн рублей в месяц. Опыт разработки Битрикс — более 10 лет. Ниже разбираем технику на реальных примерах.
Как инициализировать ядро Битрикс для 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 и скрейпинга.
Почему кастомный обработчик быстрее стандартного?
Сравнение с контроллером D7:
| Критерий | Кастомный обработчик | Контроллер D7 |
|---|---|---|
| Время инициализации | 10-15 мс | 50-80 мс |
| Структура кода | Произвольная | Стандартизованная |
| Тестируемость | Сложнее | Лучше |
| Поддержка новым разработчиком | Сложнее | Проще |
| Совместимость со старым кодом | Лучше | Требует рефакторинга |
Для новых проектов рекомендуем начинать с контроллеров D7 и переходить на кастомные обработчики только для критичных по производительности эндпоинтов. Мы часто используем гибридный подход: часть логики на D7 для простоты, часть — на кастомных обработчиках для скорости.
Кейс: обработчик быстрого запроса цен
Из нашей практики: в интернет-магазине нужно было обновлять цены на странице каталога в реальном времени при выборе опций. Стандартный компонент catalog.price инициализировал всё ядро и отдавал ответ за 200-300 мс. Мы написали кастомный обработчик, который получал ID товара и возвращал цену со скидкой, используя прямой SQL-запрос к таблице b_catalog_price. Время ответа снизилось до 15-20 мс. Дополнительно настроили кеширование на 60 секунд с тегированным сбросом при изменении цены. В итоге нагрузка на сервер упала в 5 раз, а пользовательская конверсия выросла на 12%. Клиент сэкономил более 1 миллиона рублей в год на серверных ресурсах.
Кеширование ответов
Для редко меняющихся данных (характеристики, остатки) используем управляемый кеш Битрикс:
$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 и развёртыванию
- Обучение вашей команды (по запросу)
- Поддержка после сдачи (первые 30 дней бесплатно)
Сроки разработки
| Масштаб | Состав | Срок |
|---|---|---|
| Базовый | 5–10 эндпоинтов + CSRF + базовое кеширование | 1–2 недели |
| Средний | + rate limiting + детальное логирование + тесты | 2–4 недели |
| Расширенный | + гибридный подход (часть на D7, часть кастомные) + мониторинг | 4–6 недель |
Свяжитесь с нами для предварительной оценки — рассчитаем срок и стоимость индивидуально. Получите консультацию по вашему проекту. Пишите: мы ответим в течение дня.
Технология AJAX описана на Wikipedia, а документация по компонентам Битрикс — на dev.1c-bitrix.ru.







