Re: Роль пользователя

Подскажите, пожалуйста, как с помощью API определить  текущую роль пользователя в заданном документе?

Попутно возникает вопрос: как определяется роль пользователя в документе, если в рабочей группе, имеющей доступ к документу, пользователь исполняет одну роль, в доступе отдельных пользователей - другую?

Re: Роль пользователя

GamiyDO писал(а):
Подскажите, пожалуйста, как с помощью API определить  текущую роль пользователя в заданном документе?

Properties( "OFFICER_ID" )

Re: Роль пользователя

GamiyDO писал(а):
Попутно возникает вопрос: как определяется роль пользователя в документе, если в рабочей группе, имеющей доступ к документу, пользователь исполняет одну роль, в доступе отдельных пользователей - другую?

эт зачем? Если для определения суммарных прав к документу, то есть SingleDoc.Properties( "MY_ACCESS" )

Re: Роль пользователя

Вообще-то, если ситуация такая:

GamiyDO писал(а):
...в рабочей группе, имеющей доступ к документу, пользователь исполняет одну роль, в доступе отдельных пользователей - другую?

то считается, что пользователь исполняет роль, прописанную в доступе отдельных пользователей. Т.е. информация в закладке про доступ отдельных пользователей имеет больший приоритет.

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

Re: Роль пользователя

Спасибо за ответы. 
Появились новые вопросы:

Бобов писал(а):
Если в доступе отдельных пользователей роль данному пользователю не прописана, но в Рабочей группе он прописан с несколькими ролями, то считается что пользователь исполняет несколько ролей

Как тогда система определяет, может ли данный пользователь проставлять выбранную подпись или выполнять текущий переход?

Сергей Девятериков писал(а):
...Если для определения суммарных прав к документу, то есть SingleDoc.Properties( "MY_ACCESS" )

Что можно узнать с помощью SingleDoc.Properties( "MY_ACCESS" )? Ведь это, насколько мне известно, просто число. На какой интерфейс или справочник оно ссылается?

Re: Роль пользователя

GamiyDO писал(а):

Бобов писал(а):
Если в доступе отдельных пользователей роль данному пользователю не прописана, но в Рабочей группе он прописан с несколькими ролями, то считается что пользователь исполняет несколько ролей

Как тогда система определяет, может ли данный пользователь проставлять выбранную подпись или выполнять текущий переход?


Ну вот так и определяет  :D 

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

Re: Роль пользователя

Спасибо!  :)
Получается, чтобы определить роль пользователя нужно:
1. Посмотреть, какие группы имеют доступ к документу.
2. В каждой группе поискать требуемого пользователя и посмотреть какие ему назначены роли.
3. Посмотреть в отдельных пользователях, имеющих доступ к документу, есть ли требуемый пользователь и какая ему назначена роль.

Re: Роль пользователя

GamiyDO писал(а):
Что можно узнать с помощью SingleDoc.Properties( "MY_ACCESS" )? Ведь это, насколько мне известно, просто число. На какой интерфейс или справочник оно ссылается?

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

please-change-link

Re: Роль пользователя

GamiyDO писал(а):
Спасибо!  :)
Получается, чтобы определить роль пользователя нужно:
1. Посмотреть, какие группы имеют доступ к документу.
2. В каждой группе поискать требуемого пользователя и посмотреть какие ему назначены роли.
3. Посмотреть в отдельных пользователях, имеющих доступ к документу, есть ли требуемый пользователь и какая ему назначена роль.

ага, так и есть. И через Апи всё это видно

Re: Роль пользователя

Сергей и Пётр, спасибо! Буду разбираться...

Re: Роль пользователя

Вот какую функцию я написал для проверки роли текущего пользователя:

Function CheckCurUserRole(ByVal Doc_ID, ByVal Role_ID)
 'Doc_ID - ИД документа
 'Role_ID - ИД проверяемой роли
 Dim SingleDoc, Users, WGroups, ShowGrpAction, Filter 
 Dim Role_Name, User_Name
 
 Role_Name = GetRoleName(Role_ID)
 User_Name = TCSApp.LoginUserName
 Set SingleDoc = TCSApp.SingleDoc(2, Doc_ID) ' По ИД 
 Call SingleDoc.Refresh
 '
 Set Users = SingleDoc.Properties("USERS").AsIDispatch
 If Not Users.IsEmpty Then
  If Users.Locate("NAME", TCSAPP.LoginUserName, 0) Then
   If Users.Properties("OFFICER_ID").AsInteger = Role_ID   Then
    CheckCurUserRole = True
    Set Users = Nothing
    Set SingleDoc = Nothing 
    'Дальше искать нет смысла - роль, указанная в доступе отдельных пользователей имеет преимущество
    ' перед теми, что заданы в доступе групп
    Exit Function
   Else
    CheckCurUserRole = False 
    Exit Function
   End If   
  End If
 End If 
 Set Users = Nothing
 ' 
 Set WGroups = SingleDoc.ChildModules.ModuleByName("PrjVerRights").AsIDispatch
 If  Not WGroups Is Nothing Then 
  If WGroups.IsEmpty Then  
   CheckCurUserRole = False 
  Else  
   Set ShowGrpAction = WGroups.ActionList.ActionByName("ShowGrpAction")
   If  Not ShowGrpAction Is Nothing Then ShowGrpAction.Execute 
   'Создаём фильтр
   Set Filter = WGroups.Filter
   Call Filter.ClearFilter
   Call Filter.NewFilterItem(WGroups.Properties("USER_NAME"),0,User_Name) 'По пользователю
   Call Filter.NewFilterItem(WGroups.Properties("OFFICER_NAME"),0, Role_Name) 'По роли 
   Call Filter.ApplyFilter 
   
   WGRoups.Refresh 
   
   If WGRoups.IsEmpty Then    
    CheckCurUserRole = False
   Else    
    CheckCurUserRole = True    
   End If
   
   Call Filter.ClearFilter
   Set Filter = Nothing   
   Set ShowGrpAction = Nothing
  End If
 End If 
 
 'CheckCurUserRole = False
 Set WGroups = Nothing
 Set SingleDoc = Nothing
End Function

Здесь использована ещё одна моя функция GetRoleName:

Function GetRoleName(ByVal Role_ID) ' Название роли по её ID
 Dim Roles
 
 Set Roles = TCSApp.Roles
 If Not Roles Is Nothing Then
  If Roles.Locate("ID", Role_ID, 0) Then 
   GetRoleName=Roles.Properties("NAME").AsSafeString
  Else
   GetRoleName=""
  End If 
 End If 
 
 Set Roles = Nothing
End Function

Может быть, кому-нибуть это пригодится  :)