Задача:
В CMS битрикс для текущего товара получить ссылки на предыдущий и следующий элемент (по id).
Решение:
Можно воспользоваться параметром arNavStartParams метода CIBlockElement::GetList. Т.е. в четвёртый аргумент CIBlockElement::GetList передаём в параметр nElementIDid элемента, для которого нужно найти соседей. Чтобы он нашел только одного соседа сверху и снизу ограничиваем выборку параметром nPageSize.
При этом нужно выполнить следующие указания, чтобы метод сработал:
- 3-ий аргумент(
arGroupBy) методаGetListдолжен быть равенfalse. - Последний аргумент(
arSelectFields) методаGetListдолжен содержатьID. - Должна быть задана сортировка по
ID.
Нюансы результата выборки:
- Если
ID, для которого ищутся соседи, последний, то сосед сверху будет отсутствовать. - Сортировка по
"catalog_*"учитываться не будет. - В результате метода добавится поле
RANK(порядковый номер элемента в «полной» выборке).
Реализация:
<?php
// id инфоблока
$IBLOCK_ID = 1;
// id элемента для которого ищем соседей
$ID = 31;
$query = CIBlockElement::GetList(array('ID' => 'ASC'), array(
'IBLOCK_ID' => $IBLOCK_ID,
'ACTIVE' => 'Y',
'SECTION_GLOBAL_ACTIVE' => 'Y'),
false, array('nPageSize' => 1, 'nElementID' => $ID),
array('ID', 'DETAIL_PAGE_URL')
);
while($elem = $query->GetNextElement()){
$arFields = $elem->GetFields();
var_dump($arFields['RANK']);
var_dump($arFields['ID']);
var_dump($arFields['DETAIL_PAGE_URL']);
}
?>
Результат:
Если использовать данный код в шаблоне детальной страницы в комплексном компоненте, то вместо $ID нужно передавать $arResult['ID'] и поместить весь код в файл result_modifier.php рабочего шаблона детальной страницы.
Для чего это может понадобиться: данный приём можно использовать для SEO оптимизации сайта, как вариант для внутренней перелинковки.

Спасибо за статью, а что вернет код, если это последний id?
Думала как раз внедрить такую линковку в карточке товара.
Если текущий элемент крайний снизу или сверху, возвращается два элемента: соответственно, один элемент — текущий и еще один соседний, либо справа, либо слева. Для последнего сначала вернется предыдущий, потом текущий.
Недавно думал, как эти две ситуации можно изящно обработать, все равно получилась куча условий.