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