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


Пример ограничения прав пользователя для работы с объектами одного определенного филиала. Писался для 8.1, но справедлив и для 8.2.

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

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

 

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

 

/

/--------------------------------------------------------------------------------

ВЫБРАТЬ

Выразить(НастройкиПользователей.Значение как Справочник.Организации) как Организация

ИЗ

РегистрСведений.НастройкиПользователей КАК НастройкиПользователей

ГДЕ

НастройкиПользователей.Пользователь = &ТекущийПользователь

И НастройкиПользователей.Настройка = Значение(ПланВидовХарактеристик.НастройкиПользователей.ОсновнаяОрганизация)

//--------------------------------------------------------------------------------

Для ограничения доступа в ролях имеются специальные механизмы (Рисунок 1,2):

  • Ограничения доступа к данным;
  • Шаблон ограничений.

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

Шаблон позволяет использовать однотипные запросы в разных объектах. К примеру, в нашем случае мы должны будем ограничить как доступ к бухгалтерскому регистру, так и к документу ОперацияБух. Что бы не писать два раза один и тот же запрос, создадим шаблон с названием «ОрагнизацияПользователя» и укажем его (при помощи символа #) в нужных строках ограничения пользователя.

 

Текст запроса в шаблоне имеет вид:

 

/

/--------------------------------------------------------------------------

ТекущаяТаблица ИЗ #ТекущаяТаблица КАК ТекущаяТаблица

ГДЕ

(ТекущаяТаблица.Организация В

(

ВЫБРАТЬ

Выразить(НастройкиПользователей.Значение как Справочник.Организации) как Организация

ИЗ

РегистрСведений.НастройкиПользователей КАК НастройкиПользователей

ГДЕ

НастройкиПользователей.Пользователь = &ТекущийПользователь

И НастройкиПользователей.Настройка = Значение(ПланВидовХарактеристик.НастройкиПользователей.ОсновнаяОрганизация)

)

)

//--------------------------------------------------------------------------

 

 

В  тексте шаблона значение #ТекущаяТаблица является служебным значением, и обозначает саму таблицу, права пользователя к которой описывается.

 

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

 

#ОрганизацияПользователя(«Филиал»)

 

А текст шаблона

 

//--------------------------------------------------------------------------

ТекущаяТаблица ИЗ #ТекущаяТаблица КАК ТекущаяТаблица

ГДЕ

(ТекущаяТаблица.#Параметр(1) В

(

ВЫБРАТЬ

Выразить(НастройкиПользователей.Значение как Справочник.Организации) как Организация

ИЗ

РегистрСведений.НастройкиПользователей КАК НастройкиПользователей

ГДЕ

НастройкиПользователей.Пользователь = &ТекущийПользователь

И НастройкиПользователей.Настройка = Значение(ПланВидовХарактеристик.НастройкиПользователей.ОсновнаяОрганизация)

)

)

//--------------------------------------------------------------------------

 

 Подробнее об ограничении прав написано в «1С:Предприятие 8.1. Конфигурирование и Администрирование» Часть 1 (стр. 79).

РS. Решил написать, поскольку часто попадаются вопросы по этой теме (если не нужно — уберу). Во вложении файл Word с всем тем же самым что и тут написано (может просто кому-то удобнее файл скачать).

12 Comments

  1. Armando
    Выразить(НастройкиПользователей.Значение как Справочник.Организации) как Организация

    Зачем «Выразить»? Это провоцирует лишнее соединение со справочником.

    Reply
  2. Ягг

    (1) Armando, может ошибаюсь но не думаю что вызывает лишнее соединение со справочником. Мне кажется наоборот отсекает все потенциально «неправильные» соединения сразу (сервер даже не пытается построить левое соединения с остальными таблицами). Кроме того получаем результат гарантированного типа.

    Я думаю что подобная «конструкция» как бы накладывает дополнительное ограничение к полю (при запросе к БД ставится еще и проверка по полю отвечающий за тип). Но, возможно ошибаюсь. И согласен, что поскольку у нас идет запрос по конкретному показателю использование «Выразить» не принципиально.

    Поправте если неправ.

    Эта памятка писалась достаточно давно 🙂

    PS. Впрочем, тут нет обращения через «.» к реквизитам поля «Значение», поэтому левое соединение с дополнительными таблицами строится не будет. Так что от того что «Выразить» — не тепло ни холодно. А вот если бы было обращение через «.» тогда точно надо. Видимо раньше я какой-то параметр брал — вот и осталось.

    Вывод: ВЫРАЗИТЬ можно убрать (а можно и оставить, хуже не будет 🙂 )

    Reply
  3. Armando

    (2) Да, точно. Соединения не будет, т.к. нет «точки».

    Reply
  4. Yashazz

    RLS?

    Reply
  5. Ягг

    (4) Yashazz, да

    Reply
  6. mrd_84

    Спасибо за иноформацмю! Пригодится.

    Reply
  7. Ignat_n

    Отличная статья, все подробно описано.

    Reply
  8. Sjawa2004

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

    Reply
  9. Ягг

    (9) Sjawa2004, если имеется в виду механизм встроенный в типовые конфигурации — то не все конфигурации «типовые» (иногда и делаются разработки с нуля). Кроме того, нужно же знать на чем они (типовые механизмы) построемы (в случае необходиммости их дорабатывать)

    Если имеется в виду механизм встроенный в платформу — то он и испольузется. Просто представлен пример (пояснение) как его можно использовать.

    Reply
  10. Sjawa2004

    Я полностью согласен, что не у всех типовые! Просто как показывает практика не все 1С-ки умеють настроить даже тот функционал который реализован в платформе! Не говоря уже о более глубокой детализации! При этом они считаются хорошими специалистами! P.S. последние три предложения — это о наболевшем!

    Reply
  11. YPermitin

    + за статью

    Когда-то писал статью по ограничениям доступа на уровне записей для самых начинающих. Может кому пригодиться:

    Reply

  • Yaga_2011

    Спасибо.

    Reply
  • Leave a Comment

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