Найти в Дзене
bxstudio.ru

GetUserGroupArray в 1С-Битрикс: полное руководство по работе с группами пользователей

Группы пользователей в 1С-Битрикс — это основной инструмент разграничения доступа и организации бизнес-логики. Метод GetUserGroupArray() позволяет разработчику получить список групп, в которых состоит текущий пользователь. В этой статье разобраны все аспекты его применения: от базового синтаксиса до сложных сценариев проверки прав. Метод GetUserGroupArray() принадлежит классу CUser и вызывается от глобального объекта $USER. Он возвращает массив идентификаторов (ID) групп, в которые входит текущий авторизованный пользователь. <?php
global $USER;
$arGroups = $USER->GetUserGroupArray();
print_r($arGroups); // Например: Array ( [0] => 1 [1] => 5 [2] => 7 )
?> Важная особенность: данные о группах хранятся в сессии пользователя. Если администратор изменит состав групп для пользователя, новые данные станут доступны только после повторной авторизации. Если требуется получить группы не текущего, а конкретного пользователя (например, в фоновых скриптах или при отправке уведомлений), используется
Оглавление

Группы пользователей в 1С-Битрикс — это основной инструмент разграничения доступа и организации бизнес-логики. Метод GetUserGroupArray() позволяет разработчику получить список групп, в которых состоит текущий пользователь. В этой статье разобраны все аспекты его применения: от базового синтаксиса до сложных сценариев проверки прав.

Назначение и синтаксис метода

Метод GetUserGroupArray() принадлежит классу CUser и вызывается от глобального объекта $USER. Он возвращает массив идентификаторов (ID) групп, в которые входит текущий авторизованный пользователь.

<?php
global $USER;
$arGroups = $USER->GetUserGroupArray();
print_r($arGroups); // Например: Array ( [0] => 1 [1] => 5 [2] => 7 )
?>

Важная особенность: данные о группах хранятся в сессии пользователя. Если администратор изменит состав групп для пользователя, новые данные станут доступны только после повторной авторизации.

Получение групп для любого пользователя

Если требуется получить группы не текущего, а конкретного пользователя (например, в фоновых скриптах или при отправке уведомлений), используется статический метод CUser::GetUserGroup($userId):

<?php
$targetUserId = 42;
$arGroups = CUser::GetUserGroup($targetUserId);
print_r($arGroups);
?>

Метод GetUserGroup() обращается непосредственно к базе данных и всегда возвращает актуальные данные, в отличие от сессионного GetUserGroupArray().

Практические примеры использования

Проверка принадлежности к конкретной группе

Самый частый сценарий — проверка, входит ли пользователь в определённую группу (например, "Менеджеры" с ID = 8):

<?php
global $USER;

define("MANAGER_GROUP_ID", 8);

if ($USER->IsAuthorized() && in_array(MANAGER_GROUP_ID, $USER->GetUserGroupArray())) {
echo "Добро пожаловать в панель менеджера";
} else {
echo "Доступ ограничен";
}
?>

Учёт прав администратора

Администраторы (группа ID 1) обычно имеют доступ ко всему, но они могут не состоять во всех пользовательских группах. Поэтому при проверках рекомендуется добавлять условие на администратора:

<?php
global $USER;
$userGroups = $USER->GetUserGroupArray();

if ($USER->IsAdmin() || in_array(MANAGER_GROUP_ID, $userGroups)) {
// Разрешаем действие
}
?>

Работа с неавторизованными пользователями (гостями)

Даже если пользователь не авторизован, метод GetUserGroupArray() вернёт массив, содержащий ID группы "Все пользователи (в том числе неавторизованные)" — обычно это группа с ID = 2:

<?php
global $USER;
$userGroups = $USER->GetUserGroupArray();

if (in_array(2, $userGroups) && !$USER->IsAuthorized()) {
echo "Вы находитесь на сайте как гость";
}
?>

Для надёжности всегда используйте $USER->IsAuthorized() для проверки факта авторизации.

Проверка вхождения хотя бы в одну из нескольких групп

Когда требуется проверить membership в нескольких группах (например, доступ к разделу имеют и менеджеры, и контент-редакторы), удобно использовать функцию array_intersect():

<?php
global $USER;
$allowedGroups = [5, 7, 9]; // ID групп, имеющих доступ
$userGroups = $USER->GetUserGroupArray();

if (count(array_intersect($allowedGroups, $userGroups)) > 0) {
echo "Доступ разрешён";
}
?>

Сравнение методов проверки прав

В Битрикс существует два основных подхода к проверке прав, и важно понимать, когда какой использовать:

GetGroupRight() считается более правильным с архитектурной точки зрения, так как не привязывает код к конкретным ID групп. Однако для уникальной бизнес-логики часто требуется именно проверка через группы.

Расширенный сценарий: получение всех пользователей группы и их заказов

На практике часто возникает задача: найти всех пользователей, входящих в те же группы, что и текущий пользователь, и получить их заказы. Это может быть нужно для корпоративных аккаунтов или группового доступа.

<?php
// 1. Получаем группы текущего пользователя
global $USER;
$userGroups = $USER->GetUserGroupArray();

if (empty($userGroups)) {
return;
}

// 2. Находим всех пользователей, состоящих в этих группах
$usersInGroups = [];
$rsUsers = CUser::GetList(
($by = "ID"),
($order = "ASC"),
[
'GROUPS_ID' => $userGroups,
'ACTIVE' => 'Y'
],
['FIELDS' => ['ID']]
);
while ($user = $rsUsers->Fetch()) {
$usersInGroups[] = $user['ID'];
}

// 3. Получаем заказы этих пользователей
if (!empty($usersInGroups)) {
$rsOrders = \Bitrix\Sale\Order::getList([
'filter' => ['USER_ID' => $usersInGroups],
'order' => ['ID' => 'DESC']
]);

while ($order = $rsOrders->fetch()) {
// Обработка заказов
}
}
?>

Лучшие практики

Избегайте "хардкода" ID групп

Запись вида in_array(8, $userGroups) создаёт проблему: если в админке группу удалят или её ID изменится при переносе сайта, код перестанет работать. Рекомендуется выносить ID групп в константы или настройки модуля:

<?php
// В файле конфигурации модуля
define('MODULE_VIP_GROUP_ID', \Bitrix\Main\Config\Option::get('module_name', 'vip_group_id'));

// В коде
if (in_array(MODULE_VIP_GROUP_ID, $USER->GetUserGroupArray())) {
// ...
}
?>

Учитывайте особенности кеширования

При использовании GetUserGroupArray() в компонентах, которые кешируются, необходимо в настройках компонента включить опцию "Учитывать права доступа". Иначе пользователь может увидеть закешированные данные, предназначенные для другой группы.

Помните о данных в сессии

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

Заключение

Метод GetUserGroupArray() — базовый инструмент для работы с группами пользователей в 1С-Битрикс. Он позволяет гибко управлять доступом к функционалу сайта на основе ролей. Главное — правильно выбирать между проверкой через группы и проверкой через уровни доступа модулей (GetGroupRight), а также следовать лучшим практикам, избегая жёсткой привязки к идентификаторам в коде.

Понимание особенностей хранения данных в сессии и корректная обработка неавторизованных пользователей помогут создавать надёжные и безопасные решения на платформе 1С-Битрикс.