Вопрос справедлив для версии битрикса > 18.
Собственно, в чем вопрос: есть инфоблок, в инфоблоке есть разделы, в каталоге стоит проверка уникальности ЧПУ.
Но по умолчанию "проверка уникальности" проверяет ЧПУ для всего ифноблока целиком, т.е. два разных раздела не могут иметь два разных товара с одним и тем же ЧПУ.
Т.е. физическое расположение этих товаров разное (в разных разделах), однако система представляет их как одинаковые (и если один товар в одном разделе с этим ЧПУ уже есть, то с созданием вторым в другом разделе - и его отображением - наступает облом).
Вопрос: что и как надо сделать, что и как в каком файле поменять, чтобы проверка уникальности ЧПУ осуществлялась на уровне раздела?
Отключаете стандартную проверку на уникальность символьного кода в настройках ИБ.
Пишите собственную функцию проверки символьного кода на уникальность в рамках раздела (например checkElementXmlId($xmlId, $sectionId)). Проверку выполняйте с помощью CIblockElement::GetList
Пишите собственные обработчики событий OnBeforeIBlockElementAdd и OnBeforeIBlockElementUpdate. В этих событиях проверяйте XML_ID элемента с помощью ранее написанного метода checkElementXmlId. Примеры обработчиков событий можете по ссылка на страницах с документацией.
Если почитать инет - то там до 15 версии это дело правилось буквально в одной строчке.
(файла component.php скопированного в свое пространство имен catalog.element)