Внедрение собственного вида доступа в современные конфигурации на базе БСП (такие как 1С:ERP 2.5, КА 2.5 или УТ 11.5) существенно отличается от старых методов работы с RLS. Переход на производительный RLS (механизм доступа на уровне записей через ключи доступа) требует от разработчика строгого соблюдения последовательности действий в коде и метаданных. Рассмотрим по шагам, как правильно внедрить новый вид доступа и что делать, если система сообщает, что «ограничение отключено и ключи доступа не нужны».
Предположим, перед нами стоит задача ограничить доступ к новому документу по определенному реквизиту. В качестве типа этого реквизита мы используем новое Перечисление (это и будет наш новый вид доступа).
Проанализируем необходимые изменения в метаданных. Нам нужно включить наши новые объекты в состав определяемых типов, которые использует подсистема управления доступом:
Если ваш вид доступа подразумевает иерархию (например, справочник), не забудьте про тип ЗначениеДоступаОбъект. Для перечислений это обычно не требуется, но важно понимать общую структуру зависимостей.
Подсистема управления доступом должна «узнать» о существовании нового вида доступа и о том, какие объекты он ограничивает. Для этого мы вносим изменения в общий модуль УправлениеДоступомПереопределяемый.
Разберем основные функции, которые требуют заполнения:
В функции ПриЗаполненииВидовДоступа регистрируем наш вид доступа:
Процедура ПриЗаполненииВидовДоступа(ВидыДоступа)
ВидДоступа = ВидыДоступа.Добавить();
ВидДоступа.Имя = "НашНовыйВидДоступа";
ВидДоступа.Заголовок = НСтр("ru = 'Наш новый вид доступа'");
ВидДоступа.ТипЗначений = Тип("ПеречислениеСсылка.НашеНовоеПеречисление");
КонецПроцедуры
В функциях ПриЗаполненииВидовОграничений и ПриЗаполненииСписковОграничений (в зависимости от версии БСП) указываем связь документа и вида доступа. Также обязательно проверьте процедуру ПриЗаполненииВидовОграниченийПравОбъектовМетаданных, где прописывается, какие права (Чтение, Изменение) ограничиваются для конкретной таблицы.
Для производительного RLS критически важно правильно прописать логику в модуле менеджера самого документа. Рассмотрим пример стандартного шаблона в функции НастроитьОграничениеИспользования (или аналогичной, вызываемой механизмом RLS):
Процедура НастроитьОграничениеИспользования(Настройки) Экспорт
Настройка = Настройки.Добавить();
Настройка.Текст =
"ГДЕ
| ЗначениеРазрешено(РеквизитВидаДоступа)";
КонецПроцедуры
Использование конструкции ЗначениеРазрешено позволяет системе автоматически подставлять оптимизированные запросы к регистрам ключей доступа.
Выясним важную деталь: просто добавить код недостаточно. Нужно создать роль (или модифицировать существующую), где для нашего документа будет установлено ограничение доступа. Разберем типичную ошибку: копирование шаблона #ДляОбъекта("") только в право Чтение.
Внимание! В новых версиях ERP (начиная с 2.5) механизм формирования ключей доступа может игнорировать объекты, если ограничения установлены только на чтение. Проанализируем причину: система стремится исключить ситуацию «записал то, что не могу прочитать». Чтобы ключи доступа начали генерироваться, установите ограничение доступа (шаблон) не только на Чтение, но и на Добавление и Изменение.
После внесения изменений в конфигуратор, необходимо обновить кэш и параметры доступа в режиме «1С:Предприятие». Обычного запуска может быть недостаточно. Рассмотрим последовательность действий:
ПараметрыОграниченияДоступа.
УправлениеДоступомСлужебный.ЗаполнитьПараметрыОграниченияДоступа();
Это инициирует полный пересчет метаданных с точки зрения доступа.УправлениеДоступом.epf (из состава БСП или состава поставки ERP), чтобы проверить состояние таблиц. Если в колонке «Ключи доступа» стоит прочерк или сообщение об отсутствии необходимости ключей — значит, система не видит связи между ролью, объектом и видом доступа.Если ключи доступа все равно не формируются, проанализируем следующие моменты:
1. Регистр «Используемые виды доступа по таблицам». Это ключевой индикатор. Если вашего документа там нет в связке с новым видом доступа, RLS работать не будет. Записи в этом регистре появляются только тогда, когда система находит в метаданных хотя бы одну активную роль с RLS-запросом, назначенную пользователю.
2. Регистр «Настройка видов доступа». Проверьте, включен ли ваш новый вид доступа в актуальные профили групп доступа. Если в профиле (в режиме пользователя) не задано ограничение по этому виду, система может считать его «открытым» и не генерировать детальные ключи для экономии ресурсов.
3. Фоновые задания. Формирование ключей доступа происходит в фоне. Проверьте состояние очереди в регистре Объекты для обновления ключей доступа. Если он пуст, но ключей нет — возвращайтесь к шагу 4 и проверьте наличие RLS на правах «Изменение».
Подводя итог, можно сказать, что производительный RLS — это «вещь в себе», требующая синхронизации программного кода, настроек метаданных и пользовательских данных (профилей и групп доступа). Только при наличии ограничений на основные права (Чтение/Запись) и корректной регистрации в УправлениеДоступомПереопределяемый система начнет строить карту доступа для вашего нового объекта.