Почему DETAIL_PAGE_URL в Битрикс возвращает ссылку без раздела и как это исправить
При работе с 1С-Битрикс многие разработчики сталкиваются с неожиданным поведением свойства DETAIL_PAGE_URL. Казалось бы, если в настройках инфоблока указан шаблон вида:
#SECTION_CODE_PATH#/#ELEMENT_CODE#/
то при получении ссылки на элемент через API можно ожидать URL вроде:
/catalog/noutbuki/macbook-air-m4/
Однако на практике часто оказывается, что DETAIL_PAGE_URL возвращает только URL элемента без раздела:
/macbook-air-m4/
Из-за этого возникают ошибки в хлебных крошках, перелинковке, sitemap и шаблонах компонентов.
Проверяем, задан ли символьный код раздела
Если в URL элемента должен использоваться #SECTION_CODE# или #SECTION_CODE_PATH#, первым делом стоит убедиться, что у раздела вообще задан символьный код.
Для этого откройте нужный раздел инфоблока и перейдите на вкладку «Дополнительно». Если поле «Символьный код» пустое, заполните его вручную.
Чтобы не заполнять это поле вручную при создании новых разделов, можно включить автоматическую генерацию символьного кода в настройках инфоблока.

После включения этой настройки символьный код будет автоматически формироваться для новых разделов. Однако для уже существующих разделов и элементов автозаполнение не сработает — их символьные коды потребуется задать вручную.
Если символьный код раздела отсутствует, макросы #SECTION_CODE# и #SECTION_CODE_PATH# не смогут быть подставлены в URL, и в результате DETAIL_PAGE_URL может формироваться без раздела или вовсе некорректно.
Почему DETAIL_PAGE_URL работает «не так»?
Свойство DETAIL_PAGE_URL не формируется автоматически на основе текущего раздела. Битрикс подставляет значения только из тех полей, которые присутствуют в выборке.
Например, если выполнить запрос:
$res = CIBlockElement::GetList(
[],
['IBLOCK_ID' => 2],
false,
false,
['ID', 'NAME', 'DETAIL_PAGE_URL']
);
то можно получить ссылку:
/macbook-air-m4/
потому что в запросе отсутствует информация о разделе.
Проблема с SECTION_CODE
Многие ожидают, что Битрикс автоматически определит раздел элемента и подставит его в URL. Но это работает не всегда.
Особенно часто проблема проявляется, если:
- элемент привязан к нескольким разделам;
- используется выборка через CIBlockElement::GetList();
- запрос выполняется вне компонентов Битрикс;
- элемент находится в дополнительном разделе;
- используется собственный шаблон ЧПУ.
Как правильно получать URL элемента
Лучше сразу запрашивать данные о разделе:
$res = CIBlockElement::GetList(
[],
['IBLOCK_ID' => 2],
false,
false,
[
'ID',
'NAME',
'DETAIL_PAGE_URL',
'IBLOCK_SECTION_ID'
]
);
А ещё надёжнее использовать метод:
CIBlock::ReplaceDetailUrl(
$arElement['DETAIL_PAGE_URL'],
$arElement,
true,
'E'
);
Он принудительно заменяет макросы и формирует итоговую ссылку.
Если элемент находится в нескольких разделах
В этом случае Битрикс не всегда может однозначно определить, какой именно путь использовать.
Например:
- Каталог → Ноутбуки → MacBook Air M4;
- Акции → Скидки → MacBook Air M4.
Один и тот же элемент может иметь несколько путей, поэтому поле DETAIL_PAGE_URL не содержит информации о разделе.
Если необходимо получать полный URL, рекомендуется использовать привязку к основному разделу или самостоятельно получать SECTION_CODE_PATH.
Частая ошибка в шаблонах компонентов
Многие разработчики выводят ссылки так:
<a href="<?=$arItem['DETAIL_PAGE_URL']?>">
<?=$arItem['NAME']?>
</a>
А затем удивляются, почему ссылки ведут не туда или работают только на части сайта.
Если компонент не получил поле SECTION_CODE_PATH, то ссылка может оказаться неполной.
Как правильно настроить ЧПУ инфоблока
В настройках инфоблока желательно использовать:
URL страницы раздела:
#SITE_DIR#/catalog/#SECTION_CODE_PATH#/
URL детальной страницы:
#SITE_DIR#/catalog/#SECTION_CODE_PATH#/#ELEMENT_CODE#/
При использовании комплексных компонентов эти настройки позволяют строить логичную структуру адресов.
Когда DETAIL_PAGE_URL можно доверять
Обычно проблем не возникает, если:
- элемент находится только в одном разделе;
- используются стандартные компоненты Битрикс;
- в выборку попадает SECTION_CODE_PATH;
- не используется многосайтовость и сложные ЧПУ.
Вывод
Поле DETAIL_PAGE_URL в 1С-Битрикс не всегда возвращает готовую ссылку, которую ожидает разработчик. Оно зависит от настроек инфоблока, выбранных полей и структуры разделов.
Если ссылки формируются неправильно, стоит проверить наличие SECTION_CODE_PATH, настройки ЧПУ и способ получения данных. В сложных проектах безопаснее самостоятельно формировать URL или использовать CIBlock::ReplaceDetailUrl(), чем слепо доверять содержимому DETAIL_PAGE_URL.
Комментарии