Имя: Пароль:
1C
 
помогите разобраться с 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) Подскажи, плиз, как сделать ограничение на изменение реквизита (тип булево) в незаписанном документе. Т.е. мне надо если НекийРеквизит = Истина, разрешить записать, провести, если НекийРеквизит = Ложь - запретить.