Вход | Регистрация


1С:Предприятие :: 1С:Предприятие 8 общая

1С 8.2 СКД, внешние данные, роли пользователей, работа со списком значений

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

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

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

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

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

            ТекущийЭлемент = Элементы.ФормаКомандаСформировать;    
        КонецЕсли;
    КонецЕсли;
   kozhem1990
 
26 - 07.06.18 - 13:27
можно было не через общую форму, а через метаданные попробовать заполнить, разницы нет, но у меня пока не получается заполнить списком мой параметр "Роль". туплю что-то.
   kozhem1990
 
27 - 07.06.18 - 13:28
сама форма возвращает коллекцию элементов с сервера
   kozhem1990
 
28 - 07.06.18 - 13:35
Вообщем заполнил свой параметр, криво, но пойдет, я думаю) т.к. в начале значение параметра неопределенно, то нельзя его заполнить в цикле, так я сначала заполнил пустой список значений, а потом этим списком заполнил сам параметр, выглядит это так:

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

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

Пишем код в модуль отчета:
Процедура ИнициализацияОтчета()// добавляем список доступных значений 

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

ИнициализацияОтчета();
Наслаждаемся: можно выбрать валюту из 2-х вариантов по сформированному списку.


Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Рекламное место пустует