Часто при настройке прав доступа на уровне записей (RLS) в конфигурациях на базе 1С:Предприятие возникает ситуация: мы создаем новую роль, прописываем ограничение на чтение определенного справочника (например, контрагентов), добавляем эту роль пользователю, но он все равно видит все элементы справочника без ограничений. Рассмотрим подробно, почему так происходит, разберем типичные ошибки и выясним, как правильно настраивать фильтрацию данных в современных конфигурациях на базе Библиотеки стандартных подсистем (БСП).
Проанализируем классический подход, который применяют многие разработчики. Создается некий регистр сведений, например, РегистрСведений.ОграниченияПоКонтрагентам, и в новой роли на справочник прописывается следующее условие:
Контрагенты.Ссылка В (ВЫБРАТЬ ОграничениеПоКА.Контрагент ИЗ РегистрСведений.ОграниченияПоКонтрагентам КАК ОграничениеПоКА
ГДЕ
ОграничениеПоКА.Пользователь = &ТекущийПользователь
И ОграничениеПоКА.Разрешено = ИСТИНА)
Роль добавляется в профиль групп доступа, например, Бухгалтер, но ожидаемого ограничения не происходит. Посмотрим на основные причины такого поведения.
Разберем базовую механику платформы 1С. Доступ по RLS между разными ролями одного пользователя всегда работает по принципу логического сложения — ИЛИ. Разрешено все, что разрешено хотя бы одной ролью пользователя.
Если в профиле пользователя (или в других назначенных ему профилях) есть хотя бы одна роль, которая дает доступ к справочнику без ограничений RLS, то платформа проигнорирует ваше ограничение из новой роли. Базовые роли, такие как Чтение базовой нормативно-справочной информации, часто неявно присутствуют в типовых профилях и предоставляют полные права на чтение справочников.
Чтобы выявить такие роли, выполним следующие шаги:
Рассмотрим важнейший нюанс современных конфигураций, таких как 1С:Бухгалтерия 3.0. Самая частая причина, из-за которой настроенный RLS визуально не работает — это неактуальные ключи доступа.
Архитектура БСП кэширует вычисленные права пользователей в специализированных регистрах сведений (например, КлючиДоступаКОбъектам или КлючиДоступаПользователей). Это сделано для максимального ускорения работы системы при открытии списков. Если вы добавили новую роль, изменили профиль или внесли записи в ваш регистр ограничений, система не применит эти изменения моментально.
Для применения новых прав сделаем следующее:
Только после пересчета ключей доступа пользователь увидит отфильтрованный список справочника.
Посмотрим на приведенный в начале статьи код. В современных версиях БСП прямое написание SQL-подобных запросов в тексте ролей считается устаревшим подходом и часто приводит к ошибкам. Платформа ожидает использование встроенных стандартных шаблонов ограничения доступа.
Вместо создания своих регистров и ролей вручную, воспользуемся штатными механизмами БСП:
УправлениеДоступомПереопределяемый, программно добавляется новый Вид доступа.#ПоЗначениям.Проанализируем еще одну архитектурную особенность. В последних версиях БСП 3.x по умолчанию включается так называемый производительный режим RLS. В этом режиме тексты ограничений настраиваются совершенно иначе — через специальные макросы, встроенные в шаблоны (например, конструкции вида РазрешитьЧтениеИзменение).
Классические запросы RLS, написанные вручную напрямую к таблицам, в производительном режиме могут просто игнорироваться платформой или вызывать деградацию производительности, так как платформа не сможет оптимизировать кэширование.
Выясним причину, по которой код может срабатывать не так, как ожидается, даже при верной настройке. Использование системной переменной &ТекущийПользователь в чистом виде не рекомендуется. В конфигурациях БСП для этих целей применяются специализированные параметры сеанса (например, ТекущийПользователь как параметр сеанса), инициализацию которых осуществляет сама библиотека при запуске.
Также важно помнить про привилегированный режим. Если пользователь открывает форму списка или вызывает программный код, который исполняется с флагом УстановитьПривилегированныйРежим(Истина), платформа отключит любые проверки RLS, и пользователь увидит абсолютно все записи справочника. Обязательно проверьте, не отрабатывает ли форма выбора контрагента в привилегированном режиме.
Сведем воедино алгоритм действий, если вам нужно ограничить контрагентов:
&ТекущийПользователь и проверьте отсутствие привилегированного режима при открытии списка.