При разработке собственных объектов в типовых конфигурациях (таких как 1С:Управление торговлей 11, ERP 2 или Комплексная автоматизация) разработчики часто сталкиваются с задачей включения нового документа в общую систему разграничения прав доступа на уровне записей (RLS). Попробуем разобраться, как правильно настроить ограничение доступа по организации и складу для нового документа и почему стандартная настройка ролей может приводить к частичному отображению данных.
Проанализируем типичную ситуацию: создан новый документ (например, ПоступлениеОборудования) с реквизитами Организация, Склад и Ответственный. Разработчик включает RLS для справочника организаций, создает профиль и группу доступа, однако в динамическом списке документов пользователь все равно видит все строки, при этом в колонке организации отображается пустое поле или надпись <Объект не найден>.
Выясним причину такого поведения платформы. Если ограничение доступа настроено только на уровне справочника Организации, а на саму таблицу документа ограничение на право Чтение не наложено, платформа считывает список документов целиком. При попытке получить представление организации срабатывает RLS справочника, запрещающий чтение конкретного элемента, из-за чего значение реквизита скрывается, но сама строка документа остается в списке. Чтобы документ полностью исчез из динамического списка, условие ограничения должно применяться непосредственно к правам самого документа.
В современных версиях Библиотеки стандартных подсистем (БСП) используется производительный режим RLS, основанный на регистрах ключей доступа. Разберем по шагам, как правильно внедрить нетиповой документ в эту подсистему.
ВладелецЗначенийКлючейДоступаВладелецЗначенийКлючейДоступаДокументУправлениеДоступомПереопределяемый и найдем процедуру ПриЗаполненииСписковСОграничениемДоступа. Добавим строку с регистрацией нашего документа:
Процедура ПриЗаполненииСписковСОграничениемДоступа(Списки) Экспорт
// Регистрация нетипового документа в механизме RLS
Списки.Вставить(Метаданные.Документы.ПоступлениеОборудования, Истина);
КонецПроцедуры
Документ.ПоступлениеОборудования и разместим там экспортную процедуру описания ограничений:
Процедура ПриЗаполненииОграниченияДоступа(Ограничение) Экспорт
Ограничение.Текст =
"РазрешитьЧтениеИзменение
|ГДЕ
| ЗначениеРазрешено(Организация)
| И ЗначениеРазрешено(Склад)";
КонецПроцедуры
В этом коде макрокоманда ЗначениеРазрешено указывает подсистеме управления доступом контролировать реквизиты документа по соответствующим видам доступа.
ЧтениеПоступленийТоваровУслуг). В правах роли для документа ПоступлениеОборудования укажем ограничение на право Чтение и Изменение с использованием типового шаблона БСП ПоЗначениям.Рассмотрим распространенную проблему: при настройке ограничений по складам доступ к конкретным элементам работает, но если в группе доступа выбрать папку (группу складов), пользователи теряют доступ ко всем вложенным складам.
Выясним причину: RLS по умолчанию выполняет проверку на прямое равенство ссылки разрешенному значению. Если вид доступа не настроен на учет иерархии, платформа сравнивает родительскую группу из настроек прав с конкретным складом в документе, из-за чего совпадение не находится. Для корректной работы с группами складов необходимо, чтобы для соответствующего вида доступа в БСП было включено использование групп значений доступа и корректно заполнялся служебный регистр сведений ГруппыЗначенийДоступа.
Разберем логику комбинирования прав при назначении пользователю нескольких настроек:
Ограничение на уровне записей создает дополнительную нагрузку на СУБД, так как модифицирует исходные запросы платформы. Чтобы избежать падения производительности динамических списков и отчетов, обратим внимание на следующие правила:
Организация и Склад), должны иметь свойство Индексировать или Индексировать с доп. упорядочиванием.