Мне нужно, что бы внешним отчетом могли получать данные только определенные пользователи по ролям. Имеется ли возможность в самом внешнем отчете в настройках СКД настроить ограничение прав доступа?
---
Очевидно, Вас не так поняли коллеги. Если Вам всего лишь надо запретить пользователям использовать отчет, то можно еще проще:

```1c
    Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)

    Если Не Пользователи.РолиДоступны("ОсобыеПрава") Тогда
    ВызватьИсключение НСтр("ru = 'Недостаточно прав доступа!'");
    КонецЕсли;

    КонецПроцедуры
```
---
А в принципе, база позволяет видеть эти данные пользователям? Если так, то можно в модуле объекта Отчета, в предопределенной процедуре "При компановке" , проверять доступные роли накладывать ограничения.
---
Я тоже так думал и даже попытался сделать, но там возникает масса дополнительных вопросов.
стандартную обработку нужно будет ставить в ложь. А что еще выводить кроме проверки прав доступа?

```1c
    Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
    СтандартнаяОбработка = Ложь;
    Если РольДоступна("ОпределенныеПрава") Тогда
    ....
    а дальше какой код ?
```
---
например Программное формирование отчета (СКД)
https://forum.infostart.ru/forum9/topic87696/

если надо кода побольше
https://infostart.ru/public/1179039/
---
база позволяет видеть эти данные пользователям?может быть, права пользователя как-то ограничивать в самом запросе?
---
изучать РЛС вы не хотите, думаете изобрести свой велосипед
---
я уж изучил рлс) , поэтому и не хочу его использовать, оно тормозит программу. А использование процедуры Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка), это не велосипед. А программная настройка в СKД? может вам ее поизучать?
---
Можно исходя из ролей сделать какой - нибудь отбор .. Чтобы пользователю ограничить данные.. Либо вообще все скрыть.. (не знаю всей задачи). Как сделать элемент отбор и применить его, легко гуглится..
---
в типовой ут мне попадалось что-то подобное вроде бы, посмотрю дома ради интереса. С отборами я знаком, склоняюсь больше к проверке прав пользователя в запросе. Если с отборами использовать проверку прав, то это нужно все равно в коде. А в коде я и так уже настроил и все работает.

```1c
    Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)

    СтандартнаяОбработка = Ложь;
    МакетДопОформление = ЭтотОбъект.ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");

    НастройкиОтчета = ЭтотОбъект.КомпоновщикНастроек.ПолучитьНастройки();
    ЭтотОбъект.КомпоновщикНастроек.ЗагрузитьНастройки(НастройкиОтчета);

    КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
    МакетКомпоновки = КомпоновщикМакета.Выполнить(
    ЭтотОбъект.СхемаКомпоновкиДанных,
    ЭтотОбъект.КомпоновщикНастроек.Настройки,
    ДанныеРасшифровки);

    ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
    ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, , ДанныеРасшифровки, Истина);

    ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
    ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
    Если РольДоступна("Т.......") ИЛИ РольДоступна("ПолныеПрава")Тогда
    ПроцессорВывода.Вывести(ПроцессорКомпоновки);
    Иначе
    ПоказатьПредупреждение(,"Не достаточно прав для создания отчета",20,"Ошибка доступа к отчету");
    КонецЕсли;

    КонецПроцедуры
```
---
Методом проб и ошибок получилось сделать такую настройку, подходящий пример для исправления взял в инете, правда не удалось сказать спасибо автору, там надо было регистрироваться, да и код я немного подправил под себя, вот что в итоге получилось и работает.

```1c
    Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)

    СтандартнаяОбработка = Ложь;
    МакетДопОформление = ЭтотОбъект.ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");

    НастройкиОтчета = ЭтотОбъект.КомпоновщикНастроек.ПолучитьНастройки();
    ЭтотОбъект.КомпоновщикНастроек.ЗагрузитьНастройки(НастройкиОтчета);

    КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
    МакетКомпоновки = КомпоновщикМакета.Выполнить(
    ЭтотОбъект.СхемаКомпоновкиДанных,
    ЭтотОбъект.КомпоновщикНастроек.Настройки,
    ДанныеРасшифровки);

    ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
    ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, , ДанныеРасшифровки, Истина);

    ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
    ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
    Если РольДоступна("ОсобыеПрава") Тогда
    ПроцессорВывода.Вывести(ПроцессорКомпоновки);
    КонецЕсли;

    КонецПроцедуры
```
---
Очевидно, Вас не так поняли коллеги. Если Вам всего лишь надо запретить пользователям использовать отчет, то можно еще проще:

```1c
    Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)

    Если Не Пользователи.РолиДоступны("ОсобыеПрава") Тогда
    ВызватьИсключение НСтр("ru = 'Недостаточно прав доступа!'");
    КонецЕсли;

    КонецПроцедуры
```
---
Очевидно, Вас не так поняли коллеги Спасибо, вы очень мягко сформулировали ответ, скорее всего я не понятно объяснил, что именно хочу. Ваше решение мне больше нравится, попробую.
---
ошибочное сообщение
---
Так я и представил код, который специально выдает ошибку, если у пользователя нет прав. :-)
---
все хорошо, я поспешил, зашел не тем пользователем в сам конфигуратор
---
Так я и представил код, который специально выдает ошибку А зачем ошибку выдавать, не лучше ли выдавать сообщение, что у вас недостаточно прав и больше ничего не выводить?
---
Как Вашей душе и душам Ваших пользователей угодно.

В типовых конфигурациях как правило все сгенерированные ошибки во время формирования отчета отображаются как простая надпись в табличном документе. Мне кажется, что нарушение прав доступа, обнаруженное Вашим кодом, должно работать также, как работает проверка прав в платформе, т.е. генерировать исключение.

Если же надумаете обойтись обычным сообщением, то нужно будет дополнительно отключить стандартную обработку:

```1c
    Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)

    Если Не Пользователи.РолиДоступны("ОсобыеПрава") Тогда
    СтандартнаяОбработка = Ложь;
    ОбщегоНазначенияКлиентСервер.СообщитьПользователю(НСтр("ru = 'Недостаточно прав доступа!'"));
    КонецЕсли;

    КонецПроцедуры
```
---
В некоторых типовых конфигурациях есть возможность раздавать через RLS доступ к внешним отчетам и обработкам.
---
Спасибо, это слишком долго наверно настраивать (у меня upp), проще в самом отчете сделать я думаю