Как быстро найти объект, на котором спотыкается RLS в 1С:ERP?

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

Работа с механизмом RLS (Record Level Security) в крупных конфигурациях, таких как 1С:ERP 2.4, часто превращается в настоящий квест для разработчика. Система может выдавать общую ошибку «У пользователя недостаточно прав для работы с базой данных», при этом стандартный Журнал регистрации остается девственно чист или содержит малоинформативные записи. В этой статье мы подробно разберем, как локализовать проблемный объект метаданных и какие инструменты использовать для диагностики ограничений доступа.

Использование стандартных средств диагностики интерфейса «Такси»

Прежде чем погружаться в конфигуратор или настраивать сложные фильтры логов, проанализируем информацию, которую платформа предоставляет в пользовательском режиме. В современных версиях платформы 1С:Предприятие 8.3 (интерфейс «Такси») существует скрытый, но очень полезный инструмент.

Рассмотрим порядок действий:

  1. Спровоцируем возникновение ошибки у пользователя.
  2. Перейдем в главное меню (кнопка в виде «трилистника» или стрелки в левом верхнем углу).
  3. Выберем пункт «Справка» — «О программе».
  4. В открывшемся окне найдем гиперссылку «Информация для технической поддержки».

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

Конструкция «ВЫБРАТЬ РАЗРЕШЕННЫЕ» в СКД

Если ошибка возникает при формировании отчета на базе Системы компоновки данных (СКД), проанализируем текст запроса. По умолчанию, если в запросе нет ключевого слова РАЗРЕШЕННЫЕ, система пытается прочитать все записи из указанных таблиц. Если RLS запрещает доступ хотя бы к одной записи или к самой таблице (в зависимости от настроек роли), СКД выдаст фатальную ошибку доступа.

Посмотрим на пример стандартного запроса:


ВЫБРАТЬ
    ЗаказыКлиентов.Ссылка,
    ЗаказыКлиентов.СуммаДокумента
ИЗ
    Документ.ЗаказКлиента КАК ЗаказыКлиентов

Если у пользователя ограничены права на часть организаций или складов, такой запрос может упасть. Исправим ситуацию, добавив РАЗРЕШЕННЫЕ:


ВЫБРАТЬ РАЗРЕШЕННЫЕ
    ЗаказыКлиентов.Ссылка,
    ЗаказыКлиентов.СуммаДокумента
ИЗ
    Документ.ЗаказКлиента КАК ЗаказыКлиентов

В этом случае система просто исключит из выборки те записи, на которые у пользователя нет прав, и отчет сформируется без ошибок. Однако важно помнить: это «лечит» симптом, а не причину. Если пользователю должны быть видны эти данные, нужно копать глубже.

Специфика RLS в ERP 2.4: Ключи доступа

В 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 функционал. В разделе «Администрирование» — «Настройки пользователей и прав» выберите пользователя и воспользуйтесь отчетом «Права доступа».

Рассмотрим, как с ним работать:

  1. Выберите интересующий объект метаданных (например, конкретный вид документа).
  2. Отчет покажет все роли пользователя, дающие права на этот объект.
  3. Самое важное: он покажет вид ограничения (по организациям, по складам, по группам партнеров).

Часто выясняется, что у пользователя пересекаются несколько групп доступа: одна разрешает доступ к складу «А», а другая накладывает ограничение, которое система интерпретирует как запрет на всё остальное. Проанализируйте итоговое ограничение, которое выводится в колонке «Ограничение» данного отчета.

Резюме и план действий

Подведем итог. Чтобы не «ковырять» отчет вручную часами, придерживайтесь следующего алгоритма:

  1. Проверьте «Информацию для техподдержки» в меню «О программе».
  2. Добавьте РАЗРЕШЕННЫЕ в запрос СКД — если отчет заработал, значит, проблема в данных, скрытых RLS.
  3. Проверьте очереди обновления прав в регистрах сведений ERP.
  4. Запустите «Универсальный отчет» по объектам, которые входят в состав проблемного отчета. Если на каком-то объекте он выдаст ошибку доступа — вы нашли слабое звено.
  5. Настройте ТЖ, если нужно увидеть реальный SQL-запрос с наложенными условиями ограничения.

Использование этих методов в комплексе позволяет сократить время поиска причины ошибки RLS с нескольких часов до нескольких минут.

← На главную