1С: RLS – ограничение доступа на уровне записей в 1С. Часть 1. Записная книжка программиста

1С RLS – что нужно знать про настройку ограничений прав доступа на уровне записей. Теория примеры, практика.

Объект 1С «Роли»

Объект «Роли» предназначен для определения набора прав (совокупности разрешений) пользователей конфигурации  (ограничения прав доступа в прикладных решениях). Роль определяет, какие действия, над какими объектами метаданных может выполнять пользователь, выступающий в этой роли.

Роль в конфигурации может соответствовать:

  • должностям групп пользователей или
  • видам деятельности групп пользователей,

для работы которых предназначена данная конфигурация (например,  «Администратор» или «Продавец»).

В процессе ведения списка пользователей прикладного решения каждому пользователю ставится в соответствие одна или несколько ролей (т.е. в версии 1C 8.х каждый пользователь может иметь несколько ролей).

Для каждого из объектов (справочники, документы) разработчик устанавливает свой набор прав — чтение, запись, изменение, и т.д.

ВАЖНО!

В 1С общая логика управления доступом — это логика разрешений (нет никаких механизмов запрета доступа, а есть только механизмы выдачи доступа).

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

Можно изначально выдать не полный доступ к справочнику, а отфильтровать с помощью RLS данные, на которые мы даем доступ.

[свернуть]

При попытке пользователя выполнить действие, на которое у него нет разрешения, действие выполнено не будет, а система выдаст окно предупреждения «Нарушение прав доступа».

1. Рекомендации по подготовке расширений конфигурации

1.1. Основные причины отказа

Большинство расширений конфигурации не проходят аудит по следующим причинам:

  • Расширение не предназначено для выполнения в безопасном режиме.
  • Расширение не подготовлено к использованию в  сервисе.
  • Не задана версия расширения.
  • Использование расширений конфигурации, расширяющих данные, в конфигурациях, которые пока не поддерживают такую возможность.

1.2. Особенности расширений конфигурации

  • У расширения должны быть заданы уникальное имя и версия расширения.
  • Разработка должна выполняться на той же версии платформы.
  • Необходима адаптация к безопасному режиму и режиму разделения данных.

1.3. Полезная информация

  • Необходимо выполнять требования, указанные в Руководстве разработчика «1С:Предприятия 8.3»: глава «Расширение конфигурации» (см. по ссылке).
  • Если расширение содержит формы, разработчик должен обеспечить их работоспособность в веб-клиенте под всеми веб-браузерами, поддерживаемыми технологической платформой «1С:Предприятие 8».

Настройка ограничения доступа

RLS можно настроить только для прав:

  • чтение           (select)
  • добавление (insert)
  • изменение   (update)
  • удаление     (delete)

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

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

Для операции изменения ограничению доступа к данным должен соответствовать объект как до изменения (чтобы объект был прочитан), так и после изменения (чтобы объект был записан).

Для всех остальных прав такой возможности нет.

Добавим новое ограничение для права «чтение» справочника «Номенклатура». Откроется список полей, для которых можно настроить добавляемое ограничение.

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

Если выбрать флаг «Прочие поля», ограничение будет настроено для всех полей таблицы, кроме полей, для которых ограничения заданы явным образом.

Выбор полей для ограничения доступа

*Особенность: для прав добавление, изменение, удаление:

  • Ограничение может быть настроено только для всех полей.
  • Ограничение может быть только одно.

Для права «Чтение» можно настроить несколько условий, они будут объединяться логическим оператором «И».

В ограничениях на объекты базы данных следующих типов могут быть использованы не все поля основного объекта данных ограничения:

  • в регистрах накопления ограничения доступа могут содержать только измерения основного объекта ограничения;
  • в регистрах бухгалтерии в ограничениях можно использовать только балансовые измерения основного объекта ограничения

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

Механизм наложения ограничений доступа.

Любая операция над данными, хранимыми в базе данных, в «1С:Предприятии» в конечном счете приводит к обращению к базе данных с некоторым запросом на чтение или изменение данных. В процессе исполнения запросов к базе данных внутренние механизмы «1С:Предприятия» выполняют наложение ограничений доступа. При этом:

  • Формируется список прав (чтение, добавление, изменение, удаление), список таблиц базы данных и список полей, используемых этим запросом.
  • Из всех ролей текущего пользователя выбираются ограничения доступа к данным для всех прав, таблиц и полей, задействованных в запросе. При этом если какая-нибудь роль не содержит ограничений доступа к данным какой-нибудь таблицы или поля, то это значит, что в данной таблице доступны значения требуемых полей из любой записи. Иначе говоря, отсутствие ограничения доступа к данным означает наличие ограничения ГДЕ Истина.
  • Получаются текущие значения всех параметров сеанса и функциональных опций, участвующих в выбранных ограничениях.

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

Ограничения, полученные из одной роли, объединяются операцией И.

Ограничения, полученные из разных ролей, объединяются операцией ИЛИ.

Построенные условия добавляются к SQL-запросам, с которыми «1С: Предприятие» обращается к СУБД. При обращении к данным со стороны условий ограничения доступа проверка прав не выполняется (ни к объектам метаданных, ни к объектам базы данных). Причем механизм добавления условий зависит от выбранного способа действия ограничений «все» или «разрешенные».

Принцип сложения ограничений доступа

*Особенность: Если пользователю доступны несколько ролей с настроенными ограничениями на уровне записей к одному объекту, то в этом случае условия ограничений складываются логической операцией «ИЛИ». Другими словами полномочия пользователя складываются.

Отсюда вытекает след вывод: не допускать пересечения условия ограничения доступа к одному объекту в разных ролях, т.к в этом случае сильно усложнится текст запроса и это повлияет на производительность.

Способ «Все».

При наложении ограничений способом «все» к SQL-запросам добавляются условия и поля так, чтобы «1С:Предприятие» могло получить информацию о том, были ли в процессе исполнения запроса к базе данных использованы данные, запрещенные для данного пользователя или нет. Если запрещенные данные были использованы, то инициируется аварийное завершение запроса из-за нарушения прав доступа.

Наложение ограничений доступа способом «все» схематически представлено на рисунке:

Схема доступа к данный ВСЕ

Способ «Разрешенные».

При наложении ограничений способом «разрешенные» к SQL-запросам добавляются такие условия, чтобы запрещенные текущему пользователю записи не оказывали влияния на результат запроса. Иначе говоря, при наложении ограничений в режиме «разрешенные» запрещенные данному пользователю записи считаются отсутствующими и на результат операции не влияют, что схематически представлено на рисунке:

Схема доступа к данным РАЗРЕШЕННЫЕ

Ограничения доступа к данным накладываются на объекты базы данных в момент обращения «1С:Предприятия» к базе данных.

В клиент-серверном варианте «1С:Предприятия» наложение ограничений выполняется на сервере «1С:Предприятия».

Однако эта опция (РАЗРЕШЕННЫЕ) не сработает в случае, если мы в запросе обратимся к таблице, для которой не настроены ограничения доступа, но в которой есть ссылки на строки таблицы с настроенными ограничениями. В этом случае результат запроса выдаст «<Объект не найден>……» вместо значения ссылочного поля.

РАЗРЕШЕННЫЕ в запросе - Объект не найден

Если вы разрабатываете отчет или обработку с использованием запросов типовой или самописной конфигурации, всегда ставьте флаг «Разрешенные», чтобы отчет работал под любым пользователем с любым набором прав.

В случае объектного чтения данных из базы нет возможности поставить флаг «Разрешенные». Поэтому нужно настраивать отборы для объектного чтения с учетом возможных ограничений прав доступа для пользователя. Средств получения только разрешенных данных в объектной технике не предусмотрено.

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

Привилегированный режим 1С

Привилегированный режим 1С позволяет:

  • выполнить операции с данными от лица пользователей, которым данные недоступны;
  • ускорить работу, так как в привилегированном режиме не накладываются ограничения на доступ к данным.

Привилегированный режим следует использовать:

  • когда требуется с логической точки зрения отключить проверку прав;
  • когда допустимо отключить проверку прав, чтобы ускорить работу и при этом работа с данными от лица пользователя логически не нарушает установленные для него права доступа.

Программное включение привилегированного режима

Если Вы не хотите давать роли права на доступ к чему-либо, но какие-то метаданные нужно использовать в какой-то момент, можно:

  1. разместить процедуры и функции в общем модуле с установленным свойством «Привилегированный»;
  2. воспользоваться методом «УстановитьПривилегированныйРежим()»;

УстановитьПривилегированныйРежим(Истина);

.......

// выполняем запрещенные для роли действия

.......

УстановитьПривилегированныйРежим(Ложь);

Все, что внутри метода, будет выполняться без проверки прав пользователя.

Случаи использования привилегированного режима

  1. Если подчиненные регистры (движения документов) требуются пользователю для получения отчетов, то такие регистры следует оставлять доступными только для чтения, а запись в такие регистры следует выполнять переходом в привилегированный режим. При таком подходе, проверка прав на запись выполняется только для регистратора.
  2. Если регистры не требуются пользователю ни для получения отчетов, ни в командном интерфейсе, то не следует давать пользователю права на их чтение. Чтение или запись данных в такие регистры выполняется переходом в привилегированный режим.
  3. Если для выполнения разрешенной пользователю операции требуются заранее недоступные данные, тогда следует их получать переходом в привилегированный режим, но с гарантией предотвращения передачи этих данных на клиентскую сторону и с гарантией их использования на сервере только для выполнения запланированной операции.
  4. С целью повышения производительности в тех случаях, когда это не приводит к выполнению действий или получению данных, не разрешенных пользователю.

(подробнее)

[свернуть]

ВАЖНО!

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

Включать привилегированный режим следует точечно, чтобы остальной код не терял возможности проверки прав пользователя.  Для этого нужно:

  1. установить привилегированный режим точно перед выполнением действия;
  2. выполнить действие без проверки прав;
  3. отключить привилегированный режим сразу же после выполнения действия;
  4. продолжить выполнение кода в непривилегированном режиме.

Пример

Неправильно:

Процедура ИзменитьИлиУдалитьДанные(...)Экспорт

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

// Изменяем данные в привилегированном режиме

 ...

КонецПроцедуры

Процедура ПодготовитьДанные()

    УстановитьПривилегированныйРежим(Истина);

    // Код подготовки запроса, которому требуется проверка прав

    // Код выполнения запроса, для которого требуется отключить проверку прав

    Выборка= Запрос.Выполнить().Выбрать();

    // Обработка результатов запроса, где требуется проверка прав.

Правильно:

Процедура ИзменитьИлиУдалитьДанные(...)Экспорт

 // Изменяем данные

 // (при этом если у пользователя недостаточно прав для выполнения операции над данными, то будет вызвано исключение)

 ...

КонецПроцедуры

Процедура ПодготовитьДанные()

   // Код подготовки запроса

   УстановитьПривилегированныйРежим(Истина);

   Выборка= Запрос.Выполнить().Выбрать();

   УстановитьПривилегированныйРежим(Ложь);

   // Обработка результатов запроса

[свернуть]

Проверка доступности роли для пользователя

Если роль не дает никаких прав на объекты метаданных, а служит только для определения того или иного дополнительного права, в коде следует использовать метод ПравоДоступа().

  • правильно:

Если ПравоДоступа(“Редактирование”,Метаданные.Справочники.СтраныМира)Тогда ...

Если ПравоДоступа(“Просмотр”,Метаданные.Отчеты.ПопулярныеСтраны)Тогда ...

  • неправильно:

Если РольДоступна(“ДобавлениеИзменениеСтранМира”)Тогда ...

Если РольДоступна(“ПросмотрОтчетаПопулярныеСтраны”)Тогда ...

Такой подход позволяет повысить устойчивость кода к пересмотру состава ролей в конфигурации.

При использовании в конфигурации Библиотеки стандартных подсистем (БСП) следует использовать функцию РолиДоступны() общего модуля «Пользователи»:

  • без использования БСП:

Если РольДоступна(...)Или <ЭтоПолноправныйПользователь>Или ПривилегированныйРежим()Тогда ...

  • с использованием БСП:

Если Пользователи.РолиДоступны(...)Тогда ...

Программная работа с Ролями

Для проверки доступности Роли текущему пользователю:

РольДоступна(<НаименованиеРоли>)
// Пример использования:
ЭтоАдминистратор = РольДоступна(Метаданные.Роли.АдминистраторСистемы);
//Тот же самый результат можно получить так:
ЭтоАдминистратор = РольДоступна(«АдминистраторСистемы»);

Для определения права доступа (чтение, изменение и т.д.) к объекту метаданных:

ПравоДоступа(<Право>, <ОбъектМетаданных>, <Пользователь/Роль>, <СтандартныйРеквизитСтандартнаяТабличнаяЧасть>)
// Пример использования: проверка у текущего пользователя права на изменение справочника ФизическиеЛица
МожноРедактироватьФизЛиц = ПравоДоступа(«Изменение», Метаданные.Справочники.ФизическиеЛица);

Для проверки прав доступа текущего пользователя на объект метаданных:

ВыполнитьПроверкуПравДоступа(<Право>, <ОбъектМетаданных>, <СтандартныйРеквизитСтандартнаяТабличнаяЧасть>)
//Примеры использования:
ВыполнитьПроверкуПравДоступа(«ИнтерактивноеОткрытиеВнешнихОбработок», Метаданные);
ВыполнитьПроверкуПравДоступа(«ИнтерактивнаяПометкаУдаления», Метаданные.Справочники.ФизическиеЛица);

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

Для получение информации о праве доступа на определенный объект метаданных для пользователя или роли с учетом указанных полей:

ПараметрыДоступа(<НаименованиеПрава>, <ОбъектМетаданных>, <СписокПолей>, <Пользователь/Роль>)
//Пример использования:
ПараметрыДоступа = ПараметрыДоступа(«Чтение», Метаданные.РегистрыСведений.ТекущиеКадровыеДанныеСотрудников, «ТекущаяОрганизация,ФизическоеЛицо»);
ЕстьДоступ = ПараметрыДоступа.Доступность;
ОграничениеRLS = ПараметрыДоступа.ОграничениеУсловием;

Для получения представления права по имени:

ПредставлениеПрава(<ИмяПрава>)
//Пример использования:
Представление = ПредставлениеПрава(«ИнтерактивноеОткрытиеВнешнихОбработок»);
// Переменная Представление будет содержать строку «Интерактивное открытие внешних обработок»

Доступна ли роль 1С пользователю?

Чтобы узнать, нужно выполнить функцию РольДоступна(), передав туда название роли строкой.
Например:

Если РольДоступна(“ПолныеПрава”) ТогдаСообщить(“У вас полные права”);ИначеСообщить(“У вас нет полных прав”);КонецЕсли;

Нарушение прав доступа

Такую ошибку можно увидеть, если недостаточно прав на чтение/редактирование/удаление данных. Система выдаёт вот такую ошибку:

нарушение прав 

Чтобы исправить «нарушение прав доступа», необходимо понять, на какой объект пользователю не хватает прав, и добавить ему либо новую роль, либо в существующую роль добавить больше прав.

5 Comments

  1. Привет

  2. Добрый день.

    Хорошая статья.

    Своя конфигурация.

    Есть документ и простой бизнес процесс согласование.

    По окончанию бизнес процесса, хотелось бы закрыть доступ на изменение к этому документу.

    С помощью RLS это возможно сделать, если да но подскажите направление.

    • Добрый день.

      Могу посоветовать следующее:

      Создать регистр сведений с настройками, по которым доступ к документу может быть включен или выключен.

      В РЛС используейте этот регистр для ограничения доступа к документу.

      В бизнес-процессе, где нужно, меняете запись в регистре так, чтобы РЛС закрыло доступ к документу.

      Конечно же уберите возможность менять записи в этом регистре для пользователей кроме администратора.

  3. Спасибо! Классная статья

  4. Добрый день.

    Вам не кажется, что при решении, приведенном в практике 2, мы получим не только номенклатуру с актуальной ценой больше 500, но и всю (что попадает в последние 99999999 записей) номенклатуру, которой когда-либо устанавливали цену больше 500?

Рейтинг
( 1 оценка, среднее 5 из 5 )
Загрузка ...