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

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

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

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

Почему возникает ошибка при настройке RLS для номенклатуры?

Разберем типичную ситуацию. Разработчик пытается настроить ограничение доступа по категориям номенклатуры и сталкивается с тем, что система либо выдает ошибку при открытии динамического списка, либо игнорирует ограничения, показывая пользователю все элементы. Основными причинами таких проблем являются:

  1. Неверная типизация вида доступа в БСП: Ошибка в сопоставлении ограничиваемого объекта и объекта-разрешения.
  2. Ошибки в синтаксисе шаблона RLS: Использование служебного поля Ссылка вместо реального реквизита справочника в параметрах шаблона #ПоЗначениям.
  3. Игнорирование иерархии (групп и элементов): Попытка применить ограничение к группам справочника (папкам), у которых нет реквизита категории, что вызывает исключение СУБД.
  4. Неактуальность вспомогательных данных БСП: Отсутствие обновления кэша параметров доступа в базе данных.

Рассмотрим подробное решение проблемы по шагам.

---

Шаг 1. Правильное заполнение видов доступа в переопределяемом модуле

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

Первая и самая важная процедура — ПриЗаполненииВидовДоступа. Здесь совершается частая ошибка: в качестве ТипЗначений указывают сам ограничиваемый справочник (например, Номенклатура), хотя там должен быть указан тип справочника-разрешения. Рассмотрим правильный код:


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

Затем мы должны явно включить использование этого вида доступа в процедуре ПриЗаполненииИспользованияВидаДоступа:


&После("ПриЗаполненииИспользованияВидаДоступа")
Процедура ПриЗаполненииИспользованияВидаДоступаПосле(ВидДоступа, Использование) Экспорт
    
    Если ВидДоступа = "КатегорииНоменклатуры" Тогда
        Использование = Истина;
    КонецЕсли;
    
КонецПроцедуры

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


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

---

Шаг 2. Расширение определяемых типов конфигурации

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

  1. Найдите определяемый тип ЗначениеДоступа и добавьте в его состав тип СправочникСсылка.КатегорииНоменклатуры.
  2. Найдите определяемый тип ЗначениеДоступаОбъект и добавьте в его состав СправочникОбъект.КатегорииНоменклатуры.
  3. Для самого ограничиваемого объекта (Номенклатура) убедитесь, что его ссылочный и объектный типы включены в определяемые типы ВладелецЗначенийКлючейДоступа и ВладелецЗначенийКлючейДоступаОбъект. Это критически важно для работы RLS в производительном (универсальном) режиме.

---

Шаг 3. Написание правильного шаблона RLS в ролях

Перейдем к настройке ролей в конфигураторе. Нам нужно прописать ограничение доступа на права Чтение (а также при необходимости Добавление и Изменение) для справочника Номенклатура.

Типичная ошибка новичков выглядит так:

#ПоЗначениям( "Справочник.Номенклатура", "Чтение", "", "КатегорииНоменклатуры", "Ссылка", ... )

В данном случае использование ключевого слова Ссылка заставляет систему пытаться сопоставить саму ссылку номенклатуры со справочником категорий, что логически неверно и приводит к ошибкам СУБД. Вместо этого в пятом параметре шаблона мы должны указать реальный реквизит номенклатуры, который хранит категорию (например, КатегорияНоменклатуры).

Вторая проблема — иерархия справочника. У номенклатуры есть группы (папки) и элементы. Группы не содержат реквизита категории, либо он для них пуст. Чтобы система не проверяла ограничения для групп и не вызывала ошибок при построении дерева каталогов, мы используем специальный третий параметр шаблона — модификатор "НеОграничиватьДоступКГруппам".

Правильный текст ограничения для роли (на примере права Чтение):


#ПоЗначениям( "Справочник.Номенклатура","Чтение","НеОграничиватьДоступКГруппам","КатегорииНоменклатуры","КатегорияНоменклатуры","","","","","","", "","", "","", "","", "","", "","", "","", "","", "","", "","", "","", "","", "","" )

---

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

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

Выполнить обновление можно двумя путями:

  1. С помощью встроенной обработки БСП:

    Найдите в папке шаблона вашей версии БСП (путь обычно выглядит как ...\tmplts\1c\SSL\[Версия]\ExtFiles\Инструменты разработчика\) внешнюю обработку ОбновлениеВспомогательныхДанных.epf. Запустите ее в режиме «1С:Предприятие» под администратором и нажмите кнопку «Обновить».

  2. Программным вызовом:

    Создайте внешнюю обработку или выполните в консоли кода следующий фрагмент под полными правами:

    УправлениеДоступомСлужебный.ОбновитьПараметрыОграниченияДоступа();

После этого перезапустите сеанс работы пользователя, чтобы новые параметры кэша вступили в силу.

---

Шаг 5. Проверка кумулятивности ролей (почему пользователю все еще видно всё?)

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

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

← На главную