Имя: Пароль:
1C
1С v8
Проверить права на документ по ссылке
,
0 bvb
 
28.12.12
14:38
Есть документ - на него права ОК

При проверке проведенности документа по ссылке из табличной части

Для каждого Стр Из  Ссылка.РасшифровкаПлатежа Цикл
Если  Стр.ДокументРасчетовСКонтрагентом.Проведен  Тогда    

возникает ошибка права доступа потому что по доступа на этот документ нет

Как программно проверить есть ли доступ к документу ссылке ?
1 Господин ПЖ
 
28.12.12
14:39
жестоким способом? .ПолучитьОбъект()
2 Reset
 
28.12.12
14:42
ПравоДоступа() - если RLS нет
Если есть то проверять условия, там указанные
3 Господин ПЖ
 
28.12.12
14:43
разрешаю проверять в привелигерованном модуле
4 bvb
 
28.12.12
14:44
(2) ПравоДоступа() смотрел .  Метод применим только к обхектам металанных
ПравоДоступа("Чтение", Стр.ДокументРасчетовСКонтрагентом.Метаданные()) возвращает ИСТИНА
5 Gesperid
 
28.12.12
14:44
ВЫБРАТЬ РАЗРЕШЕННЫЕ ... ГДЕ Ссылка В (&Ссыли)
6 Reset
 
28.12.12
15:01
(5) +1
Если пустой результат, значит нет доступа
7 Reset
 
28.12.12
15:03
(4) Я про это написал в (2). Если ПравоДоступа возвращает Истину, значит не пускает RLS
8 bvb
 
28.12.12
15:17
(7) Стыдно спрашивать, но можно пояснить что есть RLS ?
9 Reset
 
28.12.12
15:29
(8) Динамическая система прав доступа.
Может быть указана для прав на Чтение, Изменение,Удаление.
Описывается как "запрос" (правильнее, наверное, называть это часть запроса) в форме настройки роли
10 Reset
 
28.12.12
15:30
(9) +Добавление забыл.

Наиболее известный пример - ограничение доступа по Организации документа
11 bvb
 
28.12.12
15:32
В общем получилось так :

Функция ПраваДоступаНаДокумент  (Ссылка) Экспорт
   
    Запрос = Новый Запрос;
   
    Запрос.Текст =
    "ВЫБРАТЬ РАЗРЕШЕННЫЕ
    |    Документы.Ссылка,
    |  Документы.Дата,
    |  Документы.Номер,
    |  Документы.Проведен,
    |  Документы.ПометкаУдаления
    |
    |ИЗ
    |    Документ." + Ссылка.Метаданные().Имя + " КАК Документы
    |ГДЕ
    |    Документы.Ссылка = &Ссылка";
   
    Запрос.УстановитьПараметр("Ссылка", Ссылка);
   
    Выборка = Запрос.Выполнить().Выбрать();
   
    Если Выборка.Следующий() Тогда
        Возврат ИСТИНА
    Иначе
        Возврат ЛОЖЬ;
    КонецЕсли;
   
КонецФункции
12 Господин ПЖ
 
28.12.12
15:34
|    Документы.Ссылка,
    |  Документы.Дата,
    |  Документы.Номер,

эти цацки обычно выведены из-под rls...
13 Reset
 
28.12.12
15:36
Возврат Не Запрос.Выполнить().Пустой();

Выбирать его не обязательно
14 bvb
 
28.12.12
15:44
(12)  Согласен.
(13)  Спасибо.

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

Цитата :
"Выбор поля означает , что в выборке запроса будут присутствовать только данные, в которых по указанному полю будут удовлетворяться условия "