Почему не работает параметр сеанса ТекущийПользователь в RLS и как это исправить

Программист 1С v8.3 (Обычные формы) 1С:Управление торговлей IT и автоматизация бизнеса
← На главную

В процессе разработки и настройки прав доступа в конфигурациях на базе обычных форм, таких как 1С:Управление торговлей 10.3, специалисты часто сталкиваются с механизмом RLS (Row Level Security). Одним из самых востребованных сценариев является ограничение видимости данных по текущему пользователю. Однако иногда система выдает ошибку: Не задано значение параметра "ТекущийПользователь", хотя в коде системы этот параметр явно заполнен. Проанализируем, почему это происходит и на что нужно обратить внимание в первую очередь.

Анализ типичной ошибки: Опечатки в тексте запроса

Рассмотрим конкретную ситуацию. При настройке ограничения на чтение справочника Контрагенты используется условие:


ГДЕ ЭтоГруппа ИЛИ ОсновнойМенеджерПокупателя = &ТекущийПользователь 
ИЛИ ОсновнойМенеджерПокупателя = Значение(Справочник.Пользователи.ПустаяСсылка)

Если система выдает ошибку инициализации параметра, первым делом необходимо проверить синтаксическую точность написания идентификатора. Как показывает практика, в сложных запросах RLS легко допустить опечатку, которую визуально сложно заметить. Например, использование буквы ш вместо щ в слове ТекущийПользователь приведет к тому, что платформа будет искать параметр &ТекушийПользователь, который не объявлен в метаданных как параметр сеанса.

Механизм инициализации параметров сеанса

Выясним, как платформа работает с параметрами сеанса. В системе 1С:Предприятие существует специальный обработчик в модуле сеанса — УстановкаПараметровСеанса. Важно понимать следующие нюансы:

  1. Ленивая инициализация: Параметры сеанса инициализируются только в момент первого обращения к ним. Если механизм RLS пытается прочитать значение параметра, платформа автоматически вызывает процедуру УстановкаПараметровСеанса.
  2. Ошибки в модуле сеанса: Если внутри этой процедуры происходит исключение или логика обхода условий не позволяет коду дойти до установки конкретного параметра, то запрос RLS завершится с ошибкой.
  3. Доступность: Параметр сеанса должен быть доступен для того права, которое проверяется. В типовых конфигурациях ТекущийПользователь обычно доступен всем, но при создании собственных параметров об этом стоит помнить.

Различие между «Не задано значение» и «Пустое значение»

Проанализируем разницу в поведении системы при разных состояниях параметра. Для механизма RLS это критически важно:

Особенности RLS в фоновых заданиях на платформе 8.3

При использовании 1С 8.3 для работы со старыми конфигурациями (УТ 10.3) часто возникают проблемы с фоновыми заданиями. Рассмотрим, почему это происходит:

В фоновом задании параметры сеанса не копируются из родительского сеанса пользователя. Они должны быть инициализированы заново. Если процедура УстановкаПараметровСеанса в модуле сеанса опирается на интерактивные действия или предполагает наличие ПараметрыЗапуска, которые в фоне отсутствуют, то &ТекущийПользователь может оказаться не заполнен. Это приведет к падению регламентных заданий с ошибкой доступа к данным.

Диагностика и отладка RLS

Посмотрим на алгоритм действий для полной диагностики проблемы:

  1. Проверка текста ошибки: Внимательно прочитайте текст сообщения. Если там указан вопросительный знак перед именем параметра (например, <<?>>&ТекушийПользователь), проверьте имя параметра на наличие опечаток (русская "с" вместо английской "c", "ш" вместо "щ" и т.д.).
  2. Проверка модуля сеанса: Установите точку останова в процедуре УстановкаПараметровСеанса. Убедитесь, что для проблемного пользователя код установки параметра действительно выполняется.
  3. Консоль запросов: Попробуйте выполнить запрос с этим параметром в консоли запросов под тем же пользователем. Это поможет понять, является ли проблема специфичной для RLS или она носит общий характер.
  4. Привилегированный режим: Помните, что в коде, исполняемом внутри УстановитьПривилегированныйРежим(Истина), RLS не работает. Это часто используется для проведения документов «в обход» ограничений прав доступа, чтобы избежать блокировок из-за отсутствия прав на сопутствующие данные.

Влияние на производительность и кэширование

Разберем, как параметры сеанса влияют на скорость работы системы. Платформа 1С кэширует значения параметров сеанса для SQL-запросов, что делает использование &ТекущийПользователь в RLS более эффективным, чем использование подзапросов к константам или регистрам сведений непосредственно в условии ограничения.

Однако стоит учитывать механизмы кэширования прав, появившиеся в платформе 8.3.15+. Если права пользователя или значения параметров сеанса меняются «на лету», изменения могут примениться не мгновенно. В старых конфигурациях на обычных формах иногда требуется полный перезапуск сеанса пользователя для корректного обновления кэша RLS после внесения правок в роли или параметры.

Рекомендации по написанию условий RLS

Для обеспечения стабильной работы ограничений доступа рекомендуем придерживаться следующих правил:

← На главную