В процессе разработки и настройки прав доступа в конфигурациях на базе обычных форм, таких как 1С:Управление торговлей 10.3, специалисты часто сталкиваются с механизмом RLS (Row Level Security). Одним из самых востребованных сценариев является ограничение видимости данных по текущему пользователю. Однако иногда система выдает ошибку: Не задано значение параметра "ТекущийПользователь", хотя в коде системы этот параметр явно заполнен. Проанализируем, почему это происходит и на что нужно обратить внимание в первую очередь.
Рассмотрим конкретную ситуацию. При настройке ограничения на чтение справочника Контрагенты используется условие:
ГДЕ ЭтоГруппа ИЛИ ОсновнойМенеджерПокупателя = &ТекущийПользователь
ИЛИ ОсновнойМенеджерПокупателя = Значение(Справочник.Пользователи.ПустаяСсылка)
Если система выдает ошибку инициализации параметра, первым делом необходимо проверить синтаксическую точность написания идентификатора. Как показывает практика, в сложных запросах RLS легко допустить опечатку, которую визуально сложно заметить. Например, использование буквы ш вместо щ в слове ТекущийПользователь приведет к тому, что платформа будет искать параметр &ТекушийПользователь, который не объявлен в метаданных как параметр сеанса.
Выясним, как платформа работает с параметрами сеанса. В системе 1С:Предприятие существует специальный обработчик в модуле сеанса — УстановкаПараметровСеанса. Важно понимать следующие нюансы:
УстановкаПараметровСеанса.ТекущийПользователь обычно доступен всем, но при создании собственных параметров об этом стоит помнить.Проанализируем разницу в поведении системы при разных состояниях параметра. Для механизма RLS это критически важно:
УстановкаПараметровСеанса значение вообще не было присвоено (даже Неопределено), платформа прерывает выполнение запроса и выдает системную ошибку. Пользователь увидит сообщение об ошибке и не сможет открыть список объектов.Справочники.Пользователи.ПустаяСсылка(), запрос RLS выполнится успешно. Однако условие ОтветственныйМенеджер = &ТекущийПользователь отсечет все записи, где менеджер заполнен, и покажет только те, где менеджер не указан.При использовании 1С 8.3 для работы со старыми конфигурациями (УТ 10.3) часто возникают проблемы с фоновыми заданиями. Рассмотрим, почему это происходит:
В фоновом задании параметры сеанса не копируются из родительского сеанса пользователя. Они должны быть инициализированы заново. Если процедура УстановкаПараметровСеанса в модуле сеанса опирается на интерактивные действия или предполагает наличие ПараметрыЗапуска, которые в фоне отсутствуют, то &ТекущийПользователь может оказаться не заполнен. Это приведет к падению регламентных заданий с ошибкой доступа к данным.
Посмотрим на алгоритм действий для полной диагностики проблемы:
<<?>>&ТекушийПользователь), проверьте имя параметра на наличие опечаток (русская "с" вместо английской "c", "ш" вместо "щ" и т.д.).УстановкаПараметровСеанса. Убедитесь, что для проблемного пользователя код установки параметра действительно выполняется.УстановитьПривилегированныйРежим(Истина), RLS не работает. Это часто используется для проведения документов «в обход» ограничений прав доступа, чтобы избежать блокировок из-за отсутствия прав на сопутствующие данные.Разберем, как параметры сеанса влияют на скорость работы системы. Платформа 1С кэширует значения параметров сеанса для SQL-запросов, что делает использование &ТекущийПользователь в RLS более эффективным, чем использование подзапросов к константам или регистрам сведений непосредственно в условии ограничения.
Однако стоит учитывать механизмы кэширования прав, появившиеся в платформе 8.3.15+. Если права пользователя или значения параметров сеанса меняются «на лету», изменения могут примениться не мгновенно. В старых конфигурациях на обычных формах иногда требуется полный перезапуск сеанса пользователя для корректного обновления кэша RLS после внесения правок в роли или параметры.
Для обеспечения стабильной работы ограничений доступа рекомендуем придерживаться следующих правил: