Кастомный шаблон URL элементов инфоблока

Возникла задача: сформировать URL элемента из его символьного кода и символьного кода связанного элемента другого инфоблока. Грубо говоря шаблон должен быть таким: #PROPERTY_BRAND.CODE#/#ELEMENT_CODE#/, где PROPERTY_BRAND.CODE и будет символьный код из свойства привязки. Сразу скажу, так сделать нельзя, только если кастомить методы ядра.
Проблема в ограниченности метода \CAllIBlock::ReplaceDetailUrl() И его невозможно как-то расширить. Обсуждается это с 2013 года, вот тема https://idea.1c-bitrix.ru/ciblockreplacedetailurl-is-it-possible-to-intrude-into/
Эту задачу частично можно решить с помощью костыля. Шаблон оставляем прежним #ELEMENT_CODE#/, а в символьный код элемента добавляем код "связанного" через слэш, примерно так:

И всё, это просто работает. Что бы не заполнять символьный код вручную, можно добавить скрипт, который будет работать при сохранении элементов инфоблока:

if ($_REQUEST) { if (strpos($_REQUEST["CODE"], '/') !== false) { // символьный код текущего элемента $arCodes = explode('/', $_REQUEST["CODE"]); $sCode = end($arCodes); } else { $sCode = $_REQUEST["CODE"]; } if ($arProp = CIBlockProperty::GetList( // свойство привязки [], ['IBLOCK_ID' => $_REQUEST["IBLOCK_ID"], 'CODE' => 'BRAND'] )->Fetch()) { if ($brandId = current($_REQUEST["PROP"][$arProp["ID"]])) { if ($arBrand = CIBlockElement::GetList( // достаем символьный код связанного элемента [], ['ID' => $brandId, 'IBLOCK_ID' => $arProp['LINK_IBLOCK_ID']], false, ['nTopCount' => 1], ['CODE'] )->Fetch()) { $_POST['CODE'] = $arBrand['CODE'].'/'.$sCode; // меняем символьный код } } } }
Есть вопросы или нашли ошибку? Напишите комментарий (можно без регистрации), отвечать стараюсь быстро.