В типовых конфигурациях линейки «1С:Предприятие», в частности в 1С:Управление торговлей 11.5, механизм ограничения доступа на уровне записей (RLS) нередко приводит к ситуации, когда пользователь с ограниченными правами перестает видеть договоры контрагентов. При попытке заглянуть в настройки ограничения в конфигураторе мы видим сложный шаблон RLS с множеством условий и соединений. Разберем по шагам, как устроена логика этого шаблона, выясним причины блокировки видимости и рассмотрим способы корректной диагностики и решения проблемы без отключения механизма безопасности.
Посмотрим на типовой шаблон RLS, который платформа применяет к справочнику Справочник.ДоговорыКонтрагентов:
#Если &ОграничениеДоступаНаУровнеЗаписейУниверсально #Тогда
#ДляОбъекта("")
#Иначе
#ПоЗначениямРасширенный( "Справочник.ДоговорыКонтрагентов","Чтение","",
"ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ИерархияПартнеров КАК Т2
ПО Т2.Родитель = Т.Партнер
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ДоговорыКонтрагентов.Филиалы КАК Т3
ПО Т3.Ссылка = Т.Ссылка",
"",
"ГруппыПартнеров","Т2.Партнер",
"И (","Организации","Т.Организация","ИЛИ","Организации","Т3.Организация",")
И","ХозяйственныеОперации","Т.ХозяйственнаяОперация",
"И (","Подразделения","Подразделение",")","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","")
#КонецЕсли
Проанализируем эту конструкцию. В шаблоне четко выделяются две ветки работы механизма подсистемы БСП «Управление доступом»:
&ОграничениеДоступаНаУровнеЗаписейУниверсально равен значению Истина, выполняется директива #ДляОбъекта(""). В этом случае сложный запрос с проверками не вычисляется на лету. Платформа проверяет права по специальным регистрам ключей доступа.#ПоЗначениямРасширенный. Здесь платформа формирует динамический запрос, соединяя текущую таблицу договора с регистром сведений РегистрСведений.ИерархияПартнеров и табличной частью Филиалы. Проверка строится через логическое «И» по следующим видам доступа: ГруппыПартнеров, Организации, ХозяйственныеОперации и Подразделения.Рассмотрим подробнее типовые ситуации, из-за которых конкретный договор может быть скрыт от пользователя:
ОбновлениеКлючейДоступаТекущие или ОбновлениеКлючейДоступаПериодические, доступ к объекту блокируется, так как ключ доступа для него еще не рассчитан в регистре КлючиДоступаКОбъектам.Подразделение или ХозяйственнаяОперация не заполнен, платформа воспринимает пустую ссылку как отдельное запрещенное значение и полностью отсекает строку.ГруппыПартнеров проверяет не сам элемент справочника Партнеры, а значение его реквизита ГруппаДоступа. Если реквизит пуст, а пользователю назначены только определенные группы партнеров, договор показан не будет.РегистрСведений.ИерархияПартнеров (Т2.Родитель = Т.Партнер). Если регламентные задания по актуализации иерархии завершились с ошибкой или данные регистра повреждены, левое соединение возвращает NULL, что ломает проверку ограничений.Т.Организация) либо организаций из табличной части филиалов (Т3.Организация). Если у пользователя нет доступа к указанной организации, объект скрывается.Вместо того чтобы отключать RLS через расширение, разберем по шагам правильные инструменты диагностики проблемы:
ЗначениеДоступа = Новый Структура("Договор", ВыбранныйДоговор);
Если Не УправлениеДоступом.ПроверитьДоступ("Чтение", ЗначениеДоступа) Тогда
// Анализируем причину отказа через контекст параметров ограничений
КонецЕсли;
DBMSSQL или DBPOSTGRS с фильтрацией по имени справочника. В лог запишется результирующий SQL-запрос с блоком WHERE, сформированным платформой, что позволит точно увидеть, какое из условий вернуло Ложь.Для восстановления видимости договоров без нарушения безопасности учета выполним следующие действия:
Организация, Подразделение и ХозяйственнаяОперация заполнены корректно. В карточке партнера обязательно заполним поле Группа доступа.