Работа с механизмом RLS (Record Level Security) в крупных конфигурациях, таких как 1С:ERP 2.4, часто превращается в настоящий квест для разработчика. Система может выдавать общую ошибку «У пользователя недостаточно прав для работы с базой данных», при этом стандартный Журнал регистрации остается девственно чист или содержит малоинформативные записи. В этой статье мы подробно разберем, как локализовать проблемный объект метаданных и какие инструменты использовать для диагностики ограничений доступа.
Прежде чем погружаться в конфигуратор или настраивать сложные фильтры логов, проанализируем информацию, которую платформа предоставляет в пользовательском режиме. В современных версиях платформы 1С:Предприятие 8.3 (интерфейс «Такси») существует скрытый, но очень полезный инструмент.
Рассмотрим порядок действий:
Разберем, что это дает: в данном окне часто фиксируется стек вызовов и детальное описание последней ошибки, включая объекты, к которым пыталась обратиться система непосредственно перед аварийным завершением операции. Это может сэкономить часы ручного перебора ролей.
Если ошибка возникает при формировании отчета на базе Системы компоновки данных (СКД), проанализируем текст запроса. По умолчанию, если в запросе нет ключевого слова РАЗРЕШЕННЫЕ, система пытается прочитать все записи из указанных таблиц. Если RLS запрещает доступ хотя бы к одной записи или к самой таблице (в зависимости от настроек роли), СКД выдаст фатальную ошибку доступа.
Посмотрим на пример стандартного запроса:
ВЫБРАТЬ
ЗаказыКлиентов.Ссылка,
ЗаказыКлиентов.СуммаДокумента
ИЗ
Документ.ЗаказКлиента КАК ЗаказыКлиентов
Если у пользователя ограничены права на часть организаций или складов, такой запрос может упасть. Исправим ситуацию, добавив РАЗРЕШЕННЫЕ:
ВЫБРАТЬ РАЗРЕШЕННЫЕ
ЗаказыКлиентов.Ссылка,
ЗаказыКлиентов.СуммаДокумента
ИЗ
Документ.ЗаказКлиента КАК ЗаказыКлиентов
В этом случае система просто исключит из выборки те записи, на которые у пользователя нет прав, и отчет сформируется без ошибок. Однако важно помнить: это «лечит» симптом, а не причину. Если пользователю должны быть видны эти данные, нужно копать глубже.
В ERP 2.4 используется так называемый «производительный RLS». Это механизм, при котором права не вычисляются «на лету» для каждой записи в сложном запросе, а хранятся в виде готовых ключей в специальных регистрах. Проанализируем ситуацию, когда роли назначены верно, но данных все равно нет.
Выясним причину через проверку следующих объектов:
Когда стандартные методы бессильны, воспользуемся «тяжелой артиллерией» — Технологическим журналом. Это наиболее надежный способ увидеть, какой именно SQL-запрос уходит на сервер и где происходит отказ.
Для поиска ошибок доступа нам необходимо настроить сбор событий DBMSSQL (для MS SQL Server) или DBV8DBEng. В файле logcfg.xml следует настроить отбор по событию ошибки или по тексту запроса, содержащему условия RLS. Рассмотрим пример настройки:
<config xmlns="http://v8.1c.ru/v8/tech-log">
<log location="C:\LOGS\RLS_ERROR" history="2">
<event>
<eq property="Name" value="DBMSSQL"/>
<like property="Sql" value="%WHERE%"/>
</event>
<property name="All"/>
</log>
</config>
Проанализируем полученные логи: 1С добавляет к вашему запросу огромные конструкции WHERE EXISTS.... В этих конструкциях фигурируют временные таблицы прав. Если в логе вы видите ошибку выполнения SQL-запроса или пустой результат там, где он должен быть, обратите внимание на имена таблиц метаданных в секции FROM. Это и будет искомый объект.
Часто проблема RLS кроется в полях составного типа (например, поле Владелец, ДокументОснование или Регистратор). Если в отчете или динамическом списке выводится поле составного типа, и у пользователя нет прав хотя бы на один тип из этого состава, система может вести себя нестабильно.
Разберем ситуацию: поле Владелец может ссылаться на справочники Контрагенты и ФизическиеЛица. Если у пользователя есть права на контрагентов, но нет на физлиц, попытка обращения к свойствам владельца «через точку» (например, Владелец.Наименование) в запросе без РАЗРЕШЕННЫЕ может привести к ошибке доступа. Рекомендуется всегда явно ограничивать типы в запросах или использовать проверку прав на каждый входящий тип.
Не забывайте про встроенный в ERP 2.4 функционал. В разделе «Администрирование» — «Настройки пользователей и прав» выберите пользователя и воспользуйтесь отчетом «Права доступа».
Рассмотрим, как с ним работать:
Часто выясняется, что у пользователя пересекаются несколько групп доступа: одна разрешает доступ к складу «А», а другая накладывает ограничение, которое система интерпретирует как запрет на всё остальное. Проанализируйте итоговое ограничение, которое выводится в колонке «Ограничение» данного отчета.
Подведем итог. Чтобы не «ковырять» отчет вручную часами, придерживайтесь следующего алгоритма:
РАЗРЕШЕННЫЕ в запрос СКД — если отчет заработал, значит, проблема в данных, скрытых RLS.Использование этих методов в комплексе позволяет сократить время поиска причины ошибки RLS с нескольких часов до нескольких минут.