1С-Битрикс

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

Метод GetUserGroupArray в 1С-Битрикс: как получить группы текущего пользователя, проверить принадлежность к группе, сравнение с GetUserGroup и практические примеры использования

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

Группы пользователей в 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 "Доступ разрешён";
}
?>

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

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

Метод Что проверяет Когда применять Пример
$USER->GetUserGroupArray() Принадлежность к конкретной группе по ID Бизнес-логика, привязанная к ролям (VIP-клиенты, менеджеры, партнёры) in_array(8, $USER->GetUserGroupArray())
$APPLICATION->GetGroupRight("module_id") Уровень доступа к модулю (R, W, X) Проверка системных прав на операции с модулями (редактирование инфоблоков, доступ в админку) $APPLICATION->GetGroupRight("iblock") >= "W"

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С-Битрикс.

Хотите освоить SQL для работы с данными?

В SQLka можно изучать SQL последовательно или готовиться к собеседованиям. Запросы выполняются прямо в браузере — устанавливать базу данных не нужно.

sqlka.ru

support@sqlka.ru

Дальше по теме

1С-Битрикс

Логирование в 1С-Битрикс: полное руководство для разработчика

Полное руководство по логированию в 1С-Битрикс: какие логгеры есть, как их настроить, форматировать сообщения и подключать к своим классам. Примеры кода и советы по использованию PSR-3

sqlka.ruЧтение: 4 мин.
← Все статьи