Комплексный компонент объединяет несколько страниц под одной точкой входа — список, детальную, разделы. Режим ЧПУ (SEF) превращает технические GET-параметры в человекопонятные адреса без создания отдельных физических файлов.
Что такое комплексный компонент
Обычный компонент выводит одну сущность. Комплексный компонент внутри себя вызывает несколько простых и управляет несколькими логическими страницами. Классический пример — bitrix:news, который объединяет список новостей, детальную страницу и разделы.
- одна точка подключения на странице сайта;
- внутри — переключение между режимами (список, детально, раздел);
- единая система ЧПУ для всех страниц.
bitrix:catalog — тоже комплексный компонент: он оркестрирует catalog.section, catalog.element, фильтр и другие простые компоненты.Режим ЧПУ (SEF)
SEF (Search Engine Friendly) — режим, в котором компонент формирует красивые адреса вместо ?ELEMENT_ID=15. Он включается параметрами:
'SEF_MODE' => 'Y','SEF_FOLDER' => '/news/',
Параметр SEF_FOLDER задаёт базовый путь, от которого строятся все внутренние URL. При включении SEF компонент показывает список шаблонов URL, которые можно переопределить.
.htaccess или конфигурация Nginx с правилом маршрутизации на urlrewrite.php.Шаблоны URL и переменные
Внутри SEF-настроек каждый режим имеет свой шаблон URL. Для новостей это выглядит примерно так:
| Страница | Шаблон URL | Переменные |
|---|---|---|
| Список | index.php | — |
| Раздел | #SECTION_CODE_PATH#/ | SECTION_CODE_PATH |
| Детальная | #SECTION_CODE_PATH#/#ELEMENT_CODE#/ | ELEMENT_CODE |
Переменные в решётках подставляются из символьных кодов элементов и разделов. Поэтому для красивых ЧПУ важно заполнять поле CODE у элементов инфоблока.
Как работает маршрутизация
Файл /urlrewrite.php в корне сайта содержит правила соответствия шаблонов адресов физическим файлам. При включении SEF Битрикс автоматически добавляет туда правило:
array('CONDITION' => '#^/news/#', 'RULE' => '', 'ID' => 'bitrix:news', 'PATH' => '/news/index.php')
Когда пользователь заходит на /news/company/release-15/, сервер по правилу передаёт запрос в /news/index.php, а комплексный компонент по шаблонам URL разбирает остаток пути и определяет, какую страницу показать.
Важно различать два механизма ЧПУ в Битрикс. Первый — urlrewrite.php, который работает на уровне всего сайта и маршрутизирует запрос на физический файл. Второй — внутренние шаблоны URL комплексного компонента, которые разбирают уже переданный ему путь. Ошибки чаще возникают на стыке: правило в urlrewrite.php есть, но шаблоны URL внутри компонента не совпадают со структурой ссылок, из-за чего компонент отдаёт страницу 404 при формально корректном адресе.
Порядок разбора и приоритеты
Комплексный компонент разбирает URL по объявленным шаблонам сверху вниз. Важно, чтобы более специфичные шаблоны шли раньше общих, иначе детальная страница может ошибочно распознаться как раздел.
- компонент получает остаток пути после
SEF_FOLDER; - сопоставляет его с массивом
SEF_URL_TEMPLATES; - извлекает переменные согласно
VARIABLE_ALIASES; - определяет активную страницу и подключает нужный простой компонент.
SEF_URL_TEMPLATES и VARIABLE_ALIASES можно задавать прямо в параметрах вызова компонента, а не только через визуальный редактор.Свой комплексный компонент
Чтобы сделать собственный комплексный компонент, в его коде используют функцию разбора ЧПУ:
$componentPage = $this->initComponentSEF($arVariables);
или классический механизм CComponentEngine::parseComponentPath() вместе с $APPLICATION->IncludeComponent() для дочерних компонентов. Ключевые шаги:
- объявить шаблоны URL в
arDefaultUrlTemplates404; - задать псевдонимы переменных в
arVariableAliases; - определить текущую страницу и подключить соответствующий шаблон из папки
templates/.default/с именем страницы.
В комплексном компоненте один шаблон содержит несколько файлов-страниц: например, list.php, section.php и detail.php. Метод initComponentSEF() возвращает имя активной страницы, и компонент подключает нужный файл через $this->includeComponentTemplate($componentPage). Внутри каждой страницы, как правило, вызывается простой дочерний компонент — news.list для списка и news.detail для детальной — с уже разобранными переменными в параметрах. Такой подход позволяет переиспользовать штатные простые компоненты и не дублировать выборку данных.
Частые ошибки с ЧПУ
- Пустые символьные коды. Без
CODEу элементов URL получаются по ID или ломаются — настройте автогенерацию кода из названия. - Не обновлён urlrewrite.php. Если правило не добавилось, выполните переиндексацию правил в настройках или пересохраните компонент.
- Конфликт папок. Физическая папка с тем же именем, что и SEF-раздел, перехватывает запрос раньше правила.
- Кэш ЧПУ. После изменения шаблонов URL сбрасывайте кэш компонента.
Ещё один нюанс — генерация ссылок. Внутри шаблонов дочерних компонентов ссылки на детальные и разделы формируются из параметров DETAIL_URL и SECTION_URL, которые комплексный компонент передаёт вниз уже в SEF-виде. Если жёстко прописать URL руками, при смене SEF_FOLDER ссылки перестанут соответствовать маршрутам. Поэтому всегда используйте переданные компонентом URL, а не собирайте адреса вручную из ID и кодов.
Итог
Комплексные компоненты объединяют несколько страниц под одной точкой входа, а режим SEF формирует человекопонятные адреса на основе шаблонов URL и символьных кодов. Работает это в связке с urlrewrite.php, который направляет запросы на файл компонента, где происходит разбор пути. Правильно заполненные CODE и корректный порядок шаблонов URL — залог рабочих ЧПУ.
Если нужно спроектировать сложную структуру URL для каталога или портала, обеспечить корректные ЧПУ под SEO и высокую нагрузку, мы решаем такие задачи в рамках разработки архитектуры сложных проектов и highload-решений.
Частые вопросы
Чем комплексный компонент отличается от простого?
Простой компонент выводит одну сущность, а комплексный управляет несколькими страницами и внутри вызывает простые компоненты, объединяя их единой системой ЧПУ.
Что задаёт параметр SEF_FOLDER?
Это базовый путь, от которого строятся все внутренние адреса компонента. Например, для новостей это /news/, и все ссылки формируются относительно него.
Почему ЧПУ не работают после включения SEF?
Чаще всего не включена поддержка ЧПУ в настройках сайта, не настроен urlrewrite.php или веб-сервер, либо у элементов не заполнены символьные коды.
Зачем нужны символьные коды элементов?
Из них формируются человекопонятные части URL через переменные вроде ELEMENT_CODE. Без кода адрес строится по ID или ломается.
Что делает файл urlrewrite.php?
Он содержит правила соответствия шаблонов адресов физическим файлам. По ним сервер направляет запрос ЧПУ на нужный файл компонента для дальнейшего разбора.
Можно ли задавать шаблоны URL в коде?
Да, массивы SEF_URL_TEMPLATES и VARIABLE_ALIASES можно передавать прямо в параметрах IncludeComponent, а не только настраивать через визуальный редактор.
Почему детальная страница открывается как раздел?
Скорее всего нарушен порядок шаблонов URL: более общий шаблон раздела стоит выше специфичного шаблона элемента и перехватывает разбор пути.
Поможем с настройкой и поддержкой Для разработчиков
Поможем с настройкой, доработкой и поддержкой Для разработчиков.