![]() |
![]() |
![]() |
|
помогите разобраться с RLS | ☑ | ||
---|---|---|---|---|
0
nop
06.06.08
✎
16:10
|
Пользователю могут принадлежать несколько ролей?
|
|||
1
Terv
06.06.08
✎
16:11
|
да
|
|||
2
nop
06.06.08
✎
16:13
|
Органичение доступа к полям. Есть реквизит документ. Некоторые пользователи могут ставить не все возможные значения реквизита (тип перечисление). При определенных значениях - вообще не могут менять документ.
Для того что бы определить кто что может при значениях этого реквизита следует записать эту инфу в РС? |
|||
3
IronDemon
06.06.08
✎
16:16
|
Ограничения на изменений полей в RLS нет
|
|||
4
nop
06.06.08
✎
16:26
|
(3) на чтение только?
|
|||
5
sergeante
06.06.08
✎
16:27
|
ага
|
|||
6
nop
06.06.08
✎
16:28
|
(5) ужас. Как это работает в запросе - ясно. А просто открыв документ, и не имея права на реквизит - что будет?
|
|||
7
agarych
06.06.08
✎
16:30
|
будет пусто...
|
|||
8
nop
06.06.08
✎
16:31
|
(7) круть. Но задача не решена. Щас сформулирую
|
|||
9
nop
06.06.08
✎
16:33
|
У документа есть реквизит Состояние. В зависимости от его значения пользователь может сделать определенные конкретно пользователю действия с документом (перевести его в другое Состояние), или не имеет права изменять документ вообще.
Как такое сделать правильно? |
|||
10
IronDemon
06.06.08
✎
16:36
|
Для изменения состояния код написать. Для "неизменения" можно и RLS и код.
|
|||
11
nop
06.06.08
✎
16:37
|
щас покажу что наваял на данный момент. Сомневаюсь в правельности подхода
|
|||
12
sergeante
06.06.08
✎
16:38
|
Процедура ПередОткрытием() в модуле формы документа
Если НЕ ЭтоНовый() И Состояние=ТвоёСостояние Тогда ТолькоПросмотр = Истина; КонецЕсли; |
|||
13
nop
06.06.08
✎
16:39
|
///Модуль формы документа
Перем ТекущееКоличествоВыделенныхСтрок; Процедура ПриОткрытии() ТекущееКоличествоВыделенныхСтрок = 0; ПодключитьобработчикОжидания("ОбработкаОжидания",0.1,Истина); КонецПроцедуры Процедура ОбработкаОжидания() ПодключитьобработчикОжидания("ОбработкаОжидания",0.1,Истина); ВыделенныеСтрокиКоличество = ЭлементыФормы.ДокументСписок.ВыделенныеСтроки.Количество(); Если ВыделенныеСтрокиКоличество <> ТекущееКоличествоВыделенныхСтрок Тогда ТекущееКоличествоВыделенныхСтрок = ВыделенныеСтрокиКоличество; ОпределитьДействиеСЗаявкой(); КонецЕсли; КонецПроцедуры Процедура ОпределитьДействиеСЗаявкой() Запрос = Новый Запрос; сз = Новый СписокЗначений; Для каждого ВыделеннаяСтрока Из ЭтаФорма.ЭлементыФормы.ДокументСписок.ВыделенныеСтроки Цикл сз.Добавить(ВыделеннаяСтрока.Ссылка); КонецЦикла; Запрос.Текст = "ВЫБРАТЬ РАЗЛИЧНЫЕ Состояние ИЗ Документ.ЗаявкаНаОплату КАК Состояние ГДЕ ССЫЛКА В (&сз)"; Запрос.УстановитьПараметр("сз", сз); сз = Запрос.Выполнить().Выгрузить(); СД = Неопределено; Если сз.Количество() = 1 Тогда СД = сз.Получить(0).Состояние; КонецЕсли; сз = ПолучитьВозможныеДействияПоСостояниюЗаявки(СД); Для каждого эл из сз Цикл эл.Представление = эл.Значение; эл.Значение = Новый Действие(эл.Значение); КонецЦикла; ОформитьКнопкуДействийСЗаявками(сз, ЭлементыФормы.ДействиеСЗаявками) КонецПроцедуры Процедура Подписать(Кнопка) КонецПроцедуры Процедура Отклонить(Кнопка) КонецПроцедуры Процедура ДокументСписокПриАктивизацииСтроки(Элемент) ОпределитьДействиеСЗаявкой(); КонецПроцедуры Процедура ДокументСписокПриПолученииДанных(Элемент, ОформленияСтрок) ОпределитьДействиеСЗаявкой(); КонецПроцедуры /// Процедура ПриНачалеРаботыСистемы() ЗадатьВозможныеДействияПользователяСЗаявкой(); КонецПроцедуры /// Функция ЗадатьВозможныеДействияПользователяСЗаявкой() экспорт тз = Новый ТаблицаЗначений; тз.Колонки.Добавить("Состояние"); тз.Колонки.Добавить("Действия", Новый ОписаниеТипов("СписокЗначений")); стр = тз.Добавить(); стр.Состояние = Перечисления.СостоянияЗаявок.Создана; стр.Действия.Добавить("ПроверитьЗаявку"); стр = тз.Добавить(); стр.Состояние = Перечисления.СостоянияЗаявок.Проверена; стр.Действия.Добавить("ПодатьНаПодпись"); стр = тз.Добавить(); стр.Состояние = Перечисления.СостоянияЗаявок.ПоданаНаПодпись; стр.Действия.Добавить("Подписать"); стр.Действия.Добавить("Отклонить"); стр = тз.Добавить(); стр.Состояние = Перечисления.СостоянияЗаявок.Подписана; стр.Действия.Добавить("ОтправитьНаОплату"); стр = тз.Добавить(); стр.Состояние = Перечисления.СостоянияЗаявок.Отколонена; стр = тз.Добавить(); стр.Состояние = Перечисления.СостоянияЗаявок.ОтправленаНаОплату; стр = тз.Добавить(); стр.Состояние = Перечисления.СостоянияЗаявок.ОплатаПодтверждена; стр = тз.Добавить(); стр.Состояние = Перечисления.СостоянияЗаявок.Закрыта; ПараметрыСеанса.ДействияСЗаявками = Новый ХранилищеЗначения(тз); КонецФункции //// Функция ПолучитьВозможныеДействияПоСостояниюЗаявки(СД) Экспорт тз = ПараметрыСеанса.ДействияСЗаявками.Получить(); рез = тз.Найти(СД, "Состояние"); Если рез = Неопределено Тогда рез = Новый СписокЗначений; Иначе рез = рез.Действия; КонецЕсли; Возврат рез; КонецФункции |
|||
14
nop
06.06.08
✎
16:43
|
Много букв?
|
|||
15
Sandriko
06.06.08
✎
16:51
|
(3) ты не прав, на RLS можно написать запрос на ограничение изменения полей
|
|||
16
nop
06.06.08
✎
16:51
|
(15) можно пример?
|
|||
17
nop
06.06.08
✎
16:51
|
это Архиважно
|
|||
18
Sandriko
06.06.08
✎
16:53
|
дело в том что RLS работает с объектами а не ссылками. Т.е ты можешь написать условие выбор когда номенклатура.код <> номенклатура.ссылка.код тогда ложь конец
|
|||
19
agarych
06.06.08
✎
16:55
|
(15) Да ладно! в 8.0 по-моему нельзя так сделать как хочет автор.
если только в 81 |
|||
20
Sandriko
06.06.08
✎
16:55
|
я такое писал в 8.0
|
|||
21
agarych
06.06.08
✎
16:55
|
(14) букв конечно много... )
|
|||
22
sergeante
06.06.08
✎
16:55
|
(15) да ладно?!
|
|||
23
nop
06.06.08
✎
16:56
|
ок. Но как это связанно с (15) ?
|
|||
24
Sandriko
06.06.08
✎
16:57
|
Еще раз говорю, RLS работает с объектами. В базе же хранятся ссылки.
Т.е. Объект[имяреквизита] <> Объект.ссылка[имяреквизита] |
|||
25
Варвар
06.06.08
✎
16:58
|
Как вариант Состояние сделать регистром сведений. И в RLS его проверять. Это только идея. Сам такое в 8-ке не делал.
|
|||
26
nop
06.06.08
✎
17:02
|
(25) думал. Но это не удобно для отборов в форме списка этого документа.
|
|||
27
nop
06.06.08
✎
17:03
|
(24) разве тип Объект[имяреквизита] <> ССылка ?
|
|||
28
nop
06.06.08
✎
17:13
|
Может я не верно поставил вопрос, но имхо можно запретить изменение документа, если реквизит = бла-бла
|
|||
29
Sandriko
06.06.08
✎
17:15
|
(27) попробуй на какую то роль. в справочник номенклатуры в РЛС пропиши такой код:
Таблица ИЗ Справочник.номенклатура КАК Таблица ГДЕ Таблица.Наименование = Таблица.Ссылка.Наименование зайди под пользователем с этой ролью и попробуй поменять наименование номенклатуры |
|||
30
nop
06.06.08
✎
17:16
|
(29) ок. попробую
|
|||
31
Sandriko
06.06.08
✎
17:16
|
тогда как (25) + рлс
|
|||
32
Sandriko
06.06.08
✎
17:16
|
(31) к (28)
|
|||
33
nop
06.06.08
✎
17:29
|
(29) это во вкладке "Таблицы и поля" делать?
|
|||
34
Sandriko
06.06.08
✎
17:34
|
в (29) я по-моему ошибся, но это я сам счас лично проверил.
Таблица ИЗ Справочник.проекты КАК Таблица полное соединение Справочник.Проекты Как Справпроекты По Таблица.ссылка = СправПроекты.ссылка ГДЕ Справпроекты.Наименование = Таблица.Наименование (33) там внизу есть кнопочка "запрос" просто вставь этот текст |
|||
35
nop
06.06.08
✎
17:47
|
попробовал. Вставил в "изменение". Не вижу никакого эффекта. Документ отредактировался.
Таблица ИЗ Документ.ЗаявкаНаОплату КАК Таблица ПОЛНОЕ СОЕДИНЕНИЕ Документ.ЗаявкаНаОплату КАК Справпроекты ПО Таблица.Ссылка = Справпроекты.Ссылка ГДЕ Справпроекты.Состояние = Таблица.Состояние |
|||
36
Sandriko
06.06.08
✎
17:49
|
(35) ты зашел пользователем с у которого только одна роль?
|
|||
37
nop
06.06.08
✎
17:49
|
(36) да, только та которой запрос написал
|
|||
38
Sandriko
06.06.08
✎
17:50
|
Если у пользователя несколько ролей, то проверяються права на все роли, что затормаживает работу во-первых, а во-вторых если хоть одна роль дает право на что-то, то это право будет.
|
|||
39
nop
06.06.08
✎
17:52
|
(38) понял, спасибо. Но роль только одна
|
|||
40
nop
06.06.08
✎
17:53
|
погоди, что то получилось
|
|||
41
nop
06.06.08
✎
17:55
|
Работает. Ты прав! :) Реквизит Состояние - не могу изменить, а другие могу :))
Це успіх! :)) |
|||
42
Sandriko
06.06.08
✎
17:56
|
а если тебе надо с какими-то конкретными значениями то через дополнительный регистр делай. Соединением.
|
|||
43
nop
06.06.08
✎
17:57
|
(42) а этот запрос RLS нельзя менять динамичекси?
|
|||
44
Sandriko
06.06.08
✎
18:19
|
если ты имеешь ввиду что сегодня тебе надо ограничение на одни реквизиты а завтра на другие то можно придумать. Но в любом случае с дополнительным регистром сведений.
|
|||
45
nop
06.06.08
✎
18:21
|
(44) без ошибок не бывает. Желательно не выгонять всех из-за ошибки РЛС.
В регистр моно всунуть текст запроса? |
|||
46
AndreYAN
06.06.08
✎
18:27
|
(45) добавить то можно, но вот он не выполнится
|
|||
47
nop
06.06.08
✎
18:29
|
(46) короче само условие или текст запроса динамически не изменть, только значение параметра условия?
|
|||
48
AndreYAN
06.06.08
✎
18:30
|
(47) да
|
|||
49
Sandriko
06.06.08
✎
18:49
|
ты можешь просто написать условия для всех реквизитов.
Таблица ИЗ Документ.ЗаявкаНаОплату КАК Таблица ПОЛНОЕ СОЕДИНЕНИЕ Документ.ЗаявкаНаОплату КАК Справпроекты ПО Таблица.Ссылка = Справпроекты.Ссылка Левое Соединение РегистрСведений.РеквизитыДоступа Как РеквДост По РеквДост.Объект = "Документ.ЗаявкаНаОплату" ГДЕ Справпроекты.Состояние = Таблица.Состояние И Выбор Когда РеквДост.наимРеквизита = Наименование Тогда Выбор Когда РеквДост.запрет = истина тогда Справпроекты.Наименование = Таблица.Наименование КонецКонец |
|||
50
Sandriko
06.06.08
✎
18:52
|
и т.д. Только создай Регистр с измерениями : Объект - ТИп(строка) для хранения названия типа документа,РеквизитыДоступа ... запрет булево, который собственно и будет запрещать или разрешать данный реквизит
|
|||
51
nop
06.06.08
✎
18:55
|
(49) и игратся с условиями (значениями).
Тогда лучше писать реквизиты из метаданных в регист,- меньше гемора при изменении конфы. |
|||
52
nop
06.06.08
✎
18:58
|
може продолжим в Пн. Пока. Спасибо
|
|||
53
Asdam
01.08.08
✎
10:38
|
(24) Подскажи, плиз, как сделать ограничение на изменение реквизита (тип булево) в незаписанном документе. Т.е. мне надо если НекийРеквизит = Истина, разрешить записать, провести, если НекийРеквизит = Ложь - запретить.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |