Примеры программной работы с компонентой "Пользователи"

19 14

В процессе работы в службе поддержки DIRECTUM достаточно часто сталкиваюсь с вопросами программной работы с компонентой «Пользователи», а именно: создание и генерация пользователей,  создание группы пользователей, добавление в нее пользователей и выдача ее членам прав на компоненты, отключение пользователя и удаление его из БД. Предлагаю Вашему вниманию несколько примеров работы с данной компонентой.

1. Пример сценария создания и генерации пользователя:    

     // Имя и полное имя создаваемого пользователя:
      UserName = 'USERNAME'
      FullName = 'USERNAME U.'
     // Получить ссылку на компоненту "Пользователи"
      USERS_COMPONENT = CreateReference(SYSREF_USERS)
     // Во время работы с компонентой в визуальном режиме при генерации пользователя
     // запрашиваются логин и пароль для доступа к SQL Server.
     // Установить режим, запрещающий выводить диалоговые окна и задать значения
     // необходимых параметров:
      USERS_COMPONENT.Params.Add('DontShowDialogs'; TRUE)
      USERS_COMPONENT.Params.Add('SQLUserName'; 'sa')
      USERS_COMPONENT.Params.Add('SQLUserPassword'; '')
      USERS_COMPONENT.Params.Add('DontShowUserGenerationCompleteMessage'; TRUE)
     // Поскольку компонента открывается только для добавления новой записи,
     // ее нужно открыть пустой:
      WhereID = USERS_COMPONENT.AddWhere('0 = 1')
     // Добавить нового пользователя (работа с компонентой во многом аналогична работе
     // со справочниками):
      USERS_COMPONENT.Open
      USERS_COMPONENT.Insert
      USERS_COMPONENT.Requisites(SYSREQ_CODE).Value = UserName
      USERS_COMPONENT.Requisites(SYSREQ_NAME).Value = FullName
      USERS_COMPONENT.Requisites(SYSREQ_TYPE).Value = 'П'
      USERS_COMPONENT.Requisites('UserStatus').Value = 'Пользователь'
      USERS_COMPONENT.Save
     // Задать представление компоненты и получить ссылку на форму для выбранного
     // представления:
      USERS_COMPONENT.ViewName = 'Главное'
      USERS_COMPONENT_FORM = USERS_COMPONENT.Form
     // Выполнить действие, соответствующее кнопке "Генерировать"
      USERS_COMPONENT_FORM.Actions.FindAction('GenerateUsersAction').Execute
     // Закрыть компоненту и удалить ограничения на выборку набора данных:
      USERS_COMPONENT.Close
      USERS_COMPONENT.DelWhere(WhereID)
 

2. Пример программного создания группы пользователей, добавления в нее пользователей и выдачи ее членам прав на компоненты. Приведенный ниже фрагмент кода создает группу пользователей  с именем "Имя группы" и полным именем "Полное имя группы".  В группу включается пользователь с именем "U1".  Всем членам группы даются права на выполнение сценария с именем "Поиск РКК":

// Открыть компоненту "Группы пользователей".
// Поскольку компонента открывается только для добавления новой записи,
// ее нужно открытьпустой:
USERGROUPS = CreateReference(SYSREF_USER_GROUPS)
USERGROUPS_WhereID = USERGROUPS.AddWhere('0=1')
USERGROUPS.Open
// Добавить запись и заполнить значения реквизитов главного раздела:
USERGROUPS.Insert
USERGROUPS.Requisites(SYSREQ_CODE).Value = 'Имягруппы'
USERGROUPS.Requisites(SYSREQ_NAME).Value = 'Полноеимягруппы'
// Добавить в группу пользователя c сетевым именем U1 (1-ый детальный раздел):
DDS1 = USERGROUPS.DetailDataSet(1)
DDS1.Insert
// .. в качестве кода записи в данном случае используется имя пользователя
DDS1.Requisites('ПользовательТ').Value = 'U1'
// Выдать группе права на компоненту "BDFY" (это - сценарий):
// .. найти ИД и код компоненты с именем "Поиск РКК"
// ..(для этого открывается соответствующая запись компоненты "Компоненты").
// ..Перед открытием накладывается фильтр таким образом, чтобы после открытия
// ..набора данных компоненты в нем содержалась только искомая запись.
COMPONENTS = CreateReference(SYSREF_COMPONENTS)
WhereStr = COMPONENTS.DataSet.TableName & '.' & COMPONENTS.Requisites(SYSREQ_NAME).SQLFieldName & " = 'ПоискРКК'"
COMPONENTS_WhereID = COMPONENTS.AddWhere(WhereStr)
COMPONENTS.Open
COMPONENTS.OpenRecord
COMPONENT_ID = COMPONENTS.Requisites(SYSREQ_ID).Value
COMPONENT_CODE = COMPONENTS.Requisites(SYSREQ_CODE).Value
COMPONENTS.CloseRecord
COMPONENTS.Close
COMPONENTS.DelWhere(COMPONENTS_WhereID)
// ..найти ИД и код типа прав "Выполнение" на компоненту "Поиск РКК".
// ..Идея поиска полностью аналогична предыдущему случаю.
ART = CreateReference(SYSREF_ACCESS_RIGHTS_TYPES)
WhereStr = '(' & ART.DataSet.TableName & '.' & ART.Requisites('ComponentID').SQLFieldName & ' = ' & COMPONENT_ID & ')'
WhereStr = WhereStr & ' AND (' & ART.DataSet.TableName & '.' & ART.Requisites('КодТипа').SQLFieldName & ' = ' & "'ВЫПОЛНЕНИЕ'" &')'
ART_WhereID = ART.AddWhere(WhereStr)
ART.Open
ART.OpenRecord
AccessCode = ART.Requisites(SYSREQ_CODE).Value
ART.CloseRecord
ART.Close
ART.DelWhere(ART_WhereID)
// ..заполнить найденными значениями соответствующую строку в табличном разделе на закладке "Компоненты"
DDS2 = USERGROUPS.DetailDataset(2)
DDS2.Insert
DDS2.Requisites('ИмяТ').Value = COMPONENT_CODE // Компонента в таблице "Компоненты"
DDS2.Requisites('ПраваТ').Value = AccessCode // Тип доступа на компоненту в таблице "Компоненты"
// Сохранить группу, закрыть набор данных и удалить ограничения:
USERGROUPS.Save
USERGROUPS.Close
USERGROUPS.DelWhere(USERGROUPS_WhereID) 

 

3. Пример отключения пользователя.

UserName = ' UserName '
ref = CreateReference(SYSREF_USERS)
foreach i in ref
  if ref.Requisites('Наименование').Value == UserName
    ref.Open
    ref.OpenRecord
    ref.Requisites('UserStatus').Value = 'Отключен'
    ref.Save
    endif
endforeach

 

4. Пример удаления логина пользователя из БД. 

Для сохранения ссылочной целостности данных  не рекомендуется удалять пользователя из системы, а лишь установить его статус «Отключен», воспользовавшись вышеприведенным примером.

Если же необходимо удалить пользователя из БД, например, пользователь заведен ошибочно, то это можно сделать только с помощью SQL запросов, убедившись перед этим, что он не используется в других объектах. Иначе после удаления пользователя возможны ошибки в работе системы.

Таким образом, перед выполнением запроса необходимо выполнить сценарии:
- Проверка целостности базы данных в части папок и электронных документов;
- Проверка целостности базы данных в части деловых процессов.

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

delete MBAnValR 
where Vid = 3118 
and PolzovatelT = (select Analit from MBAnalit where Vid = 3119 and Dop = 'Логин')
 
delete MBAnalit 
where Vid = 3119 
and Dop = 'Логин'

Используя функцию SQL(), можно выполнить эти запросы в вычислениях на ISBL. 

Иван Чурбаков

На самом деле из компоненты администратора Пользователи запись удалять можно (и через объектную модель это тоже должно работать). Не стоит удалять записи из справочника Пользователи (справочник с именем "ПОЛ").

Константин Широбоков

Перед удалением выполнять проверку целостности БД нет особого смысла: данные до удаления в базе будут корректны. Проблемы начнуться после вмешательства в БД через SQL -запросы.

Перед удалением логина нужно выполнить интегрированный отчет "использование записи справочника", работая со справочником "пользователи".  

Константин Широбоков

Дополню также следующее: сценарии "проверка целостности БД в части..." в зависимости от выбранного при старте режима самостоятельно способны произвести удаление некорректных данных. Для этого при запуске нужно выбрать вариант "Скрипт".  

Иван Чурбаков

Но это будет именно удаление (документов, задач и т.п.), так что без предварительной проверки, что он собирается удалить, не рекомендую на рабочей БД этот скрипт выполнять.

Павел Вычегжанин

Здравствуйте, подскажите как при генерации поменять вид Аутентификации??

Где можно посмотреть список реквизитов компоненты "Пользователи"?

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

ХА!! )))) В справочнике ПОЛ(Пользователи), а где же еще ))))

Иван Чурбаков

Не все так просто. Генерация пользователя выполняется через компоненту администратора Пользователи.

Можно создать этот справочник и просто по всем реквизитам пройтись (вывести их имена на экран). Справочник имеет имя "Пользователи", насколько я помню.

Павел Вычегжанин

В справочнике ПОЛ вообще не нашел реквизита Аутентификация. Я так понимаю нужен реквизит компоненты здесь использовать (так как мы работаем с компонентой)?? 

Например: USERS_COMPONENT.Requisites(*******).Value = 'По перекодированному паролю'

Вот как то так, вместо точек имя реквизита. По умолчанию создает Windows-аутентификацию

Павел Вычегжанин

Вопрос решил. В цикле прошелся по всем реквизитам справочника SYSREF_USERS и вывел все на экран. Реквизит оказался называется банально 'Аутентификация' ))))

Александр Рассохин

В справке по объектной модели для версии DIRECTUM 4.6.1, в ветке "Системные константы ISBL" - "Константы для работы с данными" есть раздел "Реквизиты компонент". В нем описаны константы и их значения для обращения к реквизитам компонент системы DIRECTUM. Так для обращения к реквизиту "Аутентификация" компоненты "Пользователи" можно вместо имени реквизита указать константу SYSREQ_USERS_AUTHENTICATION. Там же можно посмотреть и весь список реквизитов компоненты.

Антон Волков

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

Такой скриптик здорово бы экономил время при первичной настройке системы.

Марина Котусева
      USERS_COMPONENT.Params.Add('SQLUserName'; 'sa')       USERS_COMPONENT.Params.Add('SQLUserPassword'; '')

Какой параметр нужно добавить вместо этих, чтобы использовать для генерации пользователя, от имени которого запускается сценарий? Т.е. "проставить" галочку "Windows-аутентификация" вместо указания пользователя и логина.
Константин Тарасов

По п.3 "Пример отключения пользователя" вопрос: зачем нужен foreach если i никак не используется?

Тарас Асачёв

Или  так)

RAB     = References.РАБ.GetObjectByID(RabID)
User    = Rab.Requisites("Пользователь").AsString
if Assigned(User)
  UserRef = References.SYSREF_USERS_REFERENCE.GetObjectByCode(User)
  UserRef.SYSREQ_STATE = 'Закрытая'
  UserRef.Save
  Login   = SubString(SubString(UserRef.Requisites("ISBDescription").DisplayText;'(';2);')';1)
  SET     = UserRef.DetailDataSet(1)
  SET.First
  IDspr   = SET.Requisites('ИДСпрТ').Value
  FCTUser = References.SYSREF_USERS.GetObjectByID(IDspr)
  FCTUser.OpenRecord
  Groups = FCTUser.DetailDataSet(1)
  foreach Group in Groups
    Flt = Group.ГруппаТ
    if not ((Flt == 'ВСЕ') or (Flt =='main')) 
      Group.Delete
      FCTUser.Save
    endif
  endforeach
  QweryKill = "UPDATE [DIRECTUM].[dbo].[MBUser] SET [UserStatus] = 'О' WHERE [UserLogin] = '"&Login&"'"
  SQL(QweryKill)
  Result = 1
else
  Result = 0
endif

 

Тарас Асачёв: обновлено 17.02.2021 в 11:48

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