Давайте рассмотрим один из вариантов реализации поставленной задачи.

Для начала шаблоне детального элемента каталога или в детальной новости создадим файл result_modifier.php. В него необходимо добавить следующий код:

Код
<?
$res = CIBlockElement::GetList(
 array(
 'sort' => 'asc'
 ),
 array(
 'IBLOCK_ID' => 1, // здесь ID инфоблока, в котором находится элемент
 'ACTIVE' => 'Y',
 'SECTION_ID' => $arResult['IBLOCK_SECTION_ID']
 ),
 false,
 array(
 'nElementID' => $arResult['ID'],
 'nPageSize' => 1
 )
);
$nearElementsSide = 'LEFT';
while ($arElem = $res->GetNext()) {
 if ($arElem['ID'] == $arResult['ID']) {
 $nearElementsSide = 'RIGHT';
 continue;
 }
 $arResult['NEAR_ELEMENTS'][$nearElementsSide][] = $arElem;
}
?>

Функцией GetList получаем список элементов. В элементе массива ‘nPageSize’ => можно указать сколько элементов выводить справа и слева от текущего. В нашем случае всего будет выведено 3 элементов: 1 предыдущих, 1 текущий и 1 следующих, если каждый из перечисленных существует. Если же выбранный элемент находится на первой или последней позиции, то выведется 2 элемента (без предыдущего или последующего соответственно).

Переменная $nearElementsSide введена для того чтобы разделить элементы в массиве $arResult[‘NEAR_ELEMENTS’] на предыдущие и последующие, для удобства.

Теперь в шаблоне детального элемента каталога или детальной новости будет доступен дополнительный массив $arResult[‘NEAR_ELEMENTS’] в котором будут элементы с двумя ключами:

  1. LEFT — предыдущие элементы
  2. RIGHT — последующие элементы
Остается только вставить их в подходящее место в шаблоне и прописать подходящие стили.