Настройка ограничений доступа на уровне записей (RLS — Record Level Security) в платформе 1С:Предприятие часто вызывает трудности у разработчиков. Особенно остро проблемы проявляются при попытке настроить RLS через механизм расширений или при работе с журналами документов в конфигурациях, построенных на базе Библиотеки стандартных подсистем (БСП). Разработчики нередко сталкиваются с ситуацией, когда даже самое жесткое условие ограничения (например, простое ГДЕ ЛОЖЬ) игнорируется платформой, и пользователь по-прежнему видит все документы в списке.
В этой статье мы подробно разберем, почему возникает такое поведение, как работает механизм сложения прав в платформе, и по шагам настроим работоспособное ограничение доступа для журнала документов в расширении.
Проанализируем базовый механизм работы ролей в платформе 1С. В системе прав доступа 1С действует жесткое правило: права пользователя по всем назначенным ему ролям объединяются по принципу логического ИЛИ. Это означает следующее:
ЖурналДокументов.Деньги) без всяких ограничений, то ограничения RLS, прописанные в вашей новой роли, будут полностью проигнорированы.ГДЕ ЛОЖЬ, платформа увидит, что «типовая» роль разрешает чтение без условий, и предоставит пользователю полный доступ к записям.Как решить эту проблему:
Современные конфигурации 1С на базе БСП активно кэшируют структуру прав доступа и используют специальные регистры сведений для хранения ключей доступа. Если вы просто добавили роль с RLS или изменили шаблоны ограничений, платформа может не применить эти правила мгновенно.
Для принудительного обновления и перестроения ключей доступа необходимо запустить конфигурацию в режиме Предприятия со специальным параметром запуска. Разберем этот шаг подробно:
/C) добавьте следующую команду:
/c ЗапуститьОбновлениеИнформационнойБазыЕсли ваша конфигурация разработана на современной версии БСП, в ней, скорее всего, включен так называемый производительный (универсальный) режим ограничения доступа. В этом режиме параметр сеанса ОграничениеДоступаНаУровнеЗаписейУниверсально имеет значение Истина.
В этом случае платформа полностью игнорирует классический шаблон #ПоЗначениям. Вместо него система ожидает использования универсального шаблона #ДляОбъекта(""). Если написать только старый шаблон, RLS работать не будет или начнет вызывать ошибки времени выполнения (runtime-ошибки) при попытке обращения к базе данных.
Давайте посмотрим на пример правильного написания условия RLS, которое учитывает оба режима работы системы (совместимость со старым и новым RLS в БСП):
#Если &ОграничениеДоступаНаУровнеЗаписейУниверсально #Тогда
#ДляОбъекта("")
#Иначе
#ПоЗначениям("ЖурналДокументов.Деньги", "", "",
"Организации", "Организация",
"","",
"","",
"","",
"","","","","","","","",
"","","","","","","","",
"","","","","","","",""
)
#КонецЕсли
Для того чтобы универсальный RLS корректно заработал для вашего нового или заимствованного объекта в расширении, его также необходимо зарегистрировать в программных механизмах БСП:
УправлениеДоступомПереопределяемый.ПриЗаполненииСписковСОграничениемДоступа добавьте ваш журнал документов в список контролируемых объектов:
Процедура ПриЗаполненииСписковСОграничениемДоступа(Списки) Экспорт
Списки.Вставить(Метаданные.ЖурналыДокументов.Деньги, Истина);
КонецПроцедуры
После этого обязательно обновите информационную базу через ключ запуска /c ЗапуститьОбновлениеИнформационнойБазы.
При настройке прав на журналы документов разработчики часто допускают архитектурную ошибку: настраивают ограничения только на сами документы (например, Документ.ПоступлениеБезналичныхДенежныхСредств и Документ.СписаниеБезналичныхДенежныхСредств), забывая про сам журнал документов ЖурналДокументов.Деньги.
Рассмотрим, к каким последствиям это приводит:
Правило успешной настройки RLS для журналов: ограничения должны быть идентично настроены как на все входящие в журнал документы, так и на сам журнал документов.
При этом реквизит, по которому идет ограничение (например, Организация), обязательно должен быть добавлен в Графы журнала документов в конфигураторе, и для этого реквизита должно быть настроено сопоставление с аналогичными реквизитами всех входящих в журнал документов. Если этого не сделать, СУБД не сможет выполнить запрос RLS и выдаст ошибку.
Если использование шаблонов БСП кажется вам избыточным или вызывает труднодиагностируемые ошибки (например, когда в журнале регистрации пусто, а система выдает неспецифическую ошибку доступа в рантайме), вы можете отказаться от шаблонов БСП в пользу прямого декларативного запроса RLS.
Разберем пример, как написать простое и надежное ограничение по организации без использования громоздких шаблонов:
ЖурналДокументов.Деньги ГДЕ Организация В
(ВЫБРАТЬ РазрешенныеОрганизации.Организация
ИЗ РегистрСведений.РазрешенныеОрганизации КАК РазрешенныеОрганизации
ГДЕ РазрешенныеОрганизации.Пользователь = &ПараметрСеанса.ТекущийПользователь)
Преимущества использования собственного запроса:
Недостатки:
Мы проанализировали основные подводные камни при настройке RLS в расширениях 1С. Помните о золотом правиле: всегда проверяйте пересечение ролей у тестового пользователя и не забывайте запускать обновление базы данных для актуализации ключей доступа.