Хочу поделиться интересным наблюдением поведения простых компонент bitrix:catalog.*. В одном из проектов решили использовать стандартные шаблоны компонентов каталога, хотя и знали о некоторой недоработке их шаблонов.
Одной из задач была возможность управления правами на различные типы цен, в частности "РОЗНИЦА", "ОПТ1" и "ОПТ2". Права выставляются следующие: РОЗНИЦА - права на просмотр/покупку ВСЕМ пользователям, ОПТ1 - права на просмотр ВСЕМ пользователям и покупку группе "Пользователи ОПТ1", ОПТ2 - права на просмотр ВСЕМ пользователям и покупку группе "Пользователи ОПТ2". В такой схеме возникает проблема с минимальной ценой за товарную позицию, а заключается она в том, что компонент выводит минимальную цену без учёта возможности использования её для покупки.
В качестве примера рассмотрим компонент bitrix:catalog.section и стандартный шаблон .default. При наличии у товара значений всех типов цен, компонент выводит в качестве минимального ОПТ2. Значение MIN_PRICE формируется в component.php, а затем используется и выводится в шаблоне.
Собственно в методе CIBlockPriceTools::GetItemPrices присутствует условие CAN_VIEW для типа цен, а вот CAN_BUY отсутствует. Возможно так и было задумано, но нас такое значение не устаивает, поэтому для обновления значения будем использовать result_modifier шаблона и два метода: CIBlockPriceTools::GetCatalogPrices для получения переченя типов цен с параметрами типа и с указанием, возможен ли просмотр и покупка этого типа цен для групп текущего пользователя, а также вышеупомянутый CIBlockPriceTools::GetItemPrices для получения рассчитанных с учетом скидок цен для элемента.
Остаётся лишь в цикле перебрать возвращаемые CIBlockPriceTools::GetCatalogPrices типы цен и выбрать из подходящие под условие задачи, а затем передать оставшиеся в качестве одного из параметров CIBlockPriceTools::GetItemPrices.
Дмитрий, я о другом. Да, компоненты каталога выбирают типы цен, доступные для показа и/или доступные к покупке. Но в корзину попадет цена только из типов цен, доступных к покупке (если Вы не реализовали иную логику). Из Вашего поста следует, что и показывать Вы хотите только цены с возможностью покупки. Для этого в result_modifier идет практически полный пересчет. Я потому и спрашиваю - чем не устроил вариант снять права на просмотр вместо такой тяжелой (по ресурсам сервера) кастомизации?
Группы на сайте создаются не только сотрудниками «1С-Битрикс», но и партнерами компании. Поэтому мнения участников групп могут не совпадать с позицией компании «1С-Битрикс».