Имя: Пароль:
1C
1С v8
Как запустить функцию НайтиПомеченныеНаУдаление() от обычного пользователя?
, , ,
0 xintrea
 
10.12.12
16:45
Здравствуйте!


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

Задача - дать возможность пользователю удалять объекты, помеченные на удаление, в пределах его прав.

Если вызвать функцию НайтиПомеченныеНаУдаление(), то возникает ошибка:

{ОбщийМодуль.ОсновнойМодуль.Модуль(874)}:
Ошибка при вызове метода контекста (НайтиПомеченныеНаУдаление)
Помеченные = НайтиПомеченныеНаУдаление();
по причине: У пользователя недостаточно прав на исполнение операции над базой данных.
объект: 'Справочник.РазделыПроектовРазработкиДокументации';
право: 'Чтение'
Таблица: 'Reference208', SDBL-команда: 'SELECT'.

То есть, пользователь не имеет доступа к справочнику РазделыПроектовРазработкиДокументации (этот справочник принадлежит подсистеме, с которой данный пользователь работать не должен). Так настроены права, так нужно.

Но это же не должно обозначать, что вообще нельзя выполнить поиск помеченных на удаление объектов, в пределах прав пользователя!


Вопрос: как получить объекты, помеченные на удаление, и доступные для удаления пользователю?
1 ParinovS
 
10.12.12
16:49
Я бы посоветовал обходить все метаданные через попытку.
2 H A D G E H O G s
 
10.12.12
16:52
СП украли?

УстановитьПривилегированныйРежим()
3 Heckfy
 
10.12.12
16:55
(2) Не то. Ему не все помеченные надо, а только в рамках дозволенного пользователю.
4 H A D G E H O G s
 
10.12.12
16:58
(3) Ну потом пусть шерстит массив ссылок на право чтения.
5 H A D G E H O G s
 
10.12.12
17:01
Если rls на уровне метаданных - ПравоДоступа()
Если rls на уровне данных - в попытке:
ОбщегоНазначения.ПолучитьЗначениеРеквизита(ЭлементМассива,"Ссылка").

Как то так наверное.
6 xintrea
 
10.12.12
17:03
(1)

> Я бы посоветовал обходить все метаданные через попытку.

Есть какой-нибудь пример кода?
7 xintrea
 
10.12.12
17:03
(4) Откуда взять это массив ссылок? Можно пример кода?
8 H A D G E H O G s
 
10.12.12
17:08
МассивСсылок=НайтиПомеченныеНаУдаление();
9 xintrea
 
11.12.12
08:34
(8) Так в том-то и дело, что функция НайтиПомеченныеНаУдаление():

- отрабатывает нормально только в случае, если доступны ВСЕ объекты;
- генерирует ошибку времени исполнения, которую я привел в топике, если нет прав хотя бы на один объект.

Так что так просто получиить массив помеченных объектов нельзя.

Вот я и спрашиваю, как можно обходным путём получить такой массив.
10 Heckfy
 
11.12.12
09:46
(8) Не понимает он тебя. :(
(6) Вот пример кода обхода всех справочников с выводом количества записей:

Для Каждого Спр Из Метаданные.Справочники Цикл
   Запрос=Новый Запрос;
   Запрос.Текст=
   "ВЫБРАТЬ
   |    КОЛИЧЕСТВО(*) КАК Кол
   |ИЗ
   |    Справочник."+Спр.Имя+" КАК Справочник"
   ;
   РезультатЗапроса=Запрос.Выполнить().Выбрать();
   РезультатЗапроса.Следующий();
   
   Сообщить(Спр.Имя+"   "+РезультатЗапроса.Кол);
КонецЦикла;
11 suvolod
 
12.12.12
18:54
Перебери метаданные. Вот кусок типового кода, который позволяет строить реестр только по разрешенным документам:

код, который взял из типового отчета "Реестр документов"

// Создает список значений, содержащий виды документов существующих в системе,
Функция СоздатьСписокВидовДокументов()
   Перем СписокВидов;
   Перем Выбор;

   СписокВидов = Новый СписокЗначений;

   Для Каждого К Из Метаданные.Документы Цикл
       Если ПравоДоступа("Чтение", К) Тогда
           СписокВидов.Добавить(К.Имя, К.Синоним);
       КонецЕсли;
   КонецЦикла;

   Возврат СписокВидов;

КонецФункции // СоздатьСписокВидовДокументов()
12 banco
 
12.12.12
22:02
УстановитьПривилегированныйРежим() получить массив ссылок потом отключить привилегириванный режим и запросом разрешенные получить
13 Aleksey
 
12.12.12
22:11
Но ведь типовая как то получает же без плясок с бубном?