Имя: Пароль:
1C
1С v8
1С 8.2 СКД, внешние данные, роли пользователей, работа со списком значений
0 kozhem1990
 
07.06.18
10:24
Здравствуйте! Подскажите пожалуйста! Делаю отчет, набор данных - объект, то есть в модуле объекта отчета получаю таблицу значений ролей пользователей, где колонка ролей - это строка с наименованием ролей, затем передаю в СКД как внешний объект эту таблицу. Все отлично, все работает. Но теперь надо настроить отбор в настройках, а именно: сделать так, чтобы можно было выбирать несколько наименований ролей из списка наименований ролей в настройках отчета, а не тупо вводить строку с наименованием... Как передать в СКД список значений с наименованиями ролей, и как привязать его к колонке ролей, которую я передаю в качестве внешнего объекта? Заранее благодарен за любую подсказку.
1 Franchiser
 
гуру
07.06.18
10:31
Поставить галочку доступен список значений. Возможно можно его программно заполнить в схеме до инициализации.
2 kozhem1990
 
07.06.18
10:35
(1) Ок, а как этот параметр привязать к полю таблицы "Роль", ну в плане, как сделать, чтобы его изменение влияло на таблицу? я Понимаю, что в запросе через амперсант делается например "&ИмяПараметра", а как в объекте это сделать, я без понятия: на закладке "Набор данных" все перерыл уже.
3 Franchiser
 
гуру
07.06.18
10:37
Это делается не в запросе а наборах данных СКД, точно не помню на какой закладке
4 kozhem1990
 
07.06.18
10:37
(1) Точно, допер, в МО отчета запилить туда же в процедуру "ПриКомпоновкеРезультата"
5 kozhem1990
 
07.06.18
10:40
(1) что-то типа этого?
СписокЗначенийРоли = Настройки.ПараметрыДанных.Элементы.Найти("ИмяПараметра");

СписокЗначенийРоли  = Настройки.ПараметрыДанных.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных(“СписокЗначенийРоли”));
Если СписокЗначенийРоли <> Неопределено Тогда
СписокЗначенийРоли.Значение = СписокЗначений;
СписокЗначенийРоли.Использование = Истина;
КонецЕсли;
6 Franchiser
 
гуру
07.06.18
10:41
Смотри или превую закладку или где параметры скд
7 kozhem1990
 
07.06.18
10:45
Посмотрел, как вы и говорили: создал параметр, строка, поставил галочку "Доступен список значений", попробую как-нибудь его заполнить программно и передать в МО "ПриКомпоновкеРезультата".
8 Franchiser
 
гуру
07.06.18
10:46
Думаю, не совсем. У тебя есть схема СКД (макет), который можно изменить программно, сериализовать и тд. В этой схеме нужно как то поставить эту галочку доступен список значений (или сразу ставишь в схеме на закладке параметры), затем там можно определить список, но он может быть задан только статично (это тебе не подходит), этот список нужно как-то программно в макете подменить, т.к. Он виден уже при открытии отчёта. Нужно заново инициализировать компоновщик из источника доступных настроек СКД.
9 Franchiser
 
гуру
07.06.18
10:51
Поэкспериментировать для начала на статичном списке, его можно задать в схеме, потом нужно думать как его подменить. Я обычно в таких случаях рисую свою форму, но если у тебя получиться, многим будет полезно.
10 DrShad
 
07.06.18
10:57
а почему наименования ролей, а не сами роли?
11 kozhem1990
 
07.06.18
11:02
(9) Делаю список, просто ввел два строковых значения, потом попробую в форме отчета (она у меня уже сделана своя) в процедуре "УстановитьПараметрыКомпоновщика()" заполнить список, а уже потом, в МО отчета в процедуре "ПриКомпоновкеРезультата()" запилить его в таблицу значений, которую потом передам в СКД как объект.
(10) я не нашел, где хранятся роли, не на что ссылаться, не нашел таблицы с ними, иначе бы делал запросом, а не объектом.
12 DrShad
 
07.06.18
11:04
посмотри ПользовательИБ
13 kozhem1990
 
07.06.18
11:14
(12) я и получаю из ПользователиИнформационнойБазы.ПолучитьПользователей(), просто потом в СКД какой тип поля задать для колонки "Роли"? нету типа "ПользователиИБ" или "РолиПользователей", и запросом не смог достать, поэтому и нагородил все это)
14 kozhem1990
 
07.06.18
11:15
(12) пользователи есть, ошибся, это ссылка на справочник "Пользователи", а на роли нет, нет справочника "Роли".
15 DrShad
 
07.06.18
11:17
(14) да, сорри, поднял свой отчет по правам на СКД и там у меня берется в источник данных имя роли, а не сама роль
16 DrShad
 
07.06.18
11:18
а для чего отбор ролей нужен?
17 kozhem1990
 
07.06.18
11:40
(16) Нужно) Для администратора: запустил отчет и посмотрел, у каких пользователей, скажем, роль "Полные права", или еще какая, и по ссылке перешел к этому пользователи, убрал или назначил новую роль.
18 kozhem1990
 
07.06.18
11:42
(16) Пользователей то много, половина тысячи в базе добавлено, какие-то уже давно не актуальны, кто-то не работает, и у каждого пользователя по 6-7 ролей, скажем. Отчетом удобно будет работать.
19 kozhem1990
 
07.06.18
11:43
Но а так спасибо всем!) интересную тему затрону ли, как мне кажется...
20 Franchiser
 
гуру
07.06.18
12:02
Отпишись что в итоге получилось
21 DrShad
 
07.06.18
12:23
(17) в таком случае добавить на форму список, где вбивать интересующие роли
при компоновке результата собирать источник данных и обходом пользователей ИБ и их ролей сравнивать на вхождение в список

получишь таблицу пользователей и назначенных ему ролей по списку
22 kozhem1990
 
07.06.18
12:39
Окей, отпишусь через час где-то, как сделаю все.
23 Franchiser
 
гуру
07.06.18
13:13
(21) ну так не интересно, хотелось бы без изменения формы
24 DrShad
 
07.06.18
13:20
(23) что мешает создать параметр в схеме и юзать его?
25 kozhem1990
 
07.06.18
13:26
А вот как его заполнить в СКД всеми существующими ролями, причем динамично чтобы все было, а не руками добавлять?

Я создал параметр "Роль", тип строка, галочка "Доступен список значений". В форме, в пр-е "УстановитьПараметрыКомпоновщика()" прописал след. код:

ПараметрРоли = Отчет.КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Найти("Роли");
    Если ПараметрРоли <> Неопределено Тогда
        ИдентификаторРоли = ПараметрРоли.ИдентификаторПользовательскойНастройки;
        Если Строка(Элементы.КомпоновщикНастроекПользовательскиеНастройкиГруппаКолонок.Родитель.ТекущаяСтрока) = ИдентификаторРоли Тогда
            СтандартнаяОбработка = Ложь;
            ПараметрРоли = Отчет.КомпоновщикНастроек.ПользовательскиеНастройки.Элементы.Найти(ИдентификаторРоли);    
            МассивРолей = Новый Массив;
            СтруктураПараметров = Новый Структура;
            СтруктураПараметров.Вставить("СписокРолей", МассивРолей);
            СтруктураПараметров.Вставить("ЗаголовокФормы", "Выбор ролей");
            РезультатРоль = ОткрытьФормуМодально("ОбщаяФорма.ПодборРолейУправляемая", СтруктураПараметров);
            Если РезультатРоль = Неопределено Тогда
                Возврат;
            КонецЕсли;
            //здесь кадо как-то заполнить этот параметр "Роль"    
            ТекущийЭлемент = Элементы.ФормаКомандаСформировать;    
        КонецЕсли;
    КонецЕсли;
26 kozhem1990
 
07.06.18
13:27
можно было не через общую форму, а через метаданные попробовать заполнить, разницы нет, но у меня пока не получается заполнить списком мой параметр "Роль". туплю что-то.
27 kozhem1990
 
07.06.18
13:28
сама форма возвращает коллекцию элементов с сервера
28 kozhem1990
 
07.06.18
13:35
Вообщем заполнил свой параметр, криво, но пойдет, я думаю) т.к. в начале значение параметра неопределенно, то нельзя его заполнить в цикле, так я сначала заполнил пустой список значений, а потом этим списком заполнил сам параметр, выглядит это так:

///////////
РезультатРоль = ОткрытьФормуМодально("ОбщаяФорма.ПодборРолейУправляемая", СтруктураПараметров);
            Если РезультатРоль = Неопределено Тогда
                Возврат;
            КонецЕсли;
            Списокролей = Новый СписокЗначений;
            Для каждого ЭлементРоль Из РезультатРоль Цикл
                Если ЗначениеЗаполнено(ЭлементРоль.ПредставлениеРоли) Тогда
                    Списокролей.Добавить(ЭлементРоль.ПредставлениеРоли);
                Иначе
                    Списокролей.Добавить(ЭлементРоль.ИмяРоли);
                КонецЕсли;
            КонецЦикла;    
            ПараметрРоли.Значение = СписокРолей;
/////////////
29 kozhem1990
 
07.06.18
13:37
а дальше, в МО передать этот списк из параметра и использовать его как параметр в запросе, который формирует мою таблицу пользователей с ролями, которую в свою очередь я передаю как внешний объект в СКД. вот как-то так, товарищи)
30 kozhem1990
 
07.06.18
13:39
Если кому интересно, выложу часть кода, когда с МО отчета закончу, если нет, тогда можно закрывать тему.
31 Franchiser
 
гуру
07.06.18
14:14
(30) не ну со своей формой понятно, а как сделать чтобы общая форма использовалась
32 Franchiser
 
гуру
07.06.18
14:15
(28) у тебя что модальные вызовы разрешены?
33 kozhem1990
 
07.06.18
15:20
Видимо да, я не знаю, как там делается, чтобы общая форма модально открывалась, может "Режим открытия окна" ставить в "Независимый" в настройках формы, не знаю... да можно и самому было сделать форму, а получать роли из метаданных, что-то типа этого:

Для каждого Роль Из Метаданные.Роли Цикл          СписокРолейКонфигурации.Добавить(МетаРоль.Имя);
Конеццикла
34 Franchiser
 
гуру
08.06.18
00:04
Вот как можно сделать, проверил на внешнем отчете.
Создаем параметр ВалютаОтчета, и в включаем в быстрый доступ.

Пишем код в модуль отчета:
Процедура ИнициализацияОтчета() // добавляем список доступных значений
    СписокВалют = Новый СписокЗначений;
    СписокВалют.Добавить(Справочники.Валюты.НайтиПоКоду("643"));
    СписокВалют.Добавить(Справочники.Валюты.НайтиПоКоду("840"));
    ПараметрСхемы = СхемаКомпоновкиДанных.Параметры.Найти("ВалютаОтчета");
    ПараметрСхемы.УстановитьДоступныеЗначения(СписокВалют);
    КомпоновщикНастроек.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(СхемаКомпоновкиДанных));
КонецПроцедуры
// ИнициализацияОтчета
ИнициализацияОтчета();
Наслаждаемся: можно выбрать валюту из 2-х вариантов по сформированному списку.
Компьютеры — это как велосипед. Только для нашего сознания. Стив Джобс