Как доработать ограничение доступа RLS для справочника в 1С при помощи БСП

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

Ограничение доступа на уровне записей (Record Level Security, или RLS) — одна из наиболее сложных и трудозатратных задач при разработке на платформе 1С:Предприятие 8.3. Особенно часто вопросы возникают при использовании механизмов Библиотеки стандартных подсистем (БСП), так как она накладывает определенные правила на структуру метаданных и программный код. Рассмотрим типичную ситуацию: нам необходимо ограничить доступ к конкретным элементам справочника БанковскиеСчета (например, скрыть счет определенного сотрудника от всех, кроме узкого круга лиц), используя современные инструменты БСП.

Проанализируем ситуацию и разберем по шагам правильный алгоритм внедрения RLS, который позволит избежать типичных ошибок, таких как «пустые списки» или полное отсутствие фильтрации.

Шаг 1. Подготовка структуры метаданных

Для реализации гибкого управления доступом нам потребуется вспомогательный объект, который будет выступать «группой доступа» для целевого справочника. Это позволит не прописывать каждого пользователя в коде, а управлять правами через профили и группы доступа в режиме «1С:Предприятие».

  1. Создадим новый справочник ГруппыДоступаБанковскихСчетов. В нем добавим реквизит ГруппаДоступа с типом СправочникСсылка.ГруппыДоступаБанковскихСчетов.
  2. В целевом справочнике (в нашем примере это БанковскиеСчета) добавим реквизит ГруппаДоступа. Тип значения должен соответствовать нашему новому справочнику — СправочникСсылка.ГруппыДоступаБанковскихСчетов.

Важный нюанс: Чтобы механизм БСП увидел эти поля, необходимо включить наши справочники в определяемые типы. Рассмотрим их подробнее:

Шаг 2. Настройка подписок и переопределяемых модулей

Для того чтобы система знала, как обрабатывать наши новые виды доступа, необходимо внести изменения в общий модуль УправлениеДоступомПереопределяемый. Проанализируем, какие процедуры требуют нашего внимания.

В процедуре ПриЗаполненииВидовДоступа опишем новый вид доступа:


Процедура ПриЗаполненииВидовДоступа(ВидыДоступа) Экспорт
    ВидДоступа = ВидыДоступа.Добавить();
    ВидДоступа.Имя = "ГруппыБанковскихСчетов";
    ВидДоступа.Представление = НСтр("ru = 'Группы банковских счетов'");
    ВидДоступа.ТипЗначений = Тип("СправочникСсылка.БанковскиеСчета");
    ВидДоступа.ТипГруппЗначений = Тип("СправочникСсылка.ГруппыДоступаБанковскихСчетов");
КонецПроцедуры

Далее укажем системе, для каких объектов метаданных будет применяться это ограничение в процедуре ПриЗаполненииВидовОграниченийПравОбъектовМетаданных:


Процедура ПриЗаполненииВидовОграниченийПравОбъектовМетаданных(Описание) Экспорт
    Описание = Описание + "
    |Справочник.БанковскиеСчета.Чтение.ГруппыБанковскихСчетов
    |Справочник.БанковскиеСчета.Изменение.ГруппыБанковскихСчетов
    |Справочник.ГруппыДоступаБанковскихСчетов.Чтение.ГруппыБанковскихСчетов
    |";
КонецПроцедуры

Также не забудьте отметить справочник БанковскиеСчета в подписке на событие ОбновитьГруппыЗначенийДоступа, чтобы система автоматически актуализировала права при записи элементов.

Шаг 3. Программирование логики в модулях менеджера

Современный RLS в БСП (начиная с версий 2.4/3.0) использует декларативный подход. Мы должны прописать логику в модуле менеджера каждого справочника. Рассмотрим пример для БанковскиеСчета:


Процедура ПриЗаполненииОграниченияДоступа(Ограничение) Экспорт
    Ограничение.Текст = "РазрешитьЧтениеИзменение |ГДЕ | ЗначениеРазрешено(Ссылка)";
КонецПроцедуры

Аналогичный код следует добавить в модуль менеджера справочника ГруппыДоступаБанковскихСчетов. Это свяжет физические записи в таблицах БД с логическими ключами доступа, которые генерирует БСП.

Шаг 4. Работа с ролями и шаблонами

Одной из самых частых причин, почему RLS «не отрабатывает», является неправильное использование шаблонов в ролях. Выясним, как правильно прописать ограничение в правах на Чтение и Изменение.

В тексте ограничения права доступа следует использовать стандартный шаблон БСП #ПоЗначениям. Рассмотрим пример настройки для права Чтение:


#Если &ОграничениеДоступаНаУровнеЗаписейУниверсально #Тогда
    #ДляОбъекта("")
#Иначе
    #ПоЗначениям( "Справочник.БанковскиеСчета", "Чтение", "", "ГруппыБанковскихСчетов", "Ссылка", "","", "","", "","", "","", "","", "","", "","", "","", "","", "","", "","", "","", "","", "","", "","" )
#КонецЕсли

Крайне важно: При добавлении новых ролей обязательно включайте их в Подсистемы, которые доступны пользователям. Если роль не включена ни в одну подсистему, ограничение на Просмотр может не сработать корректно, и пользователь увидит пустой список или получит ошибку прав доступа.

Шаг 5. Особенности реализации в формах

Как показывает практика, даже идеально настроенный код в модулях не гарантирует результата, если данные не попадают в реквизиты. Рассмотрим ситуацию: вы создали реквизит ГруппаДоступа, но забыли вывести его на форму или заполнить.

Для корректной работы:

  1. Выведите реквизит ГруппаДоступа на форму элемента справочника.
  2. В обработчике ПриЧтенииНаСервере формы добавьте вызов стандартного метода БСП: УправлениеДоступом.ПриЧтенииНаСервере(ЭтотОбъект, ТекущийОбъект); Это обеспечит визуальное ограничение прав (например, блокировку полей формы для чтения), если у пользователя нет прав на изменение.

Шаг 6. Обновление вспомогательных данных

После внесения всех изменений в конфигураторе, система 1С не начнет применять новые правила мгновенно. Необходимо инициализировать обновление внутренних таблиц БСП (регистров сведений с ключами доступа).

Выполните следующие действия:

  1. Запустите информационную базу под пользователем с полными правами.
  2. Воспользуйтесь внешней обработкой ОбновлениеВспомогательныхДанных.epf (обычно идет в составе дистрибутива БСП).
  3. Или запустите базу с параметром командной строки: /C ЗапуститьОбновлениеИнформационнойБазы.

Типичные ошибки и способы их решения

Рассмотрим ситуацию, когда после всех настроек список объектов стал пустым. Чаще всего это происходит по одной из трех причин:

Проанализировав все вышеперечисленные шаги, мы видим, что внедрение RLS — это комплексный процесс, требующий внимания как к метаданным, так и к программным интерфейсам БСП. Соблюдение этой последовательности позволит вам создать надежную и гибкую систему разграничения прав в вашей конфигурации.

← На главную