Недокументированный Битрикс. Метод CIBlock::ReplaceDetailUrl() — полное руководство

CIBlock::ReplaceDetailUrl() — это «скрытый» помощник Битрикса, который заменяет плейс-холдеры в масках URL-ов элементов и разделов инфоблоков на реальные значения. Он понимает такие маркеры, как #SECTION_CODE_PATH#, #ELEMENT_CODE#, #SERVER_NAME#, умеет строить ссылку на товар через #PRODUCT_URL#, а в финале упорядочивает слэши, чтобы не было «/catalog///item/». Ниже — подробное описание работы функции и production-ready примеры.

Метод CIBlock::ReplaceDetailUrl()

Где лежит и как выглядит метод

Файл ядра: bitrix/modules/iblock/classes/general/iblock.php

public static function ReplaceDetailUrl(
    string $url,
    array  $arr,
    bool   $server_name = false,
    string $arrType = false   // 'E' — элемент, 'S' — раздел, любое|false — универсально
): string

Метод существует со времён Битрикс 9, но в официальной документации его до сих пор нет.


Поддерживаемые плейс-холдеры

Плейс-холдер Значение, которое будет подставлено
#SITE_DIR# / #LANG# Корневая директория текущего сайта / язык (при $server_name)
#SERVER_NAME# Домен сайта (при $server_name = true)
#ID#, #ELEMENT_ID# ID текущего элемента
#CODE#, #ELEMENT_CODE# Символьный код элемента (CODE или ~CODE)
#SECTION_ID# ID раздела-родителя
#SECTION_CODE# Символьный код раздела
#SECTION_CODE_PATH# Полный путь символьных кодов раздела
#IBLOCK_*# Любые данные инфоблока (ID, CODE, TYPE_ID, EXTERNAL_ID)
#EXTERNAL_ID# Внешний код элемента (поле XML_ID)
#PRODUCT_URL# URL родительского товара (только при $arrType = 'E')

Параметры метода

Параметр Что передавать
$url Маска URL (как в настройках инфоблока)
$arr Данные элемента/раздела — обычно GetNext() или результат ORM-запроса
$server_name true — добавляет SERVER_NAME и мультиязычность, false — нет
$arrType 'E' — элемент, 'S' — раздел, false — универсально

Полезные примеры (проверены на PHP 8.1 + Bitrix 23)

1. «Чистый» URL элемента на классическом API

<?php
$element = CIBlockElement::GetList(
    [],
    ['ID' => $ID],
    false,
    false,
    [
        'ID', 'IBLOCK_ID', 'IBLOCK_SECTION_ID',
        'DETAIL_PAGE_URL', 'CODE', 'EXTERNAL_ID',
        // эти поля нужны для плейс-холдеров
        'IBLOCK_TYPE_ID', 'IBLOCK_CODE', 'IBLOCK_EXTERNAL_ID',
    ]
)->GetNext();

$element['DETAIL_PAGE_URL'] = CIBlock::ReplaceDetailUrl(
    $element['DETAIL_PAGE_URL'], // маска
    $element,                    // данные
    true,                        // подставить SERVER_NAME
    'E'                          // работаем с элементом
);

// Результат: например https://site.ru/catalog/shoes/krossovki-nike/
echo $element['DETAIL_PAGE_URL'];
?>

2. D7-ORM: товар + SEO-чПУ

<?php
use Bitrix\Iblock\Elements\ElementCatalogTable;

$item = ElementCatalogTable::query()
    ->setSelect([
        '*',
        'IBLOCK.DETAIL_PAGE_URL',   // поле с маской
        'IBLOCK_SECTION_ID',
    ])
    ->where('ID', $productId)
    ->fetchObject();

$data = $item->collectValues(true);           // массив всех полей
$data['DETAIL_PAGE_URL'] = CIBlock::ReplaceDetailUrl(
    $data['IBLOCK_ELEMENT_DETAIL_PAGE_URL'],  // маска
    $data,
    true,
    'E'
);

echo $data['DETAIL_PAGE_URL'];
?>

3. Получить URL раздела (D7)

<?php
use Bitrix\Iblock\SectionTable;

$section = SectionTable::query()
    ->setSelect([
        '*',
        'IBLOCK.SECTION_PAGE_URL',
    ])
    ->where('ID', $sectionId)
    ->fetch();

$section['SECTION_PAGE_URL'] = CIBlock::ReplaceDetailUrl(
    $section['IBLOCK_SECTION_SECTION_PAGE_URL'],
    $section,
    true,
    'S'
);

echo $section['SECTION_PAGE_URL'];  // /catalog/shoes/
?>

4. Каноническая ссылка для OpenGraph

<?php
global $APPLICATION;

/** @var array $arResult из компонента news.detail */
$canonicalUrl = CIBlock::ReplaceDetailUrl(
    $arResult['DETAIL_PAGE_URL'],
    $arResult,
    true,
    'E'
);
$APPLICATION->SetPageProperty('og:url', $canonicalUrl);
?>

5. Мультиязычный магазин (ручная подстановка LANG_DIR)

<?php
$langDir = (defined('LANG_DIR_CUSTOM') ? LANG_DIR_CUSTOM : SITE_DIR);
$item['LANG_DIR'] = $langDir;

$link = CIBlock::ReplaceDetailUrl(
    $item['DETAIL_PAGE_URL'],
    $item,
    true,
    'E'
);
?>

Частые ошибки и их решения

Ошибка Проявление Решение
Не указали $arrType В ссылке остаётся #SECTION_CODE_PATH# Передайте 'E' или 'S'
В массиве нет CODE или ~CODE Плейс-холдеры #CODE# пустые Добавьте поле в select
$server_name = false в мультиязычном проекте Ссылка без домена и языка Используйте true
URL сохранился в кэше компонента Страница отдаёт старые ссылки Очистите кэш после изменения масок

Полезные приёмы

  1. Обработка списка элементов и разделов. Если в одном запросе выводите и элементы, и разделы, сначала вызовите ReplaceDetailUrl() с типом 'S' для разделов, затем 'E' для элементов. Метод лёгкий и практически не влияет на производительность.
  2. #PRODUCT_URL# для SKU. При выводе торговых предложений (SKU) подставляйте ссылку на товар-родитель, передавая массив данных товара в $arr и устанавливая $arrType = 'E'. Метод сам заменит плейс-холдер.
  3. Удаление лишних слэшей. В самом конце функция выполняет preg_replace("'(?<!:)/+'s", '/', $url), убирая повторяющиеся слэши, но не трогая протокол https://.

Итог

CIBlock::ReplaceDetailUrl() — компактный инструмент ядра 1С-Битрикс, который экономит время при генерации дружелюбных URL-ов. Используйте его вместо ручных str_replace и регулярных выражений: передавайте корректный тип сущности, включайте SERVER_NAME, когда это нужно для SEO, и держите данные элемента/раздела в полном виде — метод сделает всё остальное.


Теги:  CIBlock, ReplaceDetailUrl, URL, PHP, 1С-Битрикс, инфоблоки, SEO, мультиязычность

Стоимость услуг по разработке и сопровождению сайтов на 1C-Битрикс

Аутсорсинг

готов помочь, если нет времени

договорная

Могу взять на себя работы по full-stack на основе готовой верстки

* если нет верстки, то возможность верстать с Figma в режиме редактора

Лендинг

от 3 дней

от 25 000 рублей

Разработка одностраничного сайта на платформе Битрикс

* стоимость зависит от наличия верстки, использования готового решения и т.д.

Разработка интернет-магазина с готовой версткой

от 4 недель

от 90 000 рублей

* указана минимальная стоимость. Стоимость выбранной лицензии «1С-Битрикс» оплачивается отдельно.