В CCatalogProduct::GetOptimalPrice должны также приходить поля товара. Так как бывает что цена торгового предложения генерируется исходя из его полей. Столкнулся с задачей: нужно добавлять торговые предложения с одним и тем же ID, но разными свойствами (от которых зависит цена которую пересчитываю в AddEventHandler("catalog", "OnGetOptimalPrice", "MyGetOptimalPrice";)

и так как туда приходит только ID товара не возможно отличить одно ТП от другого и как результат у них одна цена на всех. А если бы приходили ещё и поля, то проблемы не было бы никакой.