Евгений Широколобов,
Есть масса способов как это сделать.
Навскидку несколько способов:
1) Проверка полной цепочки
Например, пришла ссылка /catalog/test1/test2/test3/test4/
Вы проверяете что test1 это раздел, что test2 это раздел test1, элемент test3 это раздел вложенный в test2 и т.п.
Вы по факту двигаетесь рекурсивно и сравниваете является ли то что пользователь ввел разделом вложенным в исходный или элементом (вложенным в исходный).
Мороки много, геморроя много, производительность не сильно хорошая.
Можно воспользоваться стандартным комплексным компонентом и его модифицировать
2) Проверка остатка цепочки:
Например, пришла ссылка /catalog/test1/test2/test3/test4/
Вы проверяете только последний уровень, т.е. test4 - является ли он элементом, разделом или не существует (404)
3) Деление цепочек:
Вы умышленно разделяете маски:
- /product/#CODE#/ используется только для элементов
- /catalog/#SECTION_CODE_PATH#/ используется только для разделов.
Таким образом при обработке первого типа Вы ищете только по элементам, во втором случае только по разделам. Производительность которую вы потеряете на разделах нивелируется быстрым открытием элемента. При этом не важно в каких группах у Вас находится товар, для поисковика и человека он будет иметь всегда одну ссылку