Решение задачи: показ товаров "только для участников" группе "участники"
Подход 1. Расширенные права доступа к элементам инфоблока (нативное решение)
Этот подход использует штатный механизм прав доступа, без создания дополнительных свойств.Шаг 1. Включите расширенное управление правами
Перейдите в Контент > Типы инфоблоков > [Ваш тип] > [Ваш инфоблок товаров].
На вкладке Доступ установите флажок Расширенное управление правами и сохраните инфоблок.
Шаг 2. Настройте права для конкретных товаров
Откройте карточку нужного товара (элемента инфоблока). На вкладке Доступ добавьте правило:
- Группа: Все посетители (или Все пользователи) — Нет доступа;
- Группа: [Ваша группа "участники"] — Чтение.
После сохранения товар будет виден только пользователям из группы "участники". Остальные (включая неавторизованных) увидят 404 или товар не попадёт в выборку.
Шаг 3. Программная настройка прав (если нужно массово назначить права через API):
<?php
\Bitrix\Main\Loader::includeModule('iblock');
$elementId = 123; // ID товара
$groupIdParticipants = 7; // ID группы "участники", уточните в настройках
// Создаём объект прав для элемента
$rights = new \CIBlockElementRights($elementId);
// Устанавливаем права:
// - для всех пользователей (ID=2) — нет доступа
// - для группы "участники" — чтение
$rights->SetRights([
[
'GROUP_CODE' => 'G2', // G2 = группа "Все пользователи"
'TASK_ID' => \CIBlockRights::DENY_ACCESS, // задача "Доступ закрыт"
],
[
'GROUP_CODE' => 'G' . $groupIdParticipants,
'TASK_ID' => \CIBlockRights::PUBLIC_READ, // задача "Чтение"
],
]);
?>
Проверка прав на лету (например, в кастомном компоненте):
<?php
global $USER;
$elementId = 123;
// Проверяем, может ли текущий пользователь читать элемент
$canRead = \CIBlockElementRights::UserHasRightTo(
$elementId,
'element_read', // операция "чтение элемента"
$USER->GetID()
);
if ($canRead) {
// показываем товар
} else {
// скрываем
}
?>
Подход 2. Свойство инфоблока + фильтрация в шаблоне/компоненте
Этот подход удобен, если нужно гибко управлять видимостью через флажок в карточке товара, не затрагивая систему прав.
Шаг 1. Создайте свойство
В инфоблоке товаров создайте свойство типа "Список" (или "Флажок") с символьным кодом FOR_MEMBERS_ONLY и значением "Y" — "Только для участников".
Шаг 2. В админке заполните свойство у нужных товаров
Поставьте галочку для товаров, которые должны видеть только участники.
Шаг 3. В шаблоне компонента каталога добавьте фильтрацию
В файле result_modifier.php (или в component_epilog.php) вашего шаблона компонента catalog / news.list / catalog.section добавьте проверку:
<?php
if (!defined('B_PROLOG_INCLUDED') || B_PROLOG_INCLUDED !== true) die();
global $USER;
// Определяем ID группы "участники" (замените на свой)
$participantsGroupId = 7;
// Проверяем, входит ли пользователь в группу "участники"
$isParticipant = in_array($participantsGroupId, $USER->GetUserGroupArray());
// Перебираем элементы и скрываем "закрытые" товары
if (!empty($arResult['ITEMS'])) {
foreach ($arResult['ITEMS'] as $key => $item) {
// Если свойство FOR_MEMBERS_ONLY = Y, а пользователь НЕ участник
$forMembers = ($item['PROPERTIES']['FOR_MEMBERS_ONLY']['VALUE'] ?? '') === 'Y';
if ($forMembers && !$isParticipant) {
unset($arResult['ITEMS'][$key]);
}
}
$arResult['ITEMS'] = array_values($arResult['ITEMS']); // переиндексация
}
?>
Шаг 4. Фильтрация на уровне SQL-запроса (оптимальнее)
Если у вас кастомный вызов CIBlockElement::GetList, можно отфильтровать прямо в запросе через событие OnBeforeIblockElementGetList или динамически добавить условие:
<?php
global $USER;
$participantsGroupId = 7;
$isParticipant = in_array($participantsGroupId, $USER->GetUserGroupArray());
$filter = ['IBLOCK_ID' => $iblockId];
if (!$isParticipant) {
// Исключаем товары со свойством "только для участников"
$filter['!PROPERTY_FOR_MEMBERS_ONLY'] = 'Y';
}
$result = \CIBlockElement::GetList(
['SORT' => 'ASC'],
$filter,
false,
false,
['ID', 'NAME', 'DETAIL_PAGE_URL']
);
?>
Сравнение подходов
- Подход 1 (права доступа) — самый правильный с точки зрения безопасности. Товар будет недоступен на уровне ядра: не попадёт в выборку, детальная страница вернёт 404, его нельзя будет добавить в корзину через прямой URL. Недостаток: настройка через админку чуть сложнее, нужно включать расширенное управление правами.
- Подход 2 (свойство) — проще в администрировании, наглядно (галочка в карточке товара). Недостаток: работает только в визуальной части — технически товар существует и доступен по прямому URL, если не добавить дополнительную проверку на детальной странице.
Рекомендуется комбинировать оба подхода: через Подход 1 настроить права на уровне элемента, а через Подход 2 — для удобства визуального управления флажком «Только для участников» в карточке товара.