Метод CComponentEngine::ParseComponentPath()
— инструмент для обработки ЧПУ в комплексных компонентах 1С-Битрикс. В этой статье мы разберем его работу, приведем практические примеры и раскроем нюансы использования.

Что делает метод?
Метод анализирует текущий URL, сопоставляет его с шаблонами путей компонента и возвращает идентификатор подходящего шаблона. При этом он извлекает переменные, заданные в URL, что упрощает обработку динамических страниц.
Синтаксис:
mixed CComponentEngine::ParseComponentPath(
string $folder404,
array $arUrlTemplates,
array &$arVariables,
string $requestURL = false
);
Параметры
Параметр | Описание |
---|---|
folder404 |
Путь компонента (соответствует $arParams["SEF_FOLDER"] ). |
arUrlTemplates |
Массив шаблонов URL компонента. |
arVariables |
Ссылка на массив для извлеченных переменных. |
requestURL |
Опциональный URL для анализа (по умолчанию — текущая страница). |
Пример базового использования
// Шаблоны URL компонента
$arUrlTemplates = [
"list" => "index.php",
"section" => "#SECTION_ID#/",
"detail" => "#SECTION_ID#/#ELEMENT_ID#.php"
];
// Папка компонента в режиме ЧПУ
$arParams["SEF_FOLDER"] = "/catalog/";
// Текущий URL: /catalog/15/123.php
$arVariables = [];
$page = CComponentEngine::ParseComponentPath(
$arParams["SEF_FOLDER"],
$arUrlTemplates,
$arVariables
);
// Результат:
// $page = "detail"
// $arVariables = ["SECTION_ID" => 15, "ELEMENT_ID" => 123]
Расширенные сценарии
1. Работа с Query-параметрами
Метод обрабатывает только путь до ?
. Для параметров после знака вопроса используйте initComponentVariables
:
CComponentEngine::InitComponentVariables(
$page,
["SECTION_ID", "ELEMENT_ID"],
["detail" => ["SECTION_ID" => "SECTION", "ELEMENT_ID" => "ID"]],
$arVariables
);
// Теперь $arVariables содержит параметры из URL и query-строки
2. "Жадные" шаблоны (Greedy Parts)
Для захвата путей с /
добавьте "жадные" части:
$engine = new CComponentEngine();
$engine->addGreedyPart("SECTION_CODE_PATH");
$arUrlTemplates = [
"section" => "#SECTION_CODE_PATH#/"
];
// URL: /catalog/electronics/mobile/
// $arVariables["SECTION_CODE_PATH"] = "electronics/mobile"
3. Кастомный requestURL
Анализ произвольного URL:
$page = CComponentEngine::ParseComponentPath(
"/catalog/",
$arUrlTemplates,
$arVariables,
"/catalog/42/test.php"
);
Типичные ошибки и их решение
Ошибка 1: Неверный формат шаблонов
Неправильно:
"detail" => "/#SECTION_ID#/#ELEMENT_ID#.php" // Лишний слеш в начале
Правильно:
"detail" => "#SECTION_ID#/#ELEMENT_ID#.php"
Ошибка 2: Переменные не извлекаются
Убедитесь, что SEF_FOLDER
совпадает с базовым путем:
// Если SEF_FOLDER = "/blog/", а запрос /news/..., метод вернет false
Ошибка 3: Не учитывается порядок шаблонов
Шаблоны сортируются в порядке:
- Без переменных (
"list" => "index.php"
) - С обычными переменными (
"section" => "#SECTION_ID#/"
) - С "жадными" частями
Пример правильной сортировки:
$arUrlTemplates = [
"list" => "index.php",
"detail" => "#SECTION_ID#/#ELEMENT_ID#.php",
"section_tree" => "#SECTION_CODE_PATH#/"
];
Полный пример компонента
class CatalogComponent extends CBitrixComponent {
public function executeComponent() {
$this->arParams["SEF_FOLDER"] = "/catalog/";
$this->arParams["SEF_URL_TEMPLATES"] = [
"sections" => "sections/",
"section" => "#SECTION_CODE#/",
"detail" => "#SECTION_CODE#/#ELEMENT_CODE#.php"
];
$arUrlTemplates = CComponentEngine::MakeComponentUrlTemplates(
["sections" => "sections/", "section" => "#SECTION_CODE#/"],
$this->arParams["SEF_URL_TEMPLATES"]
);
$arVariables = [];
$engine = new CComponentEngine();
$engine->addGreedyPart("SECTION_CODE");
$page = $engine->guessComponentPath(
$this->arParams["SEF_FOLDER"],
$arUrlTemplates,
$arVariables
);
CComponentEngine::InitComponentVariables(
$page,
["SECTION_CODE", "ELEMENT_CODE"],
[],
$arVariables
);
$this->arResult = $arVariables;
$this->includeComponentTemplate($page);
}
}
Заключение
ParseComponentPath
— инструмент для реализации ЧПУ в комплексных компонентах. Правильное использование шаблонов, учет порядка их определения и работа с переменными позволяют создавать удобные и SEO-оптимизированные URL. Тестируйте ваши шаблоны с помощью параметра requestURL
и не забывайте обрабатывать "жадные" части для сложных структур.