Форма для заполнения списка пользователей

17 15

Сегодня с Владимиром Борисовым бились над вопросом – как запросить у пользователя список пользователей, с которыми надо что-то сделать. Например, это бывает нужно в сценариях администратора. Другой пример – назначение прав на те объекты, для которых в DIRECTUM по умолчанию система прав не предусмотрена и она сделана на уровне прикладной разработки. Например, вполне можно сделать права доступа на уровне записей справочников.

Изначальный вариант заключался в использовании DuaiListDialog:

DualList = CreateDualListDialog('Выбор пользователей')
DualList.Title = "Выбор пользователей"
DualList.AvailableItemsTitle = 'Все пользователи'
DualList.SelectedItemsTitle = 'Выбранные пользователи'
UsersComp = CreateReference(SYSREF_USERS) 
UsersComp.Open
foreach User in UsersComp
  DualList.AvailableItems.Add(User.SYSREQ_USERS_LOGIN)
endforeach 
DualList.Execute()

UserList = ServiceFactory.GetUserList
foreach UserName in DualList.SelectedItems
  UserList.Add(ServiceFactory.GetUserByName(UserName))
endforeach 
  
  // В итоге UserList - список выбранных пользователей

Но вариант этот не слишком красивый, потому что пользователи никак не сгруппированы и приходится отображать их логин. Если пользователей много, то в таком списке сложно ориентироваться.

Путем опроса общественного мнения нами было выяснено, что о другом способе выбора пользователей знают далеко не все разработчики. А у тех, кто знает, знания часто ограничиваются фразой «ну было что-то, но хоть убей не помню – как это вызывать». Отсюда родился этот материал, потому что путем обращения к разработчикам платформы, мы все-таки узнали – как решить нашу задачу должным образом. Наш принцип: узнал что-то полезное - поделись с другими. smiley

UserListDialog = CreateDialog(SYSDLG_SETUP_USERS_LIST; '')
UserList = ServiceFactory.GetUserList
UserListDialog.Params.Add('Application'; Application)
UserListDialog.Params.Add('UserList'; UserList)
UserListDialog.Params.Add('UserListRequired'; TRUE)
UserListDialog.Params.Add('NeedIgnoreUnoperatingRecords'; TRUE)
UserListDialog.CreateView(UserListDialog.MainViewCode)
UserListDialogForm = UserListDialog.View.Forms(FORMCARD_NAME)
UserListDialogForm. Title.BasePart = 'Выбор пользователей'
UserListDialog.DataSet.Open
UserListDialogForm.ShowModal  

// В итоге UserList - список выбранных пользователей

Стоит отметить, что этот диалог предназначен для выбора именно пользователей, а не пользователей и групп. Поэтому при выборе слева в дереве группы, в выбранных пользователей добавляется не она, а пользователи, в нее входящие.

Примеры работоспособны в DIRECTUM 4.8 и 4.9 (возможно, и в других, не проверял).

17
Авторизуйтесь, чтобы оценить материал.
1
Андрей Девятьяров

Вот тут в п7. тоже есть похожий пример, другого диалога. Может есть смысл вообще статью о диалогах написать?

Денис Баранов

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

Т.к. статья Ксюши более объемная, помещу ссылку на свою туда в комментарии.

Алексей Пестов

Примеры в DIRECTUM 4.7 тоже работают.

Владимир Борисов

Хочу добавить: диалог SYSDLG_SETUP_USERS_LIST - функция недокументированная, и для широкого пользования не предлагается.
В случае возникновения инцидентов, связанных с использованием данной функции в вашей прикладной разработке - поддержка оказываться не будет.
Таким образом, используем сию функцию AS IS до тех пор, пока она официально не протестирована для широкого пользования и не документирована.

Николай Перфильев

Круть, прикрутил себе, на 4.8 работает ) 

Арслан Абакаров

4.6.1 уже не поддерживает

Арслан Абакаров

 

UserList = ServiceFactory.GetUserList
[Window Title]
Ошибка
 
[Content]
Method 'GetUserList' not supported by automation object.
 
[Expanded Information]
Сценарий "": ошибка в строке 2.
 
[V]  Меньше сведений [ОK] 
 
 
 
 
Когда же уже появится возможность редактировать свои комментарии
Алексей Пестов

А "Избранное" это что за зверь? В какой версии такое появится?

Арслан Абакаров

Погодите, а как считать то результаты UserListDialog?

Алексей Пестов
// В итоге UserList - список выбранных пользователей

 
Арслан Абакаров

 

Да, работает.
 
foreach user in UserList
...  
endforeach
Денис Баранов
А "Избранное" это что за зверь? В какой версии такое появится?

В 4.9, вероятно. Пока еще не разбирался детально с этим функционалом. Из того что вижу в качестве пользователя системы - я могу любую группу или пользователя добавить в избранное (через контекстное меню в списке пользователей). Ну и исключить из избранного тоже.
Денис Солецкий

Подскажите, а как ограничить список пользователей в левой части?

Андрей Гец

А как отобразить в правой части ранее выбранных пользователей?

Никита Захаров

Андрей, заполните параметр UserListDialog.Params.Add('UserList'; UserList)

Авторизуйтесь, чтобы написать комментарий