Как ограничить отображение данных по складам и организациям во внешнем отчете с помощью RLS

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

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

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

Использование ключевого слова ВЫБРАТЬ РАЗРЕШЕННЫЕ в запросах СКД

Первое, на что стоит обратить внимание при создании отчета — это текст запроса в наборе данных СКД. По умолчанию запрос пытается выбрать все записи из базы данных. Если у пользователя настроен RLS, и запрос обращается к данным, к которым у пользователя нет доступа, система 1С выдаст ошибку нарушения прав доступа, и отчет не сформируется вовсе.

Чтобы избежать этой ошибки и заставить систему просто игнорировать (отфильтровывать) недоступные записи, мы должны использовать конструкцию ВЫБРАТЬ РАЗРЕШЕННЫЕ. Рассмотрим пример типичного запроса для отчета:


ВЫБРАТЬ РАЗРЕШЕННЫЕ
    ПродажиОбороты.Организация КАК Организация,
    ПродажиОбороты.Склад КАК Склад,
    ПродажиОбороты.Номенклатура КАК Номенклатура,
    ПродажиОбороты.КоличествоОборот КАК Количество
ИЗ
    РегистрНакопления.Продажи.Обороты(&НачалоПериода, &КонецПериода, , ) КАК ПродажиОбороты

В системе компоновки данных этот флаг можно установить и визуально. Для этого перейдем на закладку «Набор данных», и в верхней части окна запроса найдем опцию «Выбирать разрешенные». Установка этого флага гарантирует, что в результат отчета попадут только те данные, на которые у текущего пользователя есть право Чтение.

Различие между правами Чтение и Просмотр

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

Разберем эти понятия подробнее:

  1. Право «Чтение» (Read): Позволяет программно получать данные из базы данных. Именно на это право настраиваются шаблоны RLS. Если чтения нет — данные не попадут в выборку запроса.
  2. Право «Просмотр» (View): Отвечает за видимость объекта в интерфейсе. Если у пользователя есть право Чтение, но нет права Просмотр, он сможет увидеть данные в отчете, но не сможет найти этот элемент через форму списка или в выпадающем списке выбора.

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

Особенности динамических списков в формах выбора

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

У динамического списка есть важное свойство — «Использовать ограничения прав доступа на уровне записей». По умолчанию оно включено, что заставляет список выполнять запрос с неявным использованием РАЗРЕШЕННЫЕ. Однако, если внешний отчет запускается в специфическом окружении или программно переопределяет форму выбора, это поведение может измениться. Убедитесь, что вы не используете программное открытие формы с отключенными фильтрами.

Связи параметров выбора в СКД

Иногда RLS настроен верно, но бизнес-логика требует дополнительного сужения списка. Например, если пользователь выбрал организацию «А», в параметре «Склад» должны отображаться только склады этой организации. Во внешнем отчете это настраивается на закладке «Параметры» или в настройках полей набора данных.

Посмотрим на алгоритм настройки «Связи параметров выбора»:

  1. Найдите параметр или поле Склад.
  2. В колонке «Параметры выбора» или «Связи параметров выбора» укажите условие.
  3. Установите связь: Отбор.Владелец(Организация).

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

Привилегированный режим и безопасный режим

Рассмотрим ситуацию, когда отчет игнорирует все правила доступа. Это часто происходит, если код формирования отчета или инициализации его параметров выполняется в привилегированном режиме. Во внешних отчетах, которые подключаются через справочник «Дополнительные отчеты и обработки», существует возможность запуска в безопасном режиме.

Если в коде модуля объекта внешнего отчета вы встретите конструкцию:


УстановитьПривилегированныйРежим(Истина);
// Получение данных
УстановитьПривилегированныйРежим(Ложь);

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

Перенос отчета в расширение

В обсуждении упоминалось добавление отчета в расширение конфигурации. Это отличный способ, если вам нужно глубоко интегрировать отчет в систему. Когда отчет находится в расширении, он перестает быть «внешним файлом» и становится полноценным объектом метаданных.

Преимущества этого подхода:

Практические советы по отладке доступа

Если вы настроили ВЫБРАТЬ РАЗРЕШЕННЫЕ, но пользователь все равно видит лишнее, проанализируйте ситуацию с помощью следующего алгоритма:

  1. Проверьте историю выбора: Часто пользователи путают реальный доступ с кэшированным списком последних выбранных значений. Очистите историю выбора в поле ввода.
  2. Используйте консоль запросов: Запустите консоль запросов под тем же пользователем и выполните запрос с ключевым словом РАЗРЕШЕННЫЕ. Если консоль возвращает те же «лишние» данные, значит, RLS настроен неверно в самой конфигурации (в ролях пользователя).
  3. Проверьте право «Просмотр»: Как мы выяснили ранее, если у роли стоит галочка на Чтение (с RLS), но на Просмотр галочка стоит без ограничений — в формах выбора могут возникать странности. Рекомендуется настраивать RLS симметрично для обоих прав.

Таким образом, для того чтобы внешний отчет корректно фильтровал данные, необходимо сочетание трех факторов: использование ВЫБРАТЬ РАЗРЕШЕННЫЕ в СКД, корректная настройка RLS на право Чтение в ролях пользователя и отсутствие принудительного включения привилегированного режима в коде отчета.

← На главную