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