При разработке внешних отчетов программисты часто сталкиваются с ситуацией, когда механизмы ограничения доступа на уровне записей (RLS), настроенные в конфигурации, ведут себя не так, как ожидалось. Пользователь может видеть в списках выбора все организации или склады предприятия, хотя в обычных документах его права ограничены. Это вызывает не только неудобство, но и вопросы безопасности данных.
В этой статье мы подробно разберем, как заставить внешний отчет соблюдать правила RLS, проанализируем разницу между правами доступа и научимся правильно настраивать систему компоновки данных (СКД).
Первое, на что стоит обратить внимание при создании отчета — это текст запроса в наборе данных СКД. По умолчанию запрос пытается выбрать все записи из базы данных. Если у пользователя настроен RLS, и запрос обращается к данным, к которым у пользователя нет доступа, система 1С выдаст ошибку нарушения прав доступа, и отчет не сформируется вовсе.
Чтобы избежать этой ошибки и заставить систему просто игнорировать (отфильтровывать) недоступные записи, мы должны использовать конструкцию ВЫБРАТЬ РАЗРЕШЕННЫЕ. Рассмотрим пример типичного запроса для отчета:
ВЫБРАТЬ РАЗРЕШЕННЫЕ
ПродажиОбороты.Организация КАК Организация,
ПродажиОбороты.Склад КАК Склад,
ПродажиОбороты.Номенклатура КАК Номенклатура,
ПродажиОбороты.КоличествоОборот КАК Количество
ИЗ
РегистрНакопления.Продажи.Обороты(&НачалоПериода, &КонецПериода, , ) КАК ПродажиОбороты
В системе компоновки данных этот флаг можно установить и визуально. Для этого перейдем на закладку «Набор данных», и в верхней части окна запроса найдем опцию «Выбирать разрешенные». Установка этого флага гарантирует, что в результат отчета попадут только те данные, на которые у текущего пользователя есть право Чтение.
Проанализируем ситуацию, описанную в обсуждении: почему даже при наличии ограничений в списке выбора параметров отчета все равно отображаются все элементы? Здесь кроется ключевое различие между правами платформы 1С.
Разберем эти понятия подробнее:
Чтение, но нет права Просмотр, он сможет увидеть данные в отчете, но не сможет найти этот элемент через форму списка или в выпадающем списке выбора.Если во внешнем отчете при нажатии на кнопку выбора склада открывается полный список, значит у роли пользователя для данного справочника включено право Чтение без ограничений RLS или само ограничение настроено слишком широко. Проверьте настройки ролей в конфигураторе. Для корректной фильтрации в формах выбора RLS должен быть жестко привязан к праву Чтение, а право Просмотр должно быть производным от него.
Когда мы выбираем организацию в параметрах внешнего отчета, платформа открывает форму выбора соответствующего справочника. В подавляющем большинстве случаев эта форма строится на базе ДинамическогоСписка. Выясним причину, по которой список может игнорировать ограничения.
У динамического списка есть важное свойство — «Использовать ограничения прав доступа на уровне записей». По умолчанию оно включено, что заставляет список выполнять запрос с неявным использованием РАЗРЕШЕННЫЕ. Однако, если внешний отчет запускается в специфическом окружении или программно переопределяет форму выбора, это поведение может измениться. Убедитесь, что вы не используете программное открытие формы с отключенными фильтрами.
Иногда RLS настроен верно, но бизнес-логика требует дополнительного сужения списка. Например, если пользователь выбрал организацию «А», в параметре «Склад» должны отображаться только склады этой организации. Во внешнем отчете это настраивается на закладке «Параметры» или в настройках полей набора данных.
Посмотрим на алгоритм настройки «Связи параметров выбора»:
Склад.Отбор.Владелец(Организация).Это не заменяет RLS, но значительно упрощает работу пользователя, скрывая лишние элементы, к которым у него формально может быть доступ, но которые не имеют смысла в текущем контексте.
Рассмотрим ситуацию, когда отчет игнорирует все правила доступа. Это часто происходит, если код формирования отчета или инициализации его параметров выполняется в привилегированном режиме. Во внешних отчетах, которые подключаются через справочник «Дополнительные отчеты и обработки», существует возможность запуска в безопасном режиме.
Если в коде модуля объекта внешнего отчета вы встретите конструкцию:
УстановитьПривилегированныйРежим(Истина);
// Получение данных
УстановитьПривилегированныйРежим(Ложь);
Помните, что внутри этого блока RLS не работает. Платформа считает, что код выполняется от имени администратора с неограниченными правами. Проанализируйте ситуацию: если ваша задача — соблюдать права доступа, использование привилегированного режима для основных запросов отчета недопустимо.
В обсуждении упоминалось добавление отчета в расширение конфигурации. Это отличный способ, если вам нужно глубоко интегрировать отчет в систему. Когда отчет находится в расширении, он перестает быть «внешним файлом» и становится полноценным объектом метаданных.
Преимущества этого подхода:
Если вы настроили ВЫБРАТЬ РАЗРЕШЕННЫЕ, но пользователь все равно видит лишнее, проанализируйте ситуацию с помощью следующего алгоритма:
РАЗРЕШЕННЫЕ. Если консоль возвращает те же «лишние» данные, значит, RLS настроен неверно в самой конфигурации (в ролях пользователя).Чтение (с RLS), но на Просмотр галочка стоит без ограничений — в формах выбора могут возникать странности. Рекомендуется настраивать RLS симметрично для обоих прав.Таким образом, для того чтобы внешний отчет корректно фильтровал данные, необходимо сочетание трех факторов: использование ВЫБРАТЬ РАЗРЕШЕННЫЕ в СКД, корректная настройка RLS на право Чтение в ролях пользователя и отсутствие принудительного включения привилегированного режима в коде отчета.