В 1С-Битрикс отфильтровать товары в каталоге по группе участников (группе пользователей) можно несколькими способами. Ниже приведены основные подходы.
1. Права доступа к инфоблоку (встроенный механизм)
Самый простой способ — настроить права доступа на уровне инфоблока. Если у группы пользователей нет прав на чтение элементов, эти товары не будут отображаться.
Настройка через административный раздел:
- Перейдите в Контент → Инфоблоки → Типы инфоблоков → [ваш тип] → [ваш инфоблок].
- На вкладке Доступ выберите группы пользователей и установите уровень доступа (например,
R— чтение). - Для понижельного/поэлементного управления включите опцию Расширенное управление правами в настройках инфоблока.
Программно при создании инфоблока:
use Bitrix\Main\Loader;
Loader::includeModule('iblock');
$iblock = new \CIBlock;
$result = $iblock->Add([
'IBLOCK_TYPE_ID' => 'catalog',
'NAME' => 'Каталог товаров',
'CODE' => 'products',
'API_CODE' => 'Products',
'ACTIVE' => 'Y',
'LID' => ['s1'],
'GROUP_ID' => [
2 => \CIBlockRights::PUBLIC_READ, // Все пользователи — чтение
8 => \CIBlockRights::EDIT_ACCESS, // Контент-редакторы — запись
],
]);
Группа 2 — все пользователи (включая неавторизованных). Идентификаторы групп можно узнать в Настройки → Пользователи → Группы пользователей (/bitrix/admin/group_admin.php).
2. Разные типы цен для разных групп (GroupAccessTable)
Можно создать несколько типов цен (розничная, оптовая, партнёрская) и привязать их к разным группам пользователей через Bitrix\Catalog\GroupAccessTable.
Создание типа цены с привязкой к группам:
$wholesalePriceTypeId = \CCatalogGroup::Add([
'NAME' => 'WHOLESALE',
'BASE' => 'N',
'SORT' => 200,
'USER_GROUP' => [2], // группы, которые видят эту цену
'USER_GROUP_BUY' => [8], // группы, которые могут покупать по этой цене
'USER_LANG' => [
'ru' => 'Оптовая цена',
'en' => 'Wholesale price',
],
]);
Проверка доступа к типу цены программно:
use Bitrix\Catalog\GroupAccessTable;
$accessRows = GroupAccessTable::getList([
'select' => ['CATALOG_GROUP_ID', 'GROUP_ID', 'ACCESS'],
'filter' => ['=CATALOG_GROUP_ID' => $basePriceTypeId],
])->fetchAll();
foreach ($accessRows as $row) {
if ($row['ACCESS'] === 'ACCESS_VIEW') {
echo "Группа {$row['GROUP_ID']} видит цену\n";
}
if ($row['ACCESS'] === 'ACCESS_BUY') {
echo "Группа {$row['GROUP_ID']} может покупать по этой цене\n";
}
}
Компонент bitrix:catalog автоматически выбирает нужный тип цены исходя из групп текущего пользователя. Метод \CCatalogProduct::GetOptimalPrice() также учитывает группы пользователя.
3. Программная фильтрация в result_modifier.php компонента
Если нужно отфильтровать сами товары (не только цены), добавьте код в файл result_modifier.php шаблона компонента bitrix:catalog (или bitrix:catalog.section):
global $USER;
$userGroups = $USER->GetUserGroupArray();
// Например, показываем товары только для группы с ID=8
if (!in_array(8, $userGroups)) {
// Скрываем определённые товары — фильтруем $arResult
foreach ($arResult['ITEMS'] as $key => $item) {
// Ваша логика: скрываем товары по какому-то условию
// Например, по значению свойства или по ID товара
if (in_array($item['ID'], $excludedProductIds)) {
unset($arResult['ITEMS'][$key]);
}
}
}
4. Пользовательское свойство инфоблока "Привязка к группам"
Можно создать свойство инфоблока, в котором указывать, для каких групп доступен товар. Затем фильтровать выборку по этому свойству.
Пример создания свойства типа "Список" с вариантами групп:
$property = new \CIBlockProperty;
$propertyId = $property->Add([
'IBLOCK_ID' => $iblockId,
'NAME' => 'Группы доступа',
'CODE' => 'ACCESS_GROUPS',
'PROPERTY_TYPE' => 'L', // список
'LIST_TYPE' => 'C', // флажки (множественный выбор)
'MULTIPLE' => 'Y',
'VALUES' => [
['VALUE' => 'Группа 1', 'XML_ID' => '1', 'SORT' => 100],
['VALUE' => 'Группа 2', 'XML_ID' => '2', 'SORT' => 200],
['VALUE' => 'Группа 8', 'XML_ID' => '8', 'SORT' => 300],
],
]);
Фильтрация при выборке:
global $USER;
$userGroups = $USER->GetUserGroupArray();
$filter = [
'IBLOCK_ID' => $iblockId,
'ACTIVE' => 'Y',
'PROPERTY_ACCESS_GROUPS' => $userGroups, // фильтр по значению свойства
];
$items = \CIBlockElement::GetList(
[],
$filter,
false,
false,
['ID', 'NAME', 'PROPERTY_ACCESS_GROUPS']
);
5. Скидки для групп пользователей
Метод \CCatalogDiscount::GetDiscountByProduct() позволяет получать скидки для конкретного товара с учётом групп пользователя:
global $USER;
$userGroups = $USER->GetUserGroupArray();
$discounts = \CCatalogDiscount::GetDiscountByProduct(
$productId,
$userGroups,
'N',
[$basePriceTypeId],
SITE_ID
);
Рекомендация
Выбор подхода зависит от задачи:
- Скрыть товары целиком — используйте права доступа к инфоблоку (способ №1).
- Показать разные цены разным группам — используйте типы цен + GroupAccessTable (способ №2).
- Гибкая фильтрация — используйте свойство инфоблока + программную фильтрацию (способы №3, №4).