gifts2017

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

Опубликовал Слава Кирлан (Ягг) в раздел Программирование - Практика программирования

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

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

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

 

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

 

/

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

ВЫБРАТЬ

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

ИЗ

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

ГДЕ

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

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

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

  

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

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

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

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

 

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

 

/

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

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

ГДЕ

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

                 (

                                ВЫБРАТЬ

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

ИЗ

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

ГДЕ

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

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

                  )

                 )

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

 

 

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

 

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

 

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

 

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

 

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

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

ГДЕ

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

                 (

                                ВЫБРАТЬ

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

ИЗ

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

ГДЕ

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

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

                  )

                 )

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

 

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

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

Скачать файлы

Наименование Файл Версия Размер
Статья как документ WORD 82
.docx 186,30Kb
04.06.12
82
.docx 186,30Kb Скачать

См. также

Подписаться Добавить вознаграждение

Комментарии

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

Зачем "Выразить"? Это провоцирует лишнее соединение со справочником.
2. Слава Кирлан (Ягг) 04.06.12 14:02
(1) Armando, может ошибаюсь но не думаю что вызывает лишнее соединение со справочником. Мне кажется наоборот отсекает все потенциально "неправильные" соединения сразу (сервер даже не пытается построить левое соединения с остальными таблицами). Кроме того получаем результат гарантированного типа.

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


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

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

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

Вывод: ВЫРАЗИТЬ можно убрать (а можно и оставить, хуже не будет :) )
3. Armando Armando (Armando) 04.06.12 15:40
(2) Да, точно. Соединения не будет, т.к. нет "точки".
ВадимЛитовченко; +1 Ответить
4. Яков Коган (Yashazz) 04.06.12 17:49
5. Слава Кирлан (Ягг) 05.06.12 08:59
(4) Yashazz, да
ВадимЛитовченко; +1 Ответить
6. Модератор раздела Артур Аюханов (artbear) 07.06.12 18:10
(1) Ты неправ - никаких соединений не будет.
ИМХО Эта инфа используется только на этапе разбора запроса в 1С, чтобы определить участвующие таблицы
7. mulyukov_rd (mrd_84) 31.10.12 01:07
Спасибо за иноформацмю! Пригодится.
ВадимЛитовченко; +1 Ответить
8. Надежда Игнатьева (Ignat_n) 19.01.13 20:58
Отличная статья, все подробно описано.
ВадимЛитовченко; +1 Ответить
9. Вячеслав Иванов (Sjawa2004) 28.05.13 11:20
А не проще использовать встроенный механизм прав доступа на уровне записей? Если только необходимо более детальное ограничение прав(больше чем просто по организациям, ценам и складам).
ВадимЛитовченко; +1 Ответить 1
10. Слава Кирлан (Ягг) 28.05.13 12:39
(9) Sjawa2004, если имеется в виду механизм встроенный в типовые конфигурации - то не все конфигурации "типовые" (иногда и делаются разработки с нуля). Кроме того, нужно же знать на чем они (типовые механизмы) построемы (в случае необходиммости их дорабатывать)

Если имеется в виду механизм встроенный в платформу - то он и испольузется. Просто представлен пример (пояснение) как его можно использовать.
11. Вячеслав Иванов (Sjawa2004) 28.05.13 13:41
Я полностью согласен, что не у всех типовые! Просто как показывает практика не все 1С-ки умеють настроить даже тот функционал который реализован в платформе! Не говоря уже о более глубокой детализации! При этом они считаются хорошими специалистами! P.S. последние три предложения - это о наболевшем!
12. Юрий Пермитин (YPermitin) 05.08.13 18:13
+ за статью

Когда-то писал статью по ограничениям доступа на уровне записей для самых начинающих. Может кому пригодиться:
"Простейший пример работы с RLS"
Зеленоград; ВадимЛитовченко; +2 Ответить
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа