Ограничение доступа на уровне записей (RLS — Record Level Security) в современных типовых конфигурациях 1С, таких как ERP, Комплексная автоматизация или Управление торговлей, строится на базе БСП (Библиотеки стандартных подсистем). Использование стандартного механизма позволяет гибко управлять правами, однако добавление нового разреза (вида доступа), которого нет в коробке — например, ограничение по Статьям движения денежных средств (ДДС) — требует последовательного программирования как в конфигураторе, так и правильной настройки в режиме «1С:Предприятие».
В этой статье мы подробно разберем, как внедрить новый вид доступа для справочника статей ДДС, заставить его появиться в интерфейсе настройки групп доступа, настроить RLS-шаблоны в ролях для самого справочника, а также распространить эти ограничения на документы информационной базы.
Для того чтобы система БСП поняла, что новый справочник может выступать в качестве аналитики ограничения доступа, его необходимо добавить в соответствующий определяемый тип.
Выполним следующие действия в конфигураторе:
ОпределяемыеТипы и найдем тип ЗначениеДоступа.СправочникСсылка.СтатьиДвиженияДенежныхСредств.Важно: Если вы ведете разработку в расширении конфигурации, обратите внимание на версию вашей платформы и БСП. В некоторых версиях прямое расширение этого определяемого типа может не поддерживаться стандартными инструментами платформы, поэтому изменения рекомендуется вносить в основную конфигурацию (или использовать механизмы кастомизации БСП через переопределяемые модули).
После расширения типа данных необходимо зарегистрировать наш новый вид доступа в логике самой БСП. Для этого используется общий модуль УправлениеДоступомПереопределяемый.
Найдем в этом модуле процедуру ПриЗаполненииВидовДоступа и добавим описание нашего нового вида доступа. Рассмотрим пример кода:
Процедура ПриЗаполненииВидовДоступа(ВидыДоступа) Экспорт
// Зарегистрируем новый вид доступа "Статьи движения ДС"
ВидДоступа = ВидыДоступа.Добавить();
ВидДоступа.Имя = "СтатьиДвиженияДенежныхСредств";
ВидДоступа.Представление = НСтр("ru = 'Статьи движения денежных средств'");
ВидДоступа.ТипЗначения = Тип("СправочникСсылка.СтатьиДвиженияДенежныхСредств");
КонецПроцедуры
Благодаря этому коду система зарегистрирует новую аналитику, и она сможет отображаться в профилях групп доступа в пользовательском интерфейсе.
После внесения изменений в метаданные и программный код, необходимо инициализировать обновление структуры данных БСП. Для этого запустим информационную базу в режиме «Предприятие» со специальным ключом обновления.
Пропишем в параметрах запуска ярлыка или в конфигураторе на вкладке «Отладка» следующий ключ:
/С ЗапуститьОбновлениеИнформационнойБазы
После завершения процедуры обновления параметров системы в режиме «Предприятие» мы сможем зайти в меню Администрирование — Настройки пользователей и прав — Профили групп доступа, создать или открыть существующий профиль и увидеть на вкладке «Ограничения доступа» наш новый вид доступа: Статьи движения денежных средств. Здесь мы сможем настроить виды доступа, например, выбрав вариант «Все запрещены, исключения назначаются в группах доступа».
Теперь, когда пользовательские группы настроены, нам необходимо принудительно заставить систему фильтровать элементы справочника при открытии динамических списков или форм выбора.
Для этого создадим новую роль (или изменим существующую, которая дает доступ к чтению статей ДДС, например, мояРольДоступСтатьиДвиженияДС). У пользователя не должно быть других ролей, которые дают полное (неограниченное) чтение этого справочника. Помните важное правило RLS 1С: если хотя бы одна роль разрешает чтение без ограничений, то ограничения из других ролей действовать не будут!
Перейдем к настройке прав роли на чтение справочника СтатьиДвиженияДенежныхСредств. Нам нужно прописать ограничение доступа на уровне записей.
Рассмотрим два варианта решения этой задачи:
Если в вашей роли на вкладке «Шаблоны ограничений» присутствует стандартный шаблон #ПоЗначениям, мы можем прописать лаконичную конструкцию для ограничения прав на чтение (поле <Прочие поля>):
#ПоЗначениям("Справочник.СтатьиДвиженияДенежныхСредств", "Чтение", "НеОграничиватьДоступКГруппам", "СтатьиДвиженияДенежныхСредств", "Ссылка", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "")
Разберем параметры этого шаблона по шагам:
"Справочник.СтатьиДвиженияДенежныхСредств" — имя текущей ограничиваемой таблицы метаданных."Чтение" — право, на которое накладывается ограничение."НеОграничиватьДоступКГруппам" — модификатор, который позволяет пользователю видеть папки (группы) иерархического справочника, чтобы не нарушать дерево отображения."СтатьиДвиженияДенежныхСредств" — имя вида доступа, зарегистрированного нами в шаге 2."Ссылка" — реквизит текущего справочника, значение которого должно проверяться на вхождение в список разрешенных элементов.Если в созданной вами роли отсутствуют стандартные шаблоны БСП или по каким-то причинам шаблонная сборка не отрабатывает, вы можете прописать прямой запрос ограничения прав на чтение. Ниже представлен проверенный практический пример такого запроса:
СтатьиДвиженияДенежныхСредств ГДЕ СтатьиДвиженияДенежныхСредств.Ссылка В
(ВЫБРАТЬ
СтатьиДвиженияДенежныхСредств.Ссылка КАК Ссылка
ИЗ
Справочник.СтатьиДвиженияДенежныхСредств КАК СтатьиДвиженияДенежныхСредств
ГДЕ
СтатьиДвиженияДенежныхСредств.ЭтоГруппа = ИСТИНА
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
ГруппыДоступаЗначенияДоступа.ЗначениеДоступа
ИЗ
Справочник.ГруппыДоступа.ЗначенияДоступа КАК ГруппыДоступаЗначенияДоступа
ГДЕ
ГруппыДоступаЗначенияДоступа.Ссылка В
(ВЫБРАТЬ
ГруппыДоступаПользователи.Ссылка КАК ГруппаДоступа
ИЗ
Справочник.ГруппыДоступа.Пользователи КАК ГруппыДоступаПользователи
ГДЕ
ГруппыДоступаПользователи.Пользователь = &АвторизованныйПользователь
И ГруппыДоступаПользователи.Ссылка.Профиль В
(ВЫБРАТЬ
ПрофилиГруппДоступаРоли.Ссылка КАК Профиль
ИЗ
Справочник.ПрофилиГруппДоступа.Роли КАК ПрофилиГруппДоступаРоли
ГДЕ
ПрофилиГруппДоступаРоли.Role.Name = "мояРольДоступСтатьиДвиженияДС")))
Этот запрос проверяет принадлежность текущего авторизованного пользователя к группам доступа, у которых в настройках профиля (для роли мояРольДоступСтатьиДвиженияДС) прописаны разрешенные значения нашего справочника.
После того как мы ограничили доступ к самому справочнику, возникнет логичный вопрос: пользователь не видит запрещенные статьи в справочнике, но по-прежнему может видеть документы (например, Платежное поручение или Списание с безналичных денежных средств), в которых эти статьи выбраны.
Выясним, как распространить RLS на документы:
мояРольДоступСтатьиДвиженияДС.Документ.ПлатежноеПоручение).Пример использования шаблона для документа:
#ПоЗначениям("Документ.ПлатежноеПоручение", "Чтение", "", "СтатьиДвиженияДенежныхСредств", "СтатьяДвиженияДенежныхСредств", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "")
Здесь система сопоставит значение в реквизите СтатьяДвиженияДенежныхСредств документа с правами текущего пользователя по виду доступа СтатьиДвиженияДенежныхСредств.
Аналогично, если вы используете прямой запрос без шаблонов, ограничение для документа будет выглядеть следующим образом:
ПлатежноеПоручение ГДЕ ПлатежноеПоручение.СтатьяДвиженияДенежныхСредств В
(ВЫБРАТЬ
ГруппыДоступаЗначенияДоступа.ЗначениеДоступа
ИЗ
Справочник.ГруппыДоступа.ЗначенияДоступа КАК ГруппыДоступаЗначенияДоступа
ГДЕ
ГруппыДоступаЗначенияДоступа.Ссылка В
...
Применение механизмов RLS на таблицы крупных документов (таких как платежные документы) может существенно снизить скорость работы системы при открытии списков. Проанализируем несколько советов, как избежать проблем с производительностью:
СтатьяДвиженияДенежныхСредств в документах обязательно должен иметь свойство Индексировать или Индексировать с доп. упорядочиванием.КлючиДоступаКОбъектам). Для работы нового вида доступа в производительном режиме убедитесь, что регламентные задания по расчету ключей доступа выполняются без ошибок.Таким образом, мы по шагам разобрали весь цикл внедрения нового вида доступа RLS в ERP: от описания типов в конфигураторе до прописывания условий ограничений на чтение таблиц баз данных.