Главное правило кастомизации в Битрикс — не редактировать файлы в /bitrix/components/. Любая правка ядра будет затёрта при обновлении. Разберём легальные слои переопределения: от копии шаблона до собственного класса компонента в /local/.
Уровни кастомизации
Прежде чем что-то менять, определите минимально достаточный уровень вмешательства. От этого зависит, что придётся поддерживать при обновлениях.
| Задача | Слой |
|---|---|
| Изменить только вёрстку | Копия шаблона компонента |
| Подготовить/дополнить данные | result_modifier.php |
| Динамика мимо кэша (title, крошки) | component_epilog.php |
| Изменить логику выборки | Копия компонента в /local/ |
result_modifier.php, а полное копирование класса компонента нужно лишь при изменении самой бизнес-логики.Копирование шаблона компонента
Самый частый сценарий — своя вёрстка. В визуальном редакторе есть кнопка «Копировать шаблон», которая создаёт копию в шаблоне сайта. Тот же результат даёт программный вызов:
CBitrixComponent::includeComponentTemplate() — вызывается автоматически,
а копию создаёт метод:
$obTemplate->CopyTemplateFiles();
Структурно копия ложится по пути:
/local/templates/<шаблон_сайта>/components/bitrix/news.list/<мой_шаблон>/template.php
В вызове компонента шаблон указывается шестым параметром:
$APPLICATION->IncludeComponent(
'bitrix:news.list',
'my_template', // имя вашего шаблона
[ /* параметры */ ]
);
Так вы полностью контролируете HTML, но при этом наследуете логику типового компонента и получаете его обновления.
Внутри скопированного шаблона доступны все переменные вывода: $arResult, $arParams, объект $this и вспомогательные методы вроде $this->GetFolder() для путей к ассетам шаблона. Стили и скрипты кладут рядом в style.css и script.js — ядро подключает их автоматически при рендере шаблона. Это удобно: вся вёрстка компонента вместе с оформлением живёт в одной папке и переносится между проектами целиком.
.default и приоритет /local над /bitrix
Битрикс ищет файлы по цепочке приоритетов. Каталог /local/ всегда важнее /bitrix/, поэтому именно туда кладут все кастомизации.
Порядок поиска шаблона компонента:
/local/templates/<шаблон>/components/.../bitrix/templates/<шаблон>/components/.../local/components/.../templates/.../bitrix/components/.../templates/...
Шаблон с именем .default — это стандартный шаблон компонента «из коробки». Его не переименовывают: вместо этого делают копию под своим именем. Если вызвать компонент с шаблоном .default, но положить свою копию в /local/templates/.../components/, она перекроет оригинал без изменения имени вызова.
result_modifier.php для данных
Когда данных в $arResult не хватает или их нужно преобразовать, не засоряйте template.php запросами к БД. Для этого есть result_modifier.php — он выполняется перед шаблоном и его результат кэшируется вместе с шаблоном.
<?php // result_modifier.php
foreach ($arResult['ITEMS'] as &$item) {
$item['PRICE_FORMATTED'] =
number_format($item['PROPERTIES']['PRICE']['VALUE'], 0, '', ' ') . ' ₽';
}
unset($item);
?>
Когда копируют весь компонент
Если нужно изменить саму логику — состав выборки, обработку параметров, кэш-ключи, — копируют компонент целиком в /local/components/ под собственным пространством имён (не bitrix):
/local/components/vendor/news.list/component.php
/local/components/vendor/news.list/.parameters.php
/local/components/vendor/news.list/.description.php
/local/components/vendor/news.list/templates/.default/template.php
Вызывается такой компонент уже под своим именем: $APPLICATION->IncludeComponent('vendor:news.list', ...). Минус в том, что вы теряете обновления типового компонента, поэтому этот путь оправдан только для существенных изменений логики. Перед копированием честно оцените, нельзя ли добиться цели обработчиками событий инфоблоков или result_modifier — это дешевле в поддержке и не отвязывает от обновлений платформы.
- наследование от
\CBitrixComponentпозволяет переопределить лишь нужные методы; - для комплексных компонентов копируют и
component.php, и файлы страниц из папки шаблона.
Чего делать нельзя
Несколько антипаттернов, которые ломают проекты при первом же обновлении платформы:
- Править файлы в
/bitrix/components/bitrix/— обновление вернёт оригинал; - Переименовывать
.defaultвместо создания копии; - Класть кастомные компоненты в пространство
bitrix:— конфликт при апдейте; - Держать бизнес-логику в
template.php— она не переиспользуется и попадает в кэш непредсказуемо.
$APPLICATION->IncludeComponent с параметром отладки шаблонов.Итог
Кастомизация в Битрикс — это дисциплина слоёв: вёрстку меняют копией шаблона, данные — через result_modifier.php, динамику мимо кэша — в component_epilog.php, а логику — копией компонента в /local/. Всё, что лежит в /bitrix/, считайте неприкосновенным.
Мы в B2Bsite выстраиваем кастомизации так, чтобы проект спокойно проходил обновления ядра и маркетплейс-решений: правки живут в /local/, логика отделена от вёрстки, а кэш не хранит чужих данных.
Частые вопросы
Можно ли редактировать компоненты в /bitrix/components/bitrix/?
Нет. При обновлении платформы эти файлы перезаписываются, и правки исчезнут. Все изменения выносят в /local/ либо в копию шаблона внутри шаблона сайта.
Чем отличается копирование шаблона от копирования всего компонента?
Копия шаблона меняет только вёрстку и оставляет типовую логику с её обновлениями. Копия всего компонента нужна, когда требуется изменить выборку данных или обработку параметров, но она отвязывает вас от обновлений.
Почему /local имеет приоритет над /bitrix?
Так устроена цепочка поиска файлов в ядре: каталог /local проверяется первым. Это позволяет переопределять компоненты и шаблоны, не трогая стандартные каталоги платформы.
Где выполнять тяжёлые запросы для дополнения $arResult?
Небольшие преобразования уместны в result_modifier.php, но он кэшируется. Тяжёлые или персональные выборки лучше делать в component_epilog.php или отдельным AJAX-запросом, чтобы не портить кэш.
Что такое шаблон .default?
Это стандартный шаблон компонента, поставляемый вместе с ним. Его не переименовывают: под свою вёрстку создают копию с новым именем либо кладут переопределение в /local.
Как узнать, какой шаблон реально подключился?
Включите отладку шаблонов компонентов — Битрикс выведет в HTML путь к использованному файлу шаблона. Это помогает понять, из какого каталога цепочки приоритетов взялся template.php.
Нужно ли использовать своё пространство имён для копии компонента?
Да. Кастомные компоненты кладут под своим вендорным неймспейсом, например vendor:news.list, а не bitrix:, чтобы избежать конфликтов при обновлении стандартных компонентов.
Поможем с настройкой и поддержкой Для разработчиков
Поможем с настройкой, доработкой и поддержкой Для разработчиков.