В 1С-Битрикс существует два режима управления правами для инфоблоков:
1. Простой режим
Права задаются для всего инфоблока целиком. Настроить их можно в форме редактирования инфоблока на вкладке Доступ:
- Контент → Инфоблоки → Типы инфоблоков → [нужный тип] → [нужный инфоблок] → вкладка Доступ
2. Расширенный режим
Позволяет задавать права для отдельных разделов и элементов инфоблока. Чтобы его включить:
- Откройте настройки инфоблока
- Включите опцию Расширенное управление правами
- Откройте форму редактирования конкретного элемента или раздела
- На вкладке Доступ установите права для выбранных групп пользователей
Права наследуются по иерархии: от инфоблока к разделу и элементу. Если пользователь имеет полный доступ на инфоблок, он может управлять доступом к его элементам.
Как определить права доступа программно (через API)
Для работы с правами на элементы используются следующие классы модуля iblock (файл: /bitrix/modules/iblock/classes/general/iblock_rights.php):
- CIBlockRights — управление правами на инфоблок
- CIBlockSectionRights — управление правами на раздел
- CIBlockElementRights — управление правами на элемент
Метод 1. Проверка, есть ли у пользователя конкретное право на элемент
Статический метод CIBlockElementRights::UserHasRightTo:
\Bitrix\Main\Loader::includeModule('iblock');
$iblockId = 1; // ID инфоблока
$elementId = 15; // ID элемента
$permission = 'element_read'; // название операции (права)
$hasRight = CIBlockElementRights::UserHasRightTo(
$iblockId,
$elementId,
$permission
);
if ($hasRight)
{
echo "Пользователь имеет право {$permission} на элемент {$elementId}";
}
else
{
echo "Доступ запрещён";
}
Метод 2. Получение списка всех прав на элемент
Метод CIBlockElementRights::GetRights():
\Bitrix\Main\Loader::includeModule('iblock');
$elementId = 15;
$iblockId = 1;
$obElementRights = new CIBlockElementRights($iblockId, $elementId);
$arRights = $obElementRights->GetRights();
echo '<pre>';
print_r($arRights);
echo '</pre>';
Метод возвращает массив, где ключ — ID права, а значения содержат:
GROUP_CODE— код группы (например,G1— группа с ID=1,U1— пользователь с ID=1)TASK_ID— ID уровня доступа (задачи)DO_INHERIT— наследуется ли правоIS_INHERITED— унаследовано ли право от родительского раздела
Метод 3. Получение операций пользователя на элементы
Статический метод CIBlockElementRights::GetUserOperations():
\Bitrix\Main\Loader::includeModule('iblock');
// Получить операции для пользователя с ID=1 на элемент с ID=15
$arOperations = CIBlockElementRights::GetUserOperations(15, 1);
echo '<pre>';
print_r($arOperations);
echo '</pre>';
// Результат: массив вида ['element_read' => 'element_read', 'element_edit' => 'element_edit', ...]
Метод 4. Константы уровней доступа в CIBlockRights
CIBlockRights::PUBLIC_READ = 'R' // Чтение
CIBlockRights::EDIT_ACCESS = 'W' // Запись (редактирование)
CIBlockRights::FULL_ACCESS = 'X' // Полный доступ
Метод 5. Назначение простых прав для существующего инфоблока (через классический API)
\Bitrix\Main\Loader::includeModule('iblock');
// Назначить права группам: ID группы => уровень доступа
CIBlockElement::SetPermission(
1, // ID инфоблока
[
2 => 'R', // Все пользователи (группа 2) — чтение
8 => 'W', // Контент-редакторы (группа 8) — запись
]
);
Уровни доступа в простом режиме:
D— доступ закрытR— чтениеW— запись (редактирование)X— полный доступ
Метод 6. Список всех прав для элемента (низкоуровневый запрос)
\Bitrix\Main\Loader::includeModule('iblock');
$obElementRights = new CIBlockElementRights($iblockId, $elementId);
$rsRights = $obElementRights->GetList(['IBLOCK_ID' => $iblockId]);
while ($arRight = $rsRights->Fetch())
{
echo "{$arRight['GROUP_CODE']} -> TASK_ID: {$arRight['TASK_ID']}";
}