Настройка ограничения доступа на уровне записей (RLS — Row-Level Security) в конфигурациях 1С на базе Библиотеки стандартных подсистем (БСП) — задача частая, но требующая предельной точности. Малейшая ошибка в переопределяемых модулях, неверно указанный тип данных или игнорирование иерархической структуры справочника могут привести к системным сбоям, пустым спискам или полному игнорированию правил доступа.
В этой статье мы подробно разберем, как правильно реализовать ограничение доступа к справочнику Номенклатура по его категориям (справочник КатегорииНоменклатуры), проанализируем типичные ошибки разработчиков и найдем пути их решения.
Разберем типичную ситуацию. Разработчик пытается настроить ограничение доступа по категориям номенклатуры и сталкивается с тем, что система либо выдает ошибку при открытии динамического списка, либо игнорирует ограничения, показывая пользователю все элементы. Основными причинами таких проблем являются:
Ссылка вместо реального реквизита справочника в параметрах шаблона #ПоЗначениям.Рассмотрим подробное решение проблемы по шагам.
---
Для того чтобы БСП узнала о существовании нового разрешающего разреза (вида доступа), необходимо внести изменения в общий модуль УправлениеДоступомПереопределяемый. Нам понадобятся три основные процедуры.
Первая и самая важная процедура — ПриЗаполненииВидовДоступа. Здесь совершается частая ошибка: в качестве ТипЗначений указывают сам ограничиваемый справочник (например, Номенклатура), хотя там должен быть указан тип справочника-разрешения. Рассмотрим правильный код:
&После("ПриЗаполненииВидовДоступа")
Процедура ПриЗаполненииВидовДоступаПосле(ВидыДоступа) Экспорт
ВидДоступа = ВидыДоступа.Добавить();
ВидДоступа.Имя = "КатегорииНоменклатуры";
ВидДоступа.Представление = НСтр("ru = 'Категории номенклатуры'");
// Важно: здесь указываем тип именно справочника-разрешения (категории), а не самой номенклатуры!
ВидДоступа.ТипЗначений = Тип("СправочникСсылка.КатегорииНоменклатуры");
КонецПроцедуры
Затем мы должны явно включить использование этого вида доступа в процедуре ПриЗаполненииИспользованияВидаДоступа:
&После("ПриЗаполненииИспользованияВидаДоступа")
Процедура ПриЗаполненииИспользованияВидаДоступаПосле(ВидДоступа, Использование) Экспорт
Если ВидДоступа = "КатегорииНоменклатуры" Тогда
Использование = Истина;
КонецЕсли;
КонецПроцедуры
И, наконец, регистрируем связь между объектом метаданных и видом доступа в процедуре ПриЗаполненииВидовОграниченийПравОбъектовМетаданных:
&После("ПриЗаполненииВидовОграниченийПравОбъектовМетаданных")
Процедура ПриЗаполненииВидовОграниченийПравОбъектовМетаданныхПосле(Описание) Экспорт
Описание = Описание + "
|Справочник.Номенклатура.Чтение.КатегорииНоменклатуры
|Справочник.Номенклатура.Изменение.КатегорииНоменклатуры
|Справочник.Номенклатура.Добавление.КатегорииНоменклатуры
|";
КонецПроцедуры
---
Для того чтобы подсистема управления доступом БСП могла корректно генерировать ключи доступа для нового справочника КатегорииНоменклатуры, нам необходимо добавить его в состав определяемых типов конфигурации. Сделать это через расширение не всегда надежно, поэтому рекомендуется вносить изменения непосредственно в основную конфигурацию (предварительно включив возможность изменения):
ЗначениеДоступа и добавьте в его состав тип СправочникСсылка.КатегорииНоменклатуры.ЗначениеДоступаОбъект и добавьте в его состав СправочникОбъект.КатегорииНоменклатуры.Номенклатура) убедитесь, что его ссылочный и объектный типы включены в определяемые типы ВладелецЗначенийКлючейДоступа и ВладелецЗначенийКлючейДоступаОбъект. Это критически важно для работы RLS в производительном (универсальном) режиме.---
Перейдем к настройке ролей в конфигураторе. Нам нужно прописать ограничение доступа на права Чтение (а также при необходимости Добавление и Изменение) для справочника Номенклатура.
Типичная ошибка новичков выглядит так:
#ПоЗначениям( "Справочник.Номенклатура", "Чтение", "", "КатегорииНоменклатуры", "Ссылка", ... )
В данном случае использование ключевого слова Ссылка заставляет систему пытаться сопоставить саму ссылку номенклатуры со справочником категорий, что логически неверно и приводит к ошибкам СУБД. Вместо этого в пятом параметре шаблона мы должны указать реальный реквизит номенклатуры, который хранит категорию (например, КатегорияНоменклатуры).
Вторая проблема — иерархия справочника. У номенклатуры есть группы (папки) и элементы. Группы не содержат реквизита категории, либо он для них пуст. Чтобы система не проверяла ограничения для групп и не вызывала ошибок при построении дерева каталогов, мы используем специальный третий параметр шаблона — модификатор "НеОграничиватьДоступКГруппам".
Правильный текст ограничения для роли (на примере права Чтение):
#ПоЗначениям( "Справочник.Номенклатура","Чтение","НеОграничиватьДоступКГруппам","КатегорииНоменклатуры","КатегорияНоменклатуры","","","","","","", "","", "","", "","", "","", "","", "","", "","", "","", "","", "","", "","", "","" )
---
После внесения изменений в код модулей и настройки ролей система еще не знает о новых правилах, поскольку параметры ограничения доступа кэшируются в базе данных. Нам необходимо обновить эти вспомогательные данные.
Выполнить обновление можно двумя путями:
Найдите в папке шаблона вашей версии БСП (путь обычно выглядит как ...\tmplts\1c\SSL\[Версия]\ExtFiles\Инструменты разработчика\) внешнюю обработку ОбновлениеВспомогательныхДанных.epf. Запустите ее в режиме «1С:Предприятие» под администратором и нажмите кнопку «Обновить».
Создайте внешнюю обработку или выполните в консоли кода следующий фрагмент под полными правами:
УправлениеДоступомСлужебный.ОбновитьПараметрыОграниченияДоступа();
После этого перезапустите сеанс работы пользователя, чтобы новые параметры кэша вступили в силу.
---
Если после выполнения всех настроек тестовый пользователь заходит в систему и все равно видит все позиции номенклатуры без ограничений, проанализируем возможные причины:
Номенклатура БЕЗ RLS, то ограничения работать не будут. Для проверки оставьте пользователю только минимальный набор («Запуск тонкого клиента» + ваша тестовая роль).НСИ и администрирование -> Настройки пользователей и прав) установлен флаг «Ограничивать доступ на уровне записей». Если эта константа выключена, механизмы RLS полностью отключаются платформой.Следуя этой пошаговой инструкции, вы сможете успешно внедрить ограничение доступа по любым аналитическим разрезам вашей конфигурации, избегая системных ошибок и просадок производительности.