Мне нужно, что бы внешним отчетом могли получать данные только определенные пользователи по ролям. Имеется ли возможность в самом внешнем отчете в настройках СКД настроить ограничение прав доступа?
(8) Очевидно, Вас не так поняли коллеги. Если Вам всего лишь надо запретить пользователям использовать отчет, то можно еще проще:
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
Если Не Пользователи.РолиДоступны("ОсобыеПрава") Тогда
ВызватьИсключение НСтр("ru = 'Недостаточно прав доступа!'");
КонецЕсли;
КонецПроцедуры
А в принципе, база позволяет видеть эти данные пользователям? Если так, то можно в модуле объекта Отчета, в предопределенной процедуре "При компановке" , проверять доступные роли накладывать ограничения.
(2) Я тоже так думал и даже попытался сделать, но там возникает масса дополнительных вопросов.
стандартную обработку нужно будет ставить в ложь. А что еще выводить кроме проверки прав доступа?
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
Если РольДоступна("ОпределенныеПрава") Тогда
....
(6) я уж изучил рлс) , поэтому и не хочу его использовать, оно тормозит программу. А использование процедуры Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка), это не велосипед. А программная настройка в СKД? может вам ее поизучать?
Можно исходя из ролей сделать какой - нибудь отбор .. Чтобы пользователю ограничить данные.. Либо вообще все скрыть.. (не знаю всей задачи). Как сделать элемент отбор и применить его, легко гуглится..
(5)в типовой ут мне попадалось что-то подобное вроде бы, посмотрю дома ради интереса. С отборами я знаком, склоняюсь больше к проверке прав пользователя в запросе. Если с отборами использовать проверку прав, то это нужно все равно в коде. А в коде я и так уже настроил и все работает.
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
МакетДопОформление = ЭтотОбъект.ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
НастройкиОтчета = ЭтотОбъект.КомпоновщикНастроек.ПолучитьНастройки();
ЭтотОбъект.КомпоновщикНастроек.ЗагрузитьНастройки(НастройкиОтчета);
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(
ЭтотОбъект.СхемаКомпоновкиДанных,
ЭтотОбъект.КомпоновщикНастроек.Настройки,
ДанныеРасшифровки);
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, , ДанныеРасшифровки, Истина);
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
Если РольДоступна("Т.......") ИЛИ РольДоступна("ПолныеПрава")Тогда
ПроцессорВывода.Вывести(ПроцессорКомпоновки);
Иначе
ПоказатьПредупреждение(,"Не достаточно прав для создания отчета",20,"Ошибка доступа к отчету");
КонецЕсли;
КонецПроцедуры
Методом проб и ошибок получилось сделать такую настройку, подходящий пример для исправления взял в инете, правда не удалось сказать спасибо автору, там надо было регистрироваться, да и код я немного подправил под себя, вот что в итоге получилось и работает.
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
МакетДопОформление = ЭтотОбъект.ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
НастройкиОтчета = ЭтотОбъект.КомпоновщикНастроек.ПолучитьНастройки();
ЭтотОбъект.КомпоновщикНастроек.ЗагрузитьНастройки(НастройкиОтчета);
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(
ЭтотОбъект.СхемаКомпоновкиДанных,
ЭтотОбъект.КомпоновщикНастроек.Настройки,
ДанныеРасшифровки);
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, , ДанныеРасшифровки, Истина);
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
Если РольДоступна("ОсобыеПрава") Тогда
ПроцессорВывода.Вывести(ПроцессорКомпоновки);
КонецЕсли;
КонецПроцедуры
(8) Очевидно, Вас не так поняли коллеги. Если Вам всего лишь надо запретить пользователям использовать отчет, то можно еще проще:
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
Если Не Пользователи.РолиДоступны("ОсобыеПрава") Тогда
ВызватьИсключение НСтр("ru = 'Недостаточно прав доступа!'");
КонецЕсли;
КонецПроцедуры
(16) Как Вашей душе и душам Ваших пользователей угодно.
В типовых конфигурациях как правило все сгенерированные ошибки во время формирования отчета отображаются как простая надпись в табличном документе. Мне кажется, что нарушение прав доступа, обнаруженное Вашим кодом, должно работать также, как работает проверка прав в платформе, т.е. генерировать исключение.
Если же надумаете обойтись обычным сообщением, то нужно будет дополнительно отключить стандартную обработку:
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
Если Не Пользователи.РолиДоступны("ОсобыеПрава") Тогда
СтандартнаяОбработка = Ложь;
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(НСтр("ru = 'Недостаточно прав доступа!'"));
КонецЕсли;
КонецПроцедуры