Bitrix: предыдущий с последующий элементы для news.detail (через запросы)

Замечательно работавший код без кеша, с кешем компонентов, превратился в «говно», довольно часто стало такое происходить, с этим битриксом.

Посмотрев исходник и запрос, решено было его переписать в рабочий вариант (код стал легче и быстрее)
$iid = $arParams["IBLOCK_ID"];
$dpu = $arParams["DETAIL_URL"];

$q = $DB->query("SET @rank_prev = 0, @rank_cur = 0");
$q = "SELECT prev.ID as ID, prev.NAME as NAME, REPLACE('$dpu', '#ELEMENT_CODE#', prev.CODE) as LINK
FROM (SELECT @rank_cur:=@rank_cur+1 AS rank, ID, NAME, CODE FROM b_iblock_element WHERE ACTIVE = 'Y' AND IBLOCK_ID = '$iid' ORDER BY ACTIVE_FROM DESC) as cur
INNER JOIN (SELECT @rank_prev:=@rank_prev+1 AS rank, ID, NAME, CODE FROM b_iblock_element WHERE ACTIVE = 'Y' AND IBLOCK_ID = '$iid' ORDER BY ACTIVE_FROM DESC) as prev
ON prev.rank + 1 = cur.rank
WHERE cur.ID = ".$arResult["ID"];
$q = $DB->query($q);
while ($ob = $q->getNext()) $arResult["LEFT_ARROW"] = $ob;

$q = $DB->query("SET @rank_cur = 0, @rank_next = 0");
$q = "SELECT next.ID as ID, next.NAME as NAME, REPLACE('$dpu', '#ELEMENT_CODE#', next.CODE) as LINK
FROM (SELECT @rank_cur:=@rank_cur+1 AS rank, ID, NAME, CODE FROM b_iblock_element WHERE ACTIVE = 'Y' AND IBLOCK_ID = '$iid' ORDER BY ACTIVE_FROM DESC) as cur
INNER JOIN (SELECT @rank_next:=@rank_next+1 AS rank, ID, NAME, CODE FROM b_iblock_element WHERE ACTIVE = 'Y' AND IBLOCK_ID = '$iid' ORDER BY ACTIVE_FROM DESC) as next
ON cur.rank + 1 = next.rank
WHERE cur.ID = ".$arResult["ID"];
$q = $DB->query($q);
while ($ob = $q->getNext()) $arResult["RIGHT_ARROW"] = $ob;

Bitrix: предыдущий с последующий элементы для news.detail

<?
// файл result_modifier.php news.detail

// упорядочиваем как и в разделе. (получить автоматом нельзя)
$arOrder = array("ACTIVE_FROM" => "DESC"); 
$arSelect = Array("ID", "NAME", "DETAIL_PAGE_URL");
$arFilter = Array("IBLOCK_ID"=>$arParams["IBLOCK_ID"], "ACTIVE_DATE"=>"Y", "ACTIVE"=>"Y");
$res = CIBlockElement::GetList($arOrder, $arFilter, false, array("nPageSize" => "1","nElementID" => $arResult["ID"]), $arSelect);
//"nPageSize" - количество элементов на странице при постраничной навигации 
//"nElementID" - ID элемента который будет выбран вместе со своими соседями. Количество соседей определяется параметром nPageSize.
while($ob = $res->GetNext()) $arFields[] = $ob;

// упорядочиваем соседей, если нет левого или правого
if (count($arFields) == 2 && $arResult["ID"] == $arFields["0"]["ID"]) {	
	$arFields["2"] = $arFields["1"]; 
	unset($arFields["0"]); 
}

if (isset($arFields["0"])) 
	$arResult["LEFT_ARROW"] = array(
		"LINK" => $arFields["0"]["DETAIL_PAGE_URL"],
		"NAME" => $arFields["0"]["NAME"]
	);

if (isset($arFields["2"])) 
	$arResult["RIGHT_ARROW"] = array(
		"LINK" => $arFields["2"]["DETAIL_PAGE_URL"],
		"NAME" => $arFields["2"]["NAME"]
	);
?>