Свой компонент в 1С-Битрикс: структура, class.php, шаблоны и кэширование

Обновлено 19 сентября 2026 г.

Структура компонента в /local, класс на CBitrixComponent, параметры, шаблоны и кэш — на живом примере компонента, который отдаёт эту статью.

Компонент — основная единица логики на 1С-Битрикс. Он получает данные, кэширует их и передаёт в шаблон. Разберём, как написать свой компонент правильно, на реальном примере: страница, которую вы читаете, получена от компонента rantit:studio.articles.api, который отдаёт статьи из инфоблока.

Структура

/local/components/rantit/studio.articles.api/
├── .description.php   — название и место в дереве компонентов
├── .parameters.php    — параметры для визуального редактора
├── class.php          — логика
├── lang/ru/...        — языковые файлы
└── templates/.default/template.php

Всё своё — в /local. Системная папка /bitrix перезаписывается обновлениями.

class.php

class RantitArticlesList extends CBitrixComponent
{
    public function onPrepareComponentParams($params)
    {
        $params['IBLOCK_ID'] = (int)$params['IBLOCK_ID'];
        $params['CACHE_TIME'] = (int)($params['CACHE_TIME'] ?? 3600);
        return $params;
    }

    public function executeComponent()
    {
        if ($this->startResultCache()) {
            \Bitrix\Main\Loader::includeModule('iblock');
            $this->arResult['ITEMS'] = $this->getItems();
            if (!$this->arResult['ITEMS']) {
                $this->abortResultCache();
            }
            $this->includeComponentTemplate();
        }
    }
}
  • onPrepareComponentParams — нормализуем параметры: они входят в ключ кэша.
  • startResultCache() — если кэш есть, возвращает false и сам выводит сохранённый шаблон.
  • abortResultCache() — не кэшировать пустой или ошибочный результат.

Кэш, который сбрасывается сам

Для компонентов, работающих с инфоблоками, внутри startResultCache регистрируйте тег:

global $CACHE_MANAGER;
$CACHE_MANAGER->RegisterTag('iblock_id_' . $iblockId);

Теперь при добавлении или изменении элемента кэш сбросится автоматически. Для этого в настройках сайта должно быть включено управляемое кэширование. Больше о кэше — в статье про ускорение сайта на Битрикс.

Шаблон

В шаблоне только вывод: никаких запросов к базе. Всё, что нужно шаблону, готовится в class.php или в result_modifier.php. Не забывайте экранировать вывод через htmlspecialcharsbx().

Компонент как API

Компонент не обязан выводить HTML. Наш studio.articles.api отдаёт JSON, который забирает внешний сайт на Node.js. Контент-менеджер редактирует статьи в привычной админке Битрикса, а фронтенд живёт отдельно. Вот упрощённая схема:

public function executeComponent()
{
    global $APPLICATION;
    $APPLICATION->RestartBuffer();
    header('Content-Type: application/json; charset=utf-8');
    if ($this->startResultCache(false, [$code])) {
        $this->arResult['data'] = $this->load($code);
        $this->endResultCache();
    }
    echo json_encode($this->arResult['data'], JSON_UNESCAPED_UNICODE);
    die();
}

Такой подход называют headless: Битрикс работает как хранилище контента, а сайт можно строить на чём угодно.

Частые ошибки

  • Запросы к базе в шаблоне сайта (header.php) без кэша.
  • Копия системного компонента в /local с правками — её никто не обновляет.
  • Кэш, зависящий от пользователя, без учёта групп — пользователи видят чужие данные.
  • Кэширование ошибок и пустых результатов.

Работу с данными внутри компонента разбирали в статье про инфоблоки. Если нужна разработка или ревью кода на Битриксе — пишите.

Частые вопросы

Где хранить свои компоненты Битрикс?

В папке /local/components/<пространство имён>/<имя компонента>. Папку /bitrix/components не трогайте — её перезаписывают обновления.

Можно ли править стандартный компонент?

Сам компонент — нет. Копируйте шаблон в свою тему и правьте его, а логику расширяйте через result_modifier.php, component_epilog.php или собственный компонент.

Как сбросить кэш компонента при изменении данных?

Используйте тегированный кэш: регистрируйте тег iblock_id_N внутри startResultCache — при изменении элементов инфоблока кэш сбросится автоматически.