Как работает rls 1с
Перейти к содержимому

Как работает rls 1с

  • автор:

Использование ограничений доступа к данным для различных объектов 1С:Предприятия 8

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

О принципах функционирования ограничений доступа к данным

Основные принципы функционирования и использования ограничений доступа к данным описаны в документации 1С:Предприятия 8 и в разделе «Ограничения доступа к данным. Сведения о принципах функционирования».

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

  • Каждое ограничение доступа к данным представляет собой запрос, записанный на языке запросов (с некоторыми упрощениями).
  • Проверка ограничений доступа к данным выполняется для каждой записи каждой таблицы базы данных, обращение к которым происходит при выполнении запроса или в процессе манипулирования любыми объектами 1С:Предприятия.
  • Для конкретной записи конкретной таблицы базы данных проверка ограничения заключается в исполнении запроса, представляющего это ограничение. Если в результате исполнения этого запроса получается непустая выборка, то считается, что доступ к записи разрешен. Если же выборка пустая, то доступ к записи запрещен.
  • Если обращение к данной записи требует проверки нескольких ограничений (из разных полей и/или из разных ролей текущего пользователя), то проверяется каждое из ограничений. Результаты проверки ограничений, наложенных на доступ к разным полям, объединяются логической операцией «И». Результаты проверки ограничений, относящихся к разным ролям текущего пользователя, объединяются логической операцией «ИЛИ». Если результат полученного логического выражения равен «Истина», то доступ к записи разрешен. Иначе — доступ запрещен.
  • Обращение по ссылке в ограничении имеет тот же смысл, что и обращение по ссылке в запросе, а именно, если ссылка указывает на несуществующую запись или имеет значение NULL, то значением поля по ссылке будет NULL.
  • Если в ограничении доступа к данным операция сравнения использует поле табличной части, то результат сравнения равен «Истина», если табличная часть содержит хотя бы одну запись, для которой результат этого сравнения — «Истина». При использовании в одном сравнении двух полей разных табличных частей значения сравнения будет «Истина», если в декартовом произведении этих табличных частей найдется запись, для которой сравнение имеет значение «Истина».

Приведем несколько примеров.

Например, в случае простейшего ограничения вида:

ГДЕ Реквизит = &ПравильноеЗначениеРеквизита

можно считать, что для каждой записи, для которой проверяется ограничение(проверяемой записи), выполняется запрос следующего вида:

ВЫБРАТЬ 1
ИЗ ТаблицаИзОднойПроверяемойЗаписи
ГДЕ Реквизит = &ПравильноеЗначениеРеквизита

В данной таблице доступ к записи, в которой значение реквизита «Реквизит» совпадает со значением параметра сеанса «ПравильноеЗначениеРеквизита», разрешен. К другим записям этой таблицы доступ запрещен.

Другой пример. Усложним ограничение. Допустим нужно разрешить доступ к записи таблицы «Справочник.Контрагенты» не только если ее «Реквизит» имеет «правильное значение», но и в том случае, если «правильное значение» имеет «Реквизит» родителя этой записи (1-го или 2-го уровня). В этом случае ограничение может иметь следующий вид:

Контрагенты
ИЗ Справочник.Контрагенты КАК Контрагенты
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Контрагенты КАК Контрагенты1
ПО Контрагенты.Родитель = Контрагенты1.Ссылка
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Контрагенты КАК Контрагенты2
ПО Контрагенты1.Родитель = Контрагенты2.Ссылка
ГДЕ Контрагенты.Реквизит = &ПравильноеЗначениеРеквизита ИЛИ Контрагенты1.Реквизит = &ПравильноеЗначениеРеквизита ИЛИ Контрагенты2.Реквизит = &ПравильноеЗначениеРеквизита

Тогда запрос, который будет выполнятся в процессе проверки этого ограничения для конкретной записи справочника «Контрагенты», будет иметь вид:

ВЫБРАТЬ 1
ИЗ ТаблицаИзОднойПроверяемойЗаписи КАК Контрагенты
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Контрагенты КАК Контрагенты1
ПО Контрагенты.Родитель = Контрагенты1.Ссылка
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Контрагенты КАК Контрагенты2
ПО Контрагенты1.Родитель = Контрагенты2.Ссылка
ГДЕ Контрагенты.Реквизит = &ПравильноеЗначениеРеквизита ИЛИ Контрагенты1.Реквизит = &ПравильноеЗначениеРеквизита ИЛИ Контрагенты2.Реквизит = &ПравильноеЗначениеРеквизита

Обращения по ссылкам в запросах и ограничения доступа к данным

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

Пусть на справочник «Контрагенты» установлено следующее ограничение доступа:

ГДЕ Ответственный = &ТекущийПользователь

а сам справочник содержит такие записи:

Ответственный
(ссылка на Справочник.Пользователи)

Завод имени Лапкина Иванов Пекарня Косолапова Любимов Электроламповый завод Иванов Трикотажная фабрика Генералов

Пусть регистр сведений «КонтактнаяИнформация» содержит следующие записи:

КонтактноеЛицо
(ссылка на Справочник.ФизЛица)

Организация
(ссылка на Справочник.Контрагенты)

Зайкин А. В. Завод имени Лапкина Тонков Т. А. Пекарня Косолапова Петров А. А. Электроламповый завод Сидоров И. И. Трикотажная фабрика

Тогда если текущим пользователем является пользователь «Иванов», то результатом запроса:

ВЫБРАТЬ РАЗРЕШЕННЫЕ Имя, Ответственный
ИЗ Справочник.Контрагенты

Ответственный
(ссылка на Справочник.Пользователи)

Завод имени Лапкина Иванов Электроламповый завод Иванов

Однако, результатом следующего запроса:

ВЫБРАТЬ РАЗРЕШЕННЫЕ КонтактноеЛицо, Организация
ИЗ РегистрСведений.КонтактнаяИнформация

Зайкин А. В. Завод имени Лапкина Тонков Т. А. . Петров А. А. Электроламповый завод Сидоров И. И. .

Ответственный
(ссылка на Справочник.Пользователи)

Пекарня Косолапова Любимов Трикотажная фабрика Генералов

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

ВЫБРАТЬ РАЗРЕШЕННЫЕ КонтактноеЛицо, Организация.Имя КАК Имя, Организация.Ответственный КАК Ответственный
ИЗ РегистрСведений.КонтактнаяИнформация

Зайкин А. В. Завод имени Лапкина Иванов Тонков Т. А. Петров А. А. Электроламповый завод Иванов Сидоров И. И.

поскольку противоречащие ограничению записи справочника «Контрагенты» считаются отсутствующими, а значениями полей «Имя» и «Ответственный» по ссылкам, указывающим на несуществующие записи, является значение NULL.

Если же необходимо по тому же признаку ограничить доступ к записям регистра сведений «КонтактнаяИнформация», то на этот регистр можно наложить ограничение вида:

ГДЕ Организация.Ответственный = &ТекущийПользователь

В этом случае результатом выполнения последнего запроса будет таблица:

Зайкин А. В. Завод имени Лапкина Иванов Петров А. А. Электроламповый завод Иванов

Ограничения и табличные части

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

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

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

Пусть таблица «Документ.Накладная» содержит следующие записи:

Контрагент
(ссылка на Справочник.Контрагенты)

Состав (табличная часть)

Пекарня Косолапова Булка с маком 20 Пирожок с курагой 30 Трикотажная фабрика Штаны 20 Футболка 100

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

ГДЕ Состав.Количество > 50

будет иметь вид

ВЫБРАТЬ 1
ИЗ ТаблицаИзОднойПроверяемойЗаписи КАК Накладная
ЛЕВОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ Документ.Накладная.Состав КАК Состав
ПО Накладная.Ссылка = Состав.Ссылка
ГДЕ Состав.Количество > 50

Следовательно доступ будет разрешен только для записи «Трикотажная фабрика». Поэтому запрос:

ВЫБРАТЬ РАЗРЕШЕННЫЕ Контрагент, Состав.(Номенклатура, Количество)
ИЗ Документ.Накладная

Трикотажная фабрика Штаны 20 Футболка 100

а запрос к вложенной таблице:

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

Трикотажная фабрика Штаны 20 Трикотажная фабрика Футболка 100

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

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

ГДЕ Состав.Количество > 50 ИЛИ Состав.Количество ЕСТЬ NULL

Если же необходимо разрешить доступ только к тем накладным, у которых в табличной части «Состав» нет записей с «Количеством», превышающем 50, то в ограничении необходимо использовать вложенный запрос:

Накладная1
ИЗ Документ.Накладная КАК Накладная1
ГДЕ Накладная1.Ссылка В
(
ВЫБРАТЬ Состав1.Ссылка
ИЗ Документ.Накладная.Состав КАК Состав1
СГРУППИРОВАТЬ ПО Состав1.Ссылка
ИМЕЮЩИЕ МАКСИМУМ(Состав1.Количество) ) ИЛИ Накладная1.Состав.Количество ЕСТЬ NULL

Объекты встроенного языка

Для работы с данными в объектной технике во встроенном языке 1С:Предприятия предусмотрены специальные объекты. Например для справочника это: СправочникиМенеджер , СправочникМенеджер. , СправочникСсылка. , СправочникОбъект. , и другие.

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

ГДЕ Тип = &ТипКонтактнойИнформации»

то для успешного выполнения метода

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

Виртуальные таблицы запросов

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

ВЫБРАТЬ
КонтактнаяИнформацияСрезПервых.Представление
ИЗ
РегистрСведений.КонтактнаяИнформация.СрезПоследних(, Тип = &Тип ) КАК КонтактнаяИнформацияСрезПервых
ГДЕ
КонтактнаяИнформацияСрезПервых.Тип = &Тип

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

Производительный режим RLS в 1С

Функционал подсистемы УправлениеДоступом позволяет работать с RLS в двух режимах: стандартном и производительном. Оба режима RLS в 1С имеют свои преимущества и недостатки.

Содержание скрыть

RLS в 1С

Для гибкой настройки прав пользователей в конфигурациях на базе БСП (подсистема УправлениеДоступом) реализован механизм настройки доступа на уровне записей (RLS). Этот механизм позволяет ограничивать доступ не только по видам объектов (для конкретных справочников, документов…), но и по данным в этих объектах (т.е., например, ограничить список документов только по одной организации или по конкретному менеджеру).

Функционал подсистемы УправлениеДоступом позволяет работать с RLS в двух режимах: стандартном и производительном. Каждый из режимов имеет свои преимущества и недостатки относительно другого. Основные из них будут рассмотрены в тексте далее.

Для дальнейших скриншотов, примеров кода, а также для решения задачи будем использовать демонстрационную конфигурацию «Библиотека стандартных подсистем», редакция 3.1 (3.1.5.132).

Ограничения RLS описываются в роли для конкретного объекта. Например, ограничение на чтение документа _ДемоСчетНаОплатуПокупателю в роли
_ДемоЧтениеДокументовПокупателей описывается следующим образом:

Производительный режим RLS в 1С

Производительный режим RLS в 1С

Производительный режим RLS в 1С

Как мы видим, для описания ограничений используются специальные шаблоны. В данном случае #ДляОбъекта и #ПоЗначениям. Шаблоны, которые могут быть использованы в роли необходимо описать на вкладке “Шаблоны ограничений”:

Производительный режим RLS в 1С

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

Рассмотрим текст ограничения доступа подробнее.

#Если &ОграничениеДоступаНаУровнеЗаписейУниверсально #Тогда #ДляОбъекта("") #Иначе #ПоЗначениям( "Документ._ДемоСчетНаОплатуПокупателю", "","", "_ДемоОрганизации", "Организация", "_ДемоГруппыПартнеров","Партнер", "","", "","", "","", "","", "","", "","", "","", "","", "","", "","", "","", "","", "","", "","") #КонецЕсли 

Как мы видим, выбор шаблона зависит от параметра &ОграничениеДоступаНаУровнеЗаписейУниверсально, который как раз и определяет режим, в котором должно использоваться RLS — стандартный или производительный. Значение этого параметра хранится в параметрах сеанса, а в самой базе выбрать режим можно двумя способами:

1. Зайти в раздел Администрирование — Настройки пользователей и прав — Группы доступа — Вариант работы — Производительный

Производительный режим RLS в 1С

2. В окне “Все функции” изменить значение константы “Ограничивать доступ на уровне записей универсально” на ИСТИНА, если нужен производительный режим и, соответственно на ЛОЖЬ, если стандартный.

Производительный режим RLS в 1С

Соответственно, если &ОграничениеДоступаНаУровнеЗаписейУниверсально = ЛОЖЬ, то будет использоваться стандартный метод и выполняться код

#ПоЗначениям( "Документ._ДемоСчетНаОплатуПокупателю", "","", "_ДемоОрганизации", "Организация", "_ДемоГруппыПартнеров","Партнер", "","", "","", "","", "","", "","", "","", "","", "","", "","", "","", "","", "","", "","", "",""), 

а если &ОграничениеДоступаНаУровнеЗаписейУниверсально = ИСТИНА, то будет использоваться производительный метод и выполняться код

#ДляОбъекта(""). 

Подробнее о синтаксисе и использовании шаблонов можно почитать в их описании.

При стандартном режиме ограничение прописывается прямо в роли (установлен отбор по разрешенным организации и партнеру). Эти отборы добавляются к итоговому запросу при обращении к СУБД. При наличии нескольких ролей с описанными ограничениями все условия собираются в один запрос, растет количество левых соединений, повышается риск неправильного использования индексов, выбора неоптимального плана выполнения запроса, что значительно его усложняет и замедляет выполнение. А так как при стандартном режиме работы ограничения рассчитываются “на лету” при каждом обращении к данным (формирование списков справочников и документов, их открытие и записи), то работа пользователя может значительно замедлиться из-за сложности сформированного запроса.

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

Как мы видим, в ограничении роли для производительного режима не описаны никакие условия, нет никакой информации о видах доступа, по которым необходимо ограничивать данные. Где же они указаны? Для этого в подсистеме УправлениеДоступом предусмотрена специальная экспортная процедура ПриЗаполненииОграниченияДоступа(), который описывается в модуле менеджера объекта, указанного в роли.

Так, для документа _ДемоСчетНаОплатуПокупателю эта процедура описана следующим образом:

Процедура ПриЗаполненииОграниченияДоступа(Ограничение) Экспорт Ограничение.Текст = "РазрешитьЧтениеИзменение |ГДЕ | ЗначениеРазрешено(Организация) | И ЗначениеРазрешено(Партнер)";КонецПроцедуры 

Здесь мы видим, что ограничение описывается с помощью некоторых типов ограничения (РазрешитьЧтениеИзменение) и функций ограничений (ЗначениеРазрешено()). Это нужно понимать так: пользователю будет разрешено читать и изменять документ _ДемоСчетНаОплатуПокупателю, когда ему будут разрешены значения организации и партнера, указанные в этом документе.

Примечание. Подробно о типах, функциях, синтаксисе ограничений описано на сайте ИТС в разделе — Инструкции по разработке на 1С

— Библиотека стандартных подсистем 3.1.6. Документация

— Глава 3. Настройка и использование подсистем при разработке конфигурации

— Разработка ограничений прав доступа

Далее в статье рассмотрим кратко лишь некоторые.

Некоторые типы ограничений

Типы ограничения могут быть:

  • РазрешитьЧтениеИзменение
  • РазрешитьИзменениеЕслиРазрешеноЧтение
  • РазрешитьИзменение

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

  • ЗначениеРазрешено( [] [, [, ] …]), где проверяемые типы могут быть (значения непроверяемых типов запрещены, если не уточнены отдельно):
  • Уточнение сравнения может быть:

— ПустаяСсылка КАК Ложь/Истина;
— Неопределено КАК Ложь/Истина;
— Null КАК Ложь/Истина;
— Отключено КАК Ложь/Истина (только для функции ЗначениеРазрешено);
— КАК Ложь/Истина (например, Справочник.Проекты КАК Истина).

Также существуют следующие функции:

  • ЧтениеОбъектаРазрешено
  • ЧтениеСпискаРазрешено
  • ИзменениеОбъектаРазрешено
  • ИзменениеСпискаРазрешено

Синтаксис этих функций аналогичен функции ЗначениеРазрешено().

Эти функции необходимо использовать, когда необходимо установить доступность (чтение/изменение) объекта в зависимости от доступности его реквизита. Например, документ _ДемоСчетНаОплатуПокупателю должен быть доступен, когда доступен его реквизит Организация. В таком случае ограничение будет описано как:

Процедура ПриЗаполненииОграниченияДоступа(Ограничение) Экспорт Ограничение.Текст = "РазрешитьЧтениеИзменение |ГДЕ | ЧтениеОбъектаРазрешено(Организация)"; КонецПроцедуры 

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

Функция выполняет проверку в строках с помощью логического «ИЛИ». Используется для выполнения условия хотя бы в одной строке табличной части объекта.

Примеры возможных ограничений

Организация и контрагент в шапке документа:

Ограничение.Текст = "РазрешитьЧтениеИзменение |ГДЕ | ЗначениеРазрешено(Организация) |И ЗначениеРазрешено(Контрагент)"; 

Организация в шапке документа, контрагент в табличной части, достаточно одного разрешенного контрагента:

Ограничение.Текст = "РазрешитьЧтениеИзменение |ГДЕ | ЗначениеРазрешено(Организация) |И ЗначениеРазрешено(Поставщики.Контрагент)"; 

Организация в шапке документа, контрагент в табличной части, достаточно одного разрешенного контрагента (если табличная часть пустая, тогда доступ по контрагенту разрешен):

Ограничение.Текст = "РазрешитьЧтениеИзменение |ГДЕ | ЗначениеРазрешено(Организация) |И ЗначениеРазрешено(Поставщики.Контрагент, Null КАК Истина)"; 

Организация в шапке документа, контрагент в табличной части, и требуется, чтобы все контрагенты были разрешены (если табличная часть пустая, тогда доступ по контрагенту запрещен):

Ограничение.Текст = "РазрешитьЧтениеИзменение |ГДЕ | ЗначениеРазрешено(Организация) |И ДляВсехСтрок(ЗначениеРазрешено(Поставщики.Контрагент))"; 

Организация и контрагент в табличной части, при этом достаточно, чтобы любая из пар организации с контрагентом была разрешена:

Ограничение.Текст = "РазрешитьЧтениеИзменение |ГДЕ | ЗначениеРазрешено(Поставщики.Организация) |И ЗначениеРазрешено(Поставщики.Контрагент)"; 

Организация и контрагент в табличной части, при этом требуется, чтобы все пары организации с контрагентом были разрешены:

Ограничение.Текст = "РазрешитьЧтениеИзменение |ГДЕ | ДляВсехСтрок( | ЗначениеРазрешено(Поставщики.Организация) | И ЗначениеРазрешено(Поставщики.Контрагент))"; 

Организация и контрагент в табличной части, при этом требуется, чтобы одна из организаций и один из контрагентов были разрешены:

Ограничение.Текст = "РазрешитьЧтениеИзменение |ГДЕ | ДляОднойИзСтрок(ЗначениеРазрешено(Поставщики.Организация)) |И ДляОднойИзСтрок(ЗначениеРазрешено(Поставщики.Контрагент))"; 

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

Ограничение.Текст = "РазрешитьЧтениеИзменение |ГДЕ | ЗначениеРазрешено(Отправитель ТОЛЬКО Справочник.Склады)"; 

Отличительная особенность производительного режима RLS в 1С

Вернёмся к основной отличительной особенности производительного режима RLS в 1С. Она заключается в том, что в этом режиме расчет прав происходит предварительно и записывается в специальные таблицы (справочник и регистры сведений). Это позволяет достичь высокой производительности запросов с RLS, так как добавляет простой и статический фрагмент к текстам запросов в ролях. За счет этого обеспечивается одинаково хорошая скорость работы при различной прикладной логике ограничений доступа, при различных условиях и их комбинациях. Но, так как предварительный расчет прав доступа занимает некоторое время, поэтому изменения в правах вступают в силу с некоторой задержкой.

Для хранения этих предварительно рассчитанных данных (ключей) используются следующие таблицы:

  • справочник КлючиДоступа
  • регистр сведений КлючиДоступаКОбъектам
  • регистр сведений КлючиДоступаПользователей

Справочник КлючиДоступа имеет структуру:

Производительный режим RLS в 1С

В реквизитах Значение1 — Значение5 хранятся комбинации конкретных значений доступа. В зависимости от ограничений каждого конкретного типа объектов конфигурации состав значений разный. Например, как упоминалось выше, для документа _ДемоСчетНаОплатуПокупателю определено ограничение по Организации и Партнеру. Соответственно, будут сформированы ключи с возможными комбинациями организации и партнера.

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

Структура регистров следующая:

Производительный режим RLS в 1С

Причем Объект РС КлючиДоступаКОбъектам имеет тип ОпределяемыйТип.ВладелецЗначенийКлючейДоступа, которые содержит в себе ссылки на все объекты, которые могут быть ограничены с помощью RLS.

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

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

Производительный режим RLS в 1С

Обновление ключей объектов и ключей доступа к ним выполняются регламентным заданием. А также оно может быть запущено из обработки “Обновление доступа на уровне записей”:

Производительный режим RLS в 1С

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

Запуск обработки выполняется по кнопке

Производительный режим RLS в 1С

Можно настроить обновление ключей по определенным объектам. Эта настройка выполняется по кнопке Ещё — Ручное управление… На этой форме можно выбрать конкретные справочники, документы или регистры, по которым необходимо обновить ключи, отметить их флажками, после этого запланировать обновление и запустить обработку:

Производительный режим RLS в 1С

Также есть возможность выводить более подробную информацию о ходе выполнения обработки

Производительный режим RLS в 1С

Для удобного написания и контроля текстов ограничений в комплекте поставки есть специальная обработка УправлениеДоступом:

Производительный режим RLS в 1С

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

Производительный режим RLS в 1С

После этого на форму загрузится текст ограничений из процедуры ПриЗаполненииОграниченияДоступа, а также шаблон ограничения в роли, а также кнопки для проверки текста вставки его в код:

Производительный режим RLS в 1С

При наличии ошибки в тексте ограничения и нажатии на кнопку “Проверить” появляется вкладка “(ошибки)”, в которой описаны ошибка как самого текста, так и всего внедрения механизма ограничений по записям для объекта:

Производительный режим RLS в 1С

Производительный режим RLS в 1С

Несколько конкретных примеров внедрения

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

— создать новый документ ТестовыйДокументСОграничениями

Производительный режим RLS в 1С

— добавить объект в определяемые типы ВладелецЗначенийКлючейДоступа и ВладелецЗначенийКлючейДоступаДокумент.

Примечание. В определяемый тип ВладелецЗначенийКлючейДоступаДокумент добавляются документы. Справочники нужно добавить в ВладелецЗначенийКлючейДоступаОбъект, регистры сведений — в ВладелецЗначенийКлючейДоступаНаборЗаписей, регистры расчета — в ВладелецЗначенийКлючейДоступаНаборЗаписейРегистраРасчета.

— в процедуру ПриЗаполненииСписковСОграничениемДоступа общего модуля УправлениеДоступомПереопределяемый вставить текст

Списки.Вставить(Метаданные.Документы.ТестовыйДокументСОграничениями, Истина); Процедура ПриЗаполненииСписковСОграничениемДоступа(Списки) Экспорт … Списки.Вставить(Метаданные.Документы.ТестовыйДокументСОграничениями, Истина); КонецПроцедуры 

— на форме документа в обработчики ПриЧтенииНаСервере и ПослеЗаписиНаСервере добавить следующий код:

&НаСервере Процедура ПриЧтенииНаСервере(ТекущийОбъект) // СтандартныеПодсистемы.УправлениеДоступом Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда МодульУправлениеДоступом = ОбщегоНазначения.ОбщийМодуль("УправлениеДоступом"); МодульУправлениеДоступом.ПриЧтенииНаСервере(ЭтотОбъект, ТекущийОбъект); КонецЕсли; // Конец СтандартныеПодсистемы.УправлениеДоступом КонецПроцедуры &НаСервере Процедура ПослеЗаписиНаСервере(ТекущийОбъект, ПараметрыЗаписи) // СтандартныеПодсистемы.УправлениеДоступом УправлениеДоступом.ПослеЗаписиНаСервере(ЭтотОбъект, ТекущийОбъект, ПараметрыЗаписи); // Конец СтандартныеПодсистемы.УправлениеДоступом КонецПроцедуры 

— создать новые роли для чтения и добавления/изменения нового документа: ЧтениеТестовыхДокументовСОграничениями и ДобавлениеИзменениеТестовыхДокументовСОграничениями. Для них определить соответствующие права (чтение, добавление, изменение), скопировать шаблон ограничений ДляОбъекта() из роли ИзменениеУчастниковГруппДоступа и прописать код ограничения доступа для необходимых прав:

#Если &ОграничениеДоступаНаУровнеЗаписейУниверсально #Тогда #ДляОбъекта("") #Иначе ИСТИНА #КонецЕсли 

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

Производительный режим RLS в 1С

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

— в модуле менеджера документа в процедуре ПриЗаполненииОграниченияДоступа прописать текст ограничения:

Процедура ПриЗаполненииОграниченияДоступа(Ограничение) Экспорт Ограничение.Текст = "РазрешитьЧтениеИзменение |ГДЕ | ЗначениеРазрешено(Организация) | И ЗначениеРазрешено(Подразделение)"; КонецПроцедуры 

— в пользовательском режиме создать профили доступа с созданными ранее ролями, группы доступа и прописать в них ограничения по организациям и подразделениям и назначить их пользователям:

Производительный режим RLS в 1С Производительный режим RLS в 1СПроизводительный режим RLS в 1С

— создать документы и запустить задание обновления ключей доступа.

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

под полными правами

Производительный режим RLS в 1С

под ограниченными правами

Производительный режим RLS в 1С

  • Нужно реализовать ограничение, чтобы были доступны только те документы, в которых доступны организация и было доступно хотя бы одно место хранения из ТЧ Запасы.

— в модуле менеджера документа в процедуре ПриЗаполненииОграниченияДоступа прописать текст ограничения:

Процедура ПриЗаполненииОграниченияДоступа(Ограничение) Экспорт Ограничение.Текст = "РазрешитьЧтениеИзменение |ГДЕ | ЗначениеРазрешено(Организация) | И ДляОднойИзСтрок(ЗначениеРазрешено(Запасы.МестоХранения))"; КонецПроцедуры 

— добавить вид ограничения в профиль доступа, прописать в группе доступа ограничения по местам хранения, обновить ключи:

Производительный режим RLS в 1СПроизводительный режим RLS в 1С

В результате под пользователем с ограниченными правами увидим только те документы, у которых доступна организация и в ТЧ Запасы хотя бы в одной строке указан Розничный склад:

Производительный режим RLS в 1С Производительный режим RLS в 1С Производительный режим RLS в 1СПроизводительный режим RLS в 1С

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

— создать новый справочник ТестовыйРегион. Выполнить для него все те же операции, что и для самого документа ТестовыйДокументСОграничениями (роли можно создать новые или прописать в какие-то существующие, например для чтения/изменения документа. В данном примере это не принципиально. В ПриЗаполненииОграниченияДоступа прописать ограничение на само себя: ЗначениеРазрешено(Ссылка)).

— добавить ссылку и объект ТестовыйРегион в определяемые типы соотстветственно ЗначениеДоступа и ЗначениеДоступаОбъект

— в процедуру ПриЗаполненииВидовДоступа общего модуля УправлениеДоступомПереопределяемый вставить текст:

Процедура ПриЗаполненииСписковСОграничениемДоступа(Списки) Экспорт … ВидДоступа = ВидыДоступа.Добавить(); ВидДоступа.Имя = "ТестовыйРегион"; ВидДоступа.Представление = НСтр("ru = 'Тестовый регион'"); ВидДоступа.ТипЗначений = Тип("СправочникСсылка.ТестовыйРегион"); КонецПроцедуры 

— запустить обработку ОбновлениеВспомогательныхДанных (из Инструментов разработчика) и обновить всё.

— добавить новый вид доступа в профиль доступа и определить конкретные ограничения в группе доступа:

Производительный режим RLS в 1СПроизводительный режим RLS в 1С

— добавить реквизит в документ, вывести на форму, заполнить (скриншот от пользователя с полными правами):

Производительный режим RLS в 1С

— изменить текст ограничения в процедуре ПриЗаполненииОграниченияДоступа документа ТестовыйДокументСОграничениями, чтобы он учитывал новый реквизит:

Процедура ПриЗаполненииОграниченияДоступа(Ограничение) Экспорт Ограничение.Текст = "РазрешитьЧтениеИзменение |ГДЕ | ЗначениеРазрешено(Организация) | И ЗначениеРазрешено(ТестовыйРегион)"; КонецПроцедуры 

— обновить ключи доступа.

В результате на пользователя с ограниченными правами распространяются ограничения по организациям (ООО Тестовая организация и Новые технологии ООО) и регионам (Центральный и Южный) и он получит такой список документов:

Ограничение прав на уровне записи 1С RLS

Анна Викулина

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

Что такое RLS?

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

Чтобы получить возможность писать запросы для ограничений по RLS, необходимо создать роль или взять уже имеющуюся. Настройка RLS в 1С 8.3 может применяться для следующих действий пользователя:

  • Добавление;
  • Чтение;
  • Удаление;
  • Изменение.

Кроме широчайших возможностей настройки доступа, RLS несут в себе и недостатки:

  1. Требования к квалификации разработчика, так как писать запрос придется на встроенном языке с учетом правил синтаксиса;
  2. Отсутствие возможности быстрой отладки условия;
  3. Ограниченные возможности по описанию логики: слишком сложные условия придется все-таки писать в модулях документов и справочников;
  4. В клиент-серверном варианте баз возможно неявный рост таблиц, включенных в запрос. Причем отследить этот процесс очень сложно;
  5. Требования к ресурсам. Ограничения по RLS потребляют немало мощности клиентской машины и сервера;
  6. Малочисленная документация в свободном доступе.

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

Создаем ограничение RLS

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

Добавить ограничение по RLS

Открывшееся окно содержит 2 вкладки: «Права» и «Шаблоны ограничений». Чтобы наложить определенные ограничения на конкретное действие, необходимо выделить его и в правой нижней части нажать на зеленый плюс. Появиться строчка, в которой мы сможем задать ограничения 1С RLS на встроенном в 1С языке.

Наложить определенные ограничения на конкретное действие

Если вы знаете синтаксис 1С (как свои пять пальцев), то можете писать прямо в поле «Ограничение доступа». Разработчики 1С предусмотрели возможность открывать конструктор запроса, который поможет и подскажет, на что можно сделать ограничение. Чтобы его открыть, нужно нажать на кнопку с тремя точками (Выбрать) или F4 и появиться окно с кнопкой «Конструктор запроса…».

Конструктор запроса

В появившемся окне вы сможете настроить ограничения не только по данному справочнику, но и по другим объектам системы. Для этого необходимо добавить их на вкладке «Таблицы и поля». Прописываем ограничения на поля справочника «Номенклатура» и нажимаем на «ОК». Внимательно относитесь к названию переменных: параметры RLS задаются при старте сессии пользователя и должны содержаться в объекте метаданных.

Прописываем ограничения на поля справочника

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

На вкладке «Шаблоны ограничений» задаются запросы, которые необходимы при копировании одинаковых настроек RLS в 1С 8.3. После того как вы добавили свой шаблон, по его имени можете обращаться в настройках прав доступа.

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

Ограничения на несколько ролей

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

Блог компании «СИТЕК»

Ограничение доступа пользователям к организациям, подразделениям, складам (RLS)

Александрова Анна Специалист отдела сопровождения 1С

В УПП можно ограничить доступ пользователей к работе с определенными справочниками и даже документами по определенной организации. Для такой настройки используется механизм ограничения доступа на уровне записей, который также известен под названием RLS (Row Level Security). Данный механизм не заменяет настройку ролей и прав пользователей, он является ее дополнением.

Рассмотрим подробнее настройку в RLS в 1С УПП.

Настройку прав доступа на уровне записей нужно делать под пользователем с ролью «Полные права» или «Администрирование пользователей» (другими словами, под администратором). По кнопке «Переключить интерфейс» выбираем из списка «Администрирование пользователей» (рис. 1).

Интерфейс Администрирование

Через раздел «Доступ на уровне записей» переходим в подраздел «Параметры доступа на уровне записей», где видим 13 справочников, по которым можно выполнить эту настройку. Разберем на примере, как ограничить доступ в 1С к документам по определенной организации. Ставим галочки напротив справочника «Организации». Этим действием мы включаем использование RLS. В нижней части таблицы есть надпись-напоминание «Настройка доступа выполняется для групп пользователей» (рис. 2).

RLS

Создаём группу пользователей (интерфейс «Администрирование пользователей», раздел «Пользователи», подраздел «Группа пользователей»). Справа находится колонка Состав группы, в ней пользователи, входящие в эту группу (в нашем примере Ефимова В. В.). Слева — колонка «Ограничение доступа» (таблица ограничений доступа). При настройке RLS мы отметили 2 справочника (Контрагенты, Организации), эти справочники попали в колонку «Ограничение доступа». Для пользователя Ефимовой необходимо ограничить доступ по организациям. Для этого галочкой отмечаем вид объекта доступа «Организации» и записываем данные по кнопке «Записать». По кнопке «Настройка доступа» переходим в обработку «Настройка прав доступа» (рис. 3).

Обработка Настройка прав доступа

В колонке «Объект доступа» указываем организацию, доступ к которой пользователю разрешен (Торговый Дом Комплексный). Галочка «Чтение» позволяет пользователю видеть и выбирать элемент справочника, а галочка «Запись» позволяет вносить изменения. Заполняем обработку как на рис. 4 и сохраняем.

RLS

Заходим в программу под пользователем Ефимова (кассир) и проверяем, что пользователю доступен просмотр и изменение только для организации Торговый дом «Комплексный» (рис. 5).

Просмотр под пользователем с ограниченными правами

Для сравнения заходим в программу под администратором с полными правами и видим весь список организаций (ограничение доступа на уровне записей не распространяется на пользователей с ролью Полные права) (рис. 6).

Просмотр организаций под полными правами

При использовании механизма RLS не следует упускать одну особенность программы: если мы зайдем в программу под пользователем, который не относится ни к одной группе, и попробуем открыть тот же справочник Контрагенты, то увидим служебное сообщение «У пользователя недостаточно прав на исполнение операции над базой данных» (рис. 7).

Ошибка доступа

Поэтому необходимо остальных пользователей (за исключением обладателей полных прав) включить в группу с настройками как на рис. 8.

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

Также как всегда обратим внимание — включение RLS замедляет работу программы 1С (более долго проводятся документы, открываются справочники), поэтому всегда нужно осознанно принимать решение, действительно ли нужна данная настройка. Степень «замедления» индивидуальна для каждой базы клиента, для кого-то может измеряться в миллисекундах, а для кого-то и в нескольких секундах.

Если Вы хотите осуществить полную настройку прав пользователей, Вы можете передать данную задачу специалистам компании СИТЕК. Мы поможем сформировать Вам политику безопасности в 1С. Отправьте заявку по эл. адресу order@sitec-it.ru или просто оставьте заявку на сайте, и наши специалисты с Вами свяжутся.

Компания «СИТЕК» оформит 1С:ИТС за один день в любом регионе РФ

Автор статьи: Специалист отдела сопровождения Александрова Анна. Дата обновления статьи с 24.01.2017

Подпишитесь на нашу рассылку
и получите еще больше статей от экспертов по 1С!

Добавить комментарий

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