Как добавить свой вид доступа в производительный RLS в 1С:ERP 2.5 и решить проблему с генерацией ключей

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

Внедрение собственного вида доступа в современные конфигурации на базе БСП (такие как 1С:ERP 2.5, КА 2.5 или УТ 11.5) существенно отличается от старых методов работы с RLS. Переход на производительный RLS (механизм доступа на уровне записей через ключи доступа) требует от разработчика строгого соблюдения последовательности действий в коде и метаданных. Рассмотрим по шагам, как правильно внедрить новый вид доступа и что делать, если система сообщает, что «ограничение отключено и ключи доступа не нужны».

Шаг 1. Подготовка метаданных и новых объектов

Предположим, перед нами стоит задача ограничить доступ к новому документу по определенному реквизиту. В качестве типа этого реквизита мы используем новое Перечисление (это и будет наш новый вид доступа).

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

  1. ЗначениеДоступа: добавьте сюда ссылку на ваше новое перечисление.
  2. ПолеРегистраКлючейДоступаКРегистрам: также добавьте ваше перечисление.
  3. ВладелецЗначенийКлючейДоступа и ВладелецЗначенийКлючейДоступаДокумент: добавьте ваш новый документ.

Если ваш вид доступа подразумевает иерархию (например, справочник), не забудьте про тип ЗначениеДоступаОбъект. Для перечислений это обычно не требуется, но важно понимать общую структуру зависимостей.

Шаг 2. Регистрация в общих модулях (переопределяемая логика)

Подсистема управления доступом должна «узнать» о существовании нового вида доступа и о том, какие объекты он ограничивает. Для этого мы вносим изменения в общий модуль УправлениеДоступомПереопределяемый.

Разберем основные функции, которые требуют заполнения:

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


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

В функциях ПриЗаполненииВидовОграничений и ПриЗаполненииСписковОграничений (в зависимости от версии БСП) указываем связь документа и вида доступа. Также обязательно проверьте процедуру ПриЗаполненииВидовОграниченийПравОбъектовМетаданных, где прописывается, какие права (Чтение, Изменение) ограничиваются для конкретной таблицы.

Шаг 3. Настройка модуля менеджера документа

Для производительного RLS критически важно правильно прописать логику в модуле менеджера самого документа. Рассмотрим пример стандартного шаблона в функции НастроитьОграничениеИспользования (или аналогичной, вызываемой механизмом RLS):


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

Использование конструкции ЗначениеРазрешено позволяет системе автоматически подставлять оптимизированные запросы к регистрам ключей доступа.

Шаг 4. Настройка ролей и шаблонов ограничений

Выясним важную деталь: просто добавить код недостаточно. Нужно создать роль (или модифицировать существующую), где для нашего документа будет установлено ограничение доступа. Разберем типичную ошибку: копирование шаблона #ДляОбъекта("") только в право Чтение.

Внимание! В новых версиях ERP (начиная с 2.5) механизм формирования ключей доступа может игнорировать объекты, если ограничения установлены только на чтение. Проанализируем причину: система стремится исключить ситуацию «записал то, что не могу прочитать». Чтобы ключи доступа начали генерироваться, установите ограничение доступа (шаблон) не только на Чтение, но и на Добавление и Изменение.

Шаг 5. Принудительное обновление служебных данных

После внесения изменений в конфигуратор, необходимо обновить кэш и параметры доступа в режиме «1С:Предприятие». Обычного запуска может быть недостаточно. Рассмотрим последовательность действий:

  1. Очистите или обновите данные в регистре сведений (или константе в старых версиях) ПараметрыОграниченияДоступа.
  2. Выполните программный вызов: УправлениеДоступомСлужебный.ЗаполнитьПараметрыОграниченияДоступа(); Это инициирует полный пересчет метаданных с точки зрения доступа.
  3. Используйте внешнюю обработку УправлениеДоступом.epf (из состава БСП или состава поставки ERP), чтобы проверить состояние таблиц. Если в колонке «Ключи доступа» стоит прочерк или сообщение об отсутствии необходимости ключей — значит, система не видит связи между ролью, объектом и видом доступа.

Шаг 6. Диагностика и типичные проблемы

Если ключи доступа все равно не формируются, проанализируем следующие моменты:

1. Регистр «Используемые виды доступа по таблицам». Это ключевой индикатор. Если вашего документа там нет в связке с новым видом доступа, RLS работать не будет. Записи в этом регистре появляются только тогда, когда система находит в метаданных хотя бы одну активную роль с RLS-запросом, назначенную пользователю.

2. Регистр «Настройка видов доступа». Проверьте, включен ли ваш новый вид доступа в актуальные профили групп доступа. Если в профиле (в режиме пользователя) не задано ограничение по этому виду, система может считать его «открытым» и не генерировать детальные ключи для экономии ресурсов.

3. Фоновые задания. Формирование ключей доступа происходит в фоне. Проверьте состояние очереди в регистре Объекты для обновления ключей доступа. Если он пуст, но ключей нет — возвращайтесь к шагу 4 и проверьте наличие RLS на правах «Изменение».

Подводя итог, можно сказать, что производительный RLS — это «вещь в себе», требующая синхронизации программного кода, настроек метаданных и пользовательских данных (профилей и групп доступа). Только при наличии ограничений на основные права (Чтение/Запись) и корректной регистрации в УправлениеДоступомПереопределяемый система начнет строить карту доступа для вашего нового объекта.

← На главную