В разработке на 1С-Битрикс часто возникает необходимость кастомизировать вывод контента в зависимости от типа страницы. В этой статье разберем два рабочих метода определения детальной страницы товара без использования стандартных компонентов.

Зачем это нужно?
Прямое определение типа страницы позволяет:
- Управлять SEO-тегами (title, description)
- Кастомизировать хлебные крошки
- Реализовывать сложную логику шаблонов
- Оптимизировать производительность
Рассмотрим два подхода для разных сценариев.
Метод 1: Парсинг URL вручную (для кастомных решений)
Актуально для разделов с #SECTION_CODE_PATH#.
<?php
// В файле result_modifier.php или в начале шаблона
$catalogPath = trim($arParams["SEF_FOLDER"], "/");
$currentPage = $APPLICATION->GetCurPage();
// Удаляем базовый путь из текущего URL
$normalizedPath = preg_replace("#^/{$catalogPath}/#i", "/", $currentPage);
$currentPath = trim($normalizedPath, "/");
// Разбиваем на сегменты
$segments = explode("/", $currentPath);
$segments = array_filter($segments);
$arVariables = [];
$page = "list";
if (!empty($segments)) {
if (count($segments) == 1) {
$page = "section";
$arVariables["SECTION_CODE_PATH"] = $segments[0];
} else {
$possibleElementCode = array_pop($segments);
$arVariables["ELEMENT_CODE"] = $possibleElementCode;
$arVariables["SECTION_CODE_PATH"] = implode("/", $segments);
$page = "detail";
}
}
// Проверка существования элемента
if ($page === "detail") {
$res = CIBlockElement::GetList(
[],
[
"IBLOCK_ID" => $arParams["IBLOCK_ID"],
"CODE" => $arVariables["ELEMENT_CODE"],
"ACTIVE" => "Y"
],
false,
false,
["ID"]
);
if (!$res->Fetch()) {
$page = "section";
$arVariables["SECTION_CODE_PATH"] = implode("/", array_merge(
$segments,
[$arVariables["ELEMENT_CODE"]]
));
unset($arVariables["ELEMENT_CODE"]);
}
}
?>
Особенности реализации:
- Нормализация URL с помощью регулярного выражения
- Двойная проверка для вложенных разделов
- Обязательная проверка существования элемента
- Работа с SECTION_CODE_PATH для многоуровневых разделов
Метод 2: Использование CComponentEngine (стандартный подход)
Для проектов с классической структурой URL (#SECTION_CODE#):
<?php
// В файле component.php или в настройках компонента
$arUrlTemplates = [
"list" => "",
"section" => "#SECTION_CODE#/",
"detail" => "#SECTION_CODE#/#ELEMENT_CODE#/"
];
$arVariables = [];
$page = CComponentEngine::ParseComponentPath(
$arParams["SEF_FOLDER"],
$arUrlTemplates,
$arVariables
);
if (!$page) {
$page = "list";
}
// Дополнительная проверка для детальной страницы
if ($page === "detail") {
$res = CIBlockElement::GetList(
[],
[
"IBLOCK_ID" => $arParams["IBLOCK_ID"],
"CODE" => $arVariables["ELEMENT_CODE"]
],
false,
false,
["ID"]
);
if (!$res->Fetch()) {
LocalRedirect($arParams["SEF_FOLDER"] . $arVariables["SECTION_CODE"] . "/", true);
}
}
?>
Ключевые моменты:
- Использование стандартного механизма Битрикс
- Автоматическая валидация параметров
- Простая интеграция с существующими компонентами
Интеграция с шаблоном сайта
Пример управления выводом в header.php решения Аспро Лайтшоп:
<!--title_content-->
<?php if ($page !== 'detail'): ?>
<?php TSolution::ShowPageType('page_title');?>
<?php endif; ?>
<!--end-title_content-->
Дополнительные обработчики:
<?php if ($page === 'detail'): ?>
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "BreadcrumbList",
"itemListElement": [
<?php foreach($arResult['BREADCRUMBS'] as $i => $crumb): ?>
{
"@type": "ListItem",
"position": <?=($i+1)?>,
"name": "<?=$crumb['TITLE']?>",
"item": "<?=$crumb['LINK']?>"
}<?=($i < count($arResult['BREADCRUMBS'])-1 ? ',' : '')?>
<?php endforeach; ?>
]
}
</script>
<?php endif; ?>
Типовые ошибки и их решение
- Некорректное определение разделов:
- Всегда проверяйте наличие элемента через CIBlockElement
- Используйте array_filter для очистки пустых сегментов
- Проблемы с ЧПУ:
// Неправильно: $currentPath = str_replace("/catalog/", "", $currentPage); // Правильно: $currentPath = preg_replace("#^/catalog/#i", "", $currentPage);
- Кэширование переменных:
- Используйте тегированный кэш
- Добавляйте $arVariables в параметры кэширования
Заключение
Оба метода имеют свои преимущества:
- Первый подход дает полный контроль над структурой URL
- Второй способ идеален для стандартных проектов
Для сложных каталогов рекомендуем первый метод, для типовых решений – второй. Все примеры кода проверены на версиях Битрикс 22.500+ и PHP 7.4+.