Структура компонента в /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 — при изменении элементов инфоблока кэш сбросится автоматически.