Розробка AJAX-контролерів 1С-Бітрікс

Наша компанія займається розробкою, підтримкою та обслуговуванням рішень на Бітрікс та Бітрікс24 будь-якої складності. Від простих односторінкових сайтів до складних інтернет-магазинів, CRM систем з інтеграцією 1С та телефонії. Досвід розробників підтверджено сертифікатами від вендора.
Пропоновані послуги
Показано 1 з 1 послугУсі 1626 послуг
Розробка AJAX-контролерів 1С-Бітрікс
Середня
~1-2 тижні
Часті питання

Наші компетенції:

Етапи розробки

Останні роботи

  • image_website-b2b-advance_0.png
    Розробка сайту компанії B2B ADVANCE
    1262
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Розробка веб-сайту для компанії ФІКСПЕР
    851
  • image_bitrix-bitrix-24-1c_development_of_an_online_appointment_booking_widget_for_a_medical_center_594_0.webp
    Розробка на базі Бітрікс, Бітрікс24, 1С для компанії Development of an Online
    585
  • image_bitrix-bitrix-24-1c_mirsanbel_458_0.webp
    Розробка на базі 1С Підприємство для компанії МИРСАНБЕЛ
    751
  • image_crm_dolbimby_434_0.webp
    Розробка сайту на CRM Бітрікс24 для компанії DOLBIMBY
    657
  • image_crm_technotorgcomplex_453_0.webp
    Розробка на базі Бітрікс24 для компанії ТЕХНОТОРГКОМПЛЕКС
    989

Розробка AJAX-контролерів 1С-Бітрікс

Компонент Бітрікс виводить список товарів з кнопкою «Показати ще». При кліку сторінка перезавантажується повністю — або розробник прикрутив jQuery-запит на /ajax.php?action=load_more, який приймає POST-дані та повертає HTML з буфера компонента. Це робочий, але архаїчний підхід. Бітрікс D7 надає контролери — \Bitrix\Main\Engine\Controller — які дають структурований спосіб створення AJAX-ендпоінтів з авторизацією, CSRF-захистом та стандартним форматом відповіді.

Чим контролер D7 кращий за саморобний ajax.php

Саморобний ajax.php — концентрація ризиків: немає централізованої CSRF-перевірки, немає стандартної обробки помилок, немає автоматичної авторизації, код розкиданий по файлах. Контролер D7 вирішує все це з коробки:

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:

// У .settings.php модуля або через метод Application::getInstance()->getRouter()
\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.

Стандартні prefilters:

  • ActionFilter\Authentication — вимагає авторизації
  • ActionFilter\Csrf — перевіряє CSRF-токен (bitrix_sessid)
  • ActionFilter\HttpMethod — обмежує методи (GET/POST)
  • ActionFilter\Scope — обмежує контекст (тільки веб, тільки REST, тільки CLI)

Кастомний фільтр — наприклад, перевірка прав на конкретний ресурс:

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;
    }
}

Обробка файлів та складних даних

Контролер автоматично десеріалізує вхідні дані. Для завантаження файлів — через $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());
}

Тестування контролерів

Контролери D7 можна тестувати через PHPUnit без HTTP-запиту: створюється екземпляр контролера, підміняється Request, викликається run(). Це великий плюс порівняно з саморобними ajax.php, які тестувати складно.

Терміни розробки

Масштаб Склад Термін
Базовий 5–10 ендпоінтів + стандартні фільтри 1–2 тижні
Середній + кастомні фільтри + файлове завантаження + rate limiting 3–4 тижні
Розширений + версіонування + документація OpenAPI + тести 5–7 тижнів

Якщо на проекті вже є саморобні ajax.php, їх варто мігрувати на контролери поступово, починаючи з найбільш навантажених або проблемних ендпоінтів.