Детальная страница выдается по адресу /catalog/#SECTION_CODE_PATH#/#ELEMENT_CODE#/
В urlrewrite вы 1 не правильно получаете ELEMENT_CODE и 2 не получаете SECTION_CODE_PATH И такая регулярка не корректна.
Внимательнее читайте доки к методам, благо для данного метода они существуют. Из документации: PROPERTY__VALUE - фильтр по значениям списка для свойств типа "список" (фильтр Маска), поиск будет осуществляться по строковому значению списка, а не по идентификатору;
Из документации: CIBlockResult::GetNext() Возвращает массив значений полей приведенный в HTML безопасный вид (в данном случае лучше уж fetch()). CIBlockResult::GetNextElement() - метод возвращает из выборки объект _CIBElement, из которого уже можно методами GetFields() и GetProperties() получить поля и свойства. Тяжелый метод, из документации (строго) рекомендуется заменить на CIBlockElement::GetPropertyValuesArray.
Благодарю, 2 вариант через RedirectMatch работает верно. Через RewriteRule первое правило почему то не редиректит с старого адреса на новый для разделов, для элементов отрабатывает верно.
Скажем так, составляется таблица, где первый столбец регулярное выражение, а второй столбец куда редиректить. Если выбирать между средствами php и .htaccess, то выбрал бы 2.
старый вариант раздела /catalog/psihologiya/ редирект на /catalog/books-psihologiya/
для элемента соответственно /catalog/psihologiya/3001/ редирект на /catalog/book-3001/