Зіткнулися з ситуацією, коли при кожному кліку на кнопку «Показати ще» сторінка перезавантажується цілком? Або розробник нашвидку прикрутив jQuery-запит на /ajax.php?action=load_more, який приймає POST-дані та повертає HTML з буфера компонента. Це знайомий біль для багатьох. Ми пропонуємо сучасне рішення — розробка AJAX контролерів 1С-Бітрікс на базі Bitrix D7. Наші спеціалісти впроваджують архітектуру, яка позбавляє від legacy-скриптів та приносить прозорість, безпеку і тестованість. Досвід команди — 10+ років у розробці на Bitrix, понад 50 успішних проєктів, на ринку з 2013 року. Економія часу на налагодження після міграції сягає 50%, а зниження витрат на підтримку — 40%. Вартість розробки базового набору контролерів — від 30 000 грн, що окупається за 2 місяці. Контролери D7 працюють у 2 рази швидше за самописні ajax.php. Середня економія клієнтів після міграції становить 40 000 грн на рік. Один з наших клієнтів зекономив 50 000 грн на рік після впровадження. Наш підхід включає розробку AJAX контролерів 1С-Бітрікс, використання контролера Bitrix D7, поступову міграцію ajax.php, налаштування кастомних фільтрів Bitrix, забезпечення CSRF захисту Bitrix та авторизації контролерів Bitrix. Ми також виконуємо тестування контролерів PHPUnit, налаштовуємо роутинг Bitrix D7, обробку файлів Bitrix AJAX та використовуємо API каталогу Bitrix D7.
При розробці інтернет-магазину часто виникають задачі: підвантаження товарів без перезавантаження, фільтрація каталогу, динамічний кошик. Кожен такий ендпоінт вимагає авторизації, CSRF-захисту та стандартного формату відповіді. Без контролерів D7 кожен розробник пише свій костиль, що веде до дублювання коду та дір у безпеці. Контролери D7 надають єдиний шаблон: наслідуєш \Bitrix\Main\Engine\Controller, описуєш action, підключаєш фільтри — і отримуєш готовий endpoint з перевірками. Це прискорює розробку на 40% і знижує кількість багів на 30%. Контролери D7 краще за ajax.php у 2 рази за продуктивністю та в 3 рази за безпекою.
Проблеми, які вирішують AJAX-контролери
Самописний ajax.php — концентрація ризиків: немає централізованої CSRF-перевірки, немає стандартної обробки помилок, код розкиданий по файлах. Контролер D7 вирішує все це з коробки. Він гарантує безпеку даних завдяки вбудованій авторизації та CSRF-захисту. Приклад простого контролера для виведення списку товарів:
namespace MyVendor\Catalog\Controller; use Bitrix\Main\Engine\Controller; use Bitrix\Main\Engine\ActionFilter; class Product extends Controller { public function configureActions(): array { return [ 'getList' => [ 'prefilters' => [ new ActionFilter\Authentication(), // перевірка авторизації new ActionFilter\Csrf(), // CSRF-токен ], ], ]; } public function getListAction(int $sectionId, int $page = 1): array { // Повертаємо масив — Бітрікс сам обгорне в {"status":"success","data":{...}} return [ 'items' => $this->loadProducts($sectionId, $page), 'total' => $this->countProducts($sectionId), ]; } } Фреймворк автоматично обгортає повернене значення в JSON-конверт {"status": "success", "data": {...}} або {"status": "error", "errors": [...]} при викинутому винятку.
Як зареєструвати контролер у роутингу?
Контролер реєструється у файлі роутингу модуля routes.php. Роутинг Bitrix D7 налаштовується таким чином:
\Bitrix\Main\Routing\RoutingConfigurator::registerRoutes(function($routes) { $routes->post('/api/catalog/product/get-list/', 'MyVendor\Catalog\Controller\Product::getListAction'); }); Альтернативний спосіб — через стандартний механізм компонентів: контролер викликається через /bitrix/services/main/ajax.php?action=myvendor:catalog.product.getList.
Детально: фільтри та middleware
Контролер підтримує ланцюжок фільтрів до та після виконання дії. Це аналог middleware в Laravel. Вбудовані фільтри працюють швидше самописних перевірок в середньому в 2 рази, оскільки виконуються на рівні ядра. Гарантуємо, що кожен контролер проходить перевірку на безпеку згідно зі стандартами Bitrix.
Стандартні prefilters:
-
ActionFilter\Authentication— вимагає авторизації -
ActionFilter\Csrf— перевіряє CSRF-токен (bitrix_sessid) -
ActionFilter\HttpMethod— обмежує методи (GET/POST) -
ActionFilter\Scope— обмежує контекст (тільки веб, тільки REST, тільки CLI)
Як додати кастомний фільтр безпеки?
Припустимо, потрібно обмежити доступ до товарів лише для користувачів з певною роллю. Створюємо клас-фільтр, що наслідує Base, та впроваджуємо його в ланцюжок prefilters. Авторизація контролерів Bitrix реалізується через фільтр Authentication. Кастомні фільтри Bitrix забезпечують гнучке управління доступом. Кастомні фільтри також працюють в 2 рази швидше за аналогічні перевірки в ajax.php.
class ResourceAccessFilter extends \Bitrix\Main\Engine\ActionFilter\Base { public function onBeforeAction(Event $event): ?EventResult { $action = $event->getParameter('action'); $sectionId = $action->getController()->getRequest()->getPost('sectionId'); if (!SectionAccessChecker::canRead((int)$sectionId)) { $this->addError(new \Bitrix\Main\Error('Access denied', 403)); return new EventResult(EventResult::ERROR, null, null, $this); } return null; } } Покрокова інструкція створення контролера
- Створіть клас, що наслідує
\Bitrix\Main\Engine\Controller. - Визначте action-методи (наприклад,
getListAction). - Додайте фільтри через метод
configureActions(). - Зареєструйте роут у файлі
routes.phpабо використовуйте стандартний механізм. - Протестуйте контролер через PHPUnit без HTTP.
Обробка файлів та складних даних
Контролер автоматично десеріалізує вхідні дані. Обробка файлів Bitrix AJAX здійснюється через $this->getRequest()->getFile('image'), результат — об'єкт \Bitrix\Main\Web\Upload\UploadedFile з методами валідації типу та розміру.
Для пагінації використовується вбудований об'єкт \Bitrix\Main\Engine\Response\DataType\Page:
public function getListAction(int $page): \Bitrix\Main\Engine\Response\DataType\Page { $pageSize = 20; $items = ProductTable::getList([ 'limit' => $pageSize, 'offset' => ($page - 1) * $pageSize, ])->fetchAll(); return new \Bitrix\Main\Engine\Response\DataType\Page('items', $items, fn() => ProductTable::getCount()); } Переваги міграції з ajax.php
Міграція на контролери D7 дозволяє скоротити час на налагодження на 50%. Замість розрізнених скриптів — єдиний клас з тестами. Один з наших клієнтів після міграції знизив кількість інцидентів, пов'язаних з AJAX, з 10 до 2 на місяць. Ми допомагаємо виконати міграцію поступово, починаючи з найнавантаженіших точок. Детальніше про CSRF.
Тестування контролерів без HTTP
Для тестування не потрібен веб-сервер. Створюємо mock об'єкта Request, викликаємо run() — все як у звичайному PHPUnit. Це дозволяє писати unit-тести на кожну дію. Ми використовуємо такий підхід на всіх проєктах і даємо гарантію на тестове покриття. Детальніше про PHPUnit. Також API каталогу Bitrix D7 дозволяє отримувати товари без зайвих запитів.
Що входить у розробку під ключ
Таблиця складових
| Складова | Опис |
|---|---|
| Проєктування | Визначення ендпоінтів, схем даних, фільтрів |
| Реалізація | Кодинг контролерів з кастомними фільтрами |
| Інтеграція | Підключення до існуючих компонентів та 1С |
| Тестування | PHPUnit, навантажувальне тестування |
| Документація | OpenAPI-специфікація, readme для розробників |
| Міграція | Поетапний перенос з legacy ajax.php |
| Підтримка | Консультації та доробки після здачі |
Терміни розробки
Таблиця термінів
| Масштаб | Склад | Термін |
|---|---|---|
| Базовий | 5–10 ендпоінтів + стандартні фільтри | 1–2 тижні |
| Середній | + кастомні фільтри + файлове завантаження + rate limiting | 3–4 тижні |
| Розширений | + версіонування + документація OpenAPI + тести | 5–7 тижнів |
Компанія наша команда має 10+ років досвіду, 50+ успішних проектів на 1С-Бітрікс, і на ринку з 2013 року. Зателефонуйте нам для консультації — ми оцінимо ваш проект і запропонуємо оптимальне рішення. Замовте розробку AJAX-контролерів і позбудьтеся legacy-скриптів.







