После входа видны старые группы: исправляем кеш

После входа на сайт компонент вдруг показывает старые группы пользователя. Метод $USER->GetUserGroupArray() кажется виноватым, но при попадании в кеш проверка в шаблоне может вообще не выполняться: посетитель видит ранее сохранённый результат. До входа страница сохранила HTML для гостя, после входа Битрикс честно отдал этот же готовый HTML.

В теме на форуме в декабре 2025 года решение сформулировано прямо: проблема не в методе групп, а в закешированном результате. Посмотрим, как исправить это без постоянной очистки всего кеша.

Как быстро проверить причину

На тестовой копии добавьте в шаблон компонента временный текст: «гость» или «группа разрешена». Откройте страницу в приватном окне, затем войдите под тестовой учётной записью с нужной группой и обновите страницу. Если текст меняется только после очистки кеша, воспроизведение готово.

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

Решение 1: не кешировать только личный кусок

Если список товаров, новостей или документов одинаковый для всех, оставьте его в кеше. А кнопку «для партнёров», имя пользователя и проверку группы выведите после кешируемого блока. Тогда общий HTML остаётся быстрым, а условие каждый раз вычисляется для текущего посетителя.

Кешируем: общий список
После кеша: проверить группы текущего пользователя
Если есть нужная группа: вывести личную кнопку

Это лучший вариант, когда от групп зависит маленькая часть страницы. Не нужно отключать кеш у всего компонента из-за одной ссылки.

Решение 2: добавить группы в ключ кеша

Если от групп зависит сам список данных, компоненту нужны разные записи кеша. Официальный метод StartResultCache() принимает второй параметр additionalCacheID. В него можно передать набор групп текущего пользователя.

global $USER;
$groupIds = $USER->GetUserGroupArray();
sort($groupIds);

if ($this->StartResultCache(false, $groupIds)) {
    // Получаем данные и подключаем шаблон.
    $this->IncludeComponentTemplate();
}

Сортировка важна: одинаковый набор групп должен давать одинаковый ключ независимо от порядка. Код размещают в своём компоненте до запроса данных, а не в ядре Битрикс. Если компонент уже использует дополнительный ключ, добавьте группы к существующему массиву, не заменяйте его вслепую.

Почему не нужно добавлять ID каждого пользователя

Ключ по ID создаст отдельный кеш для каждого посетителя. Для страницы, где важны только права групп, это быстро раздует кеш и не даст новой пользы. В ключ кладут именно те условия, от которых реально зависит результат: например, список групп, язык или выбранный склад.

Проверка исправления

  1. Очистите кеш только на тестовой копии один раз перед началом.
  2. Откройте страницу гостем и пользователем с нужной группой.
  3. Выйдите и войдите снова: результат должен меняться без новой очистки.
  4. Убедитесь, что два пользователя с одинаковыми группами получают одинаковый результат.

Это воспроизводимое исправление для ситуации, когда результат компонента действительно зависит от групп. Оно не лечит ошибочно настроенные права или код, который меняет группы уже после построения страницы.

Статья подготовлена 4 октября 2026 года. Форумный случай: тема 163806. Параметр additionalCacheID и пример зависимости от групп сверены с официальной документацией StartResultCache. В установленном ядре проверены общий кеш без ключа и раздельные дисковые записи для двух наборов групп; веб-вход пользователей этот тест не заменяет.