Имя: Пароль:
1C
1С v8
Динамический список ссылок
0 Taras2011
 
20.12.11
13:36
Добрый день.
Существует необходимость создания динамического списка из справочника Пользователи. Критериями отбора являются ГруппаПользователей и роль ПолныеПрава:
Функция ОтборПользователей()  экспорт
   Массив = Новый Массив;
    //Получить коллекцию значений пользователей информационной базы
   ПользователиСписок = ПользователиИнформационнойБазы.ПолучитьПользователей();
   Для Каждого Пользователь из ПользователиСписок Цикл
       // Проверить, назначена ли пользователю роль Полные права
       Если Не Пользователь.Роли.Содержит(Метаданные.Роли.ПолныеПрава) Тогда
           ФИО = Пользователь.ПолноеИмя;
           Сотрудник = Справочники.Пользователи.НайтиПоНаименованию(ФИО);
           Запись = РегистрыСведений.навНеполныеПрава.СоздатьМенеджерЗаписи();
           Запись.Пользователь = Сотрудник;
           Запись.Записать();
           Массив.Добавить(Сотрудник.Ссылка);
           Массив.Добавить(Пользователь.ПолноеИмя);
       КонецЕсли;
   КонецЦикла;
Возврат Массив;
   
КонецФункции

И в модуле формы:
&НаКлиенте
Процедура ГруппыПользователейПриАктивизацииСтроки(Элемент)
   
   ТекущаяГруппа = Элементы.ГруппыПользователей.ТекущаяСтрока;
   СписокПользователей.Отбор.Элементы.Очистить();
   ЭлементОтбора = СписокПользователей.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
   ЭлементОтбора.Использование = Истина;
   ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Ссылка");
   ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.ВСписке;
   ЭлементОтбора.ПравоеЗначение = УстановитьОтборВСпискеПользователей(ТекущаяГруппа);
КонецПроцедуры

Проблема: плохо работает в веб-клиенте, т.е. список загружается "через раз" (по нечетным щелчкам-записям)))). Возможный способ решения - вытащить результат экспортной функции в какую-то постоянную величину. С использованием регистра сведений все работает, но меня просят решить без его использования. Как мне сделать?
1 Vladal
 
20.12.11
13:55
Может, отвязаться от клиента и выполнять на сервере?
2 Stepa86
 
20.12.11
14:03
(0) а ты зачем при получении массива пользователей еще и регистр пишешь? чтоб работало шустрее??? Отбор на группу через параметр, а не через отбор. Отбор по правам при создании формы через параметр 1 раз
3 Taras2011
 
20.12.11
14:04
проблема в многократном обращении к
ПользователиСписок = ПользователиИнформационнойБазы.ПолучитьПользователей();
и
Сотрудник = Справочники.Пользователи.НайтиПоНаименованию(ФИО);
В идеале было бы получить этот список один раз при открытии и обращаться к какому-то реквизиту формы в дальнейшем. не получается. по моим понятиям, тип реквизита должен быть динамический список, но это решение у меня не заработало... Было бы желательно решить без использования регистра, потому что хранить промежуточные данные в регистре - абсурд...
4 Stepa86
 
20.12.11
14:05
(3) смотри как сделано в БСП или УТ11
5 Taras2011
 
20.12.11
14:06
(2) Не один раз, а при каждой активацией строки.
6 Stepa86
 
20.12.11
14:07
(5) нафига каждый раз то? или у тебя пользователям права переназначаются активно?
7 Taras2011
 
20.12.11
14:12
(6) динамический список каждый раз новый. при активации строки. понимаешь? нужно вот эти данные, которые сейчас идут в регистр списать в какую-то статическую переменную формы. какую?
8 Stepa86
 
20.12.11
14:14
(7) список пользователей с полными правами от этого становиться непостоянным, штоле? Статическая переменная формы называется реквизит формы. И зачем нужен динамический динамический список?
9 Taras2011
 
20.12.11
14:15
&НаСервере
Функция УстановитьОтборВСпискеПользователей(ТекущаяГруппа)
   Массив = Новый Массив;
   Запрос = Новый Запрос;
   Запрос.Текст =
       "ВЫБРАТЬ
       |    ГруппыПользователейСостав.Ссылка,
       |    ГруппыПользователейСостав.НомерСтроки,
       |    ГруппыПользователейСостав.Пользователь
       |ИЗ
       |    Справочник.ГруппыПользователей.Состав КАК ГруппыПользователейСостав
       |ГДЕ
       |    ГруппыПользователейСостав.Ссылка.Ссылка = &Ссылка";

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

Для пояснений...