Запрос прав на документ через контекстное меню

11 5

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

Чтобы пользователю было удобно это делать, добавляем прикладное действие в контекстное меню документа.
Далее вкратце:
1. Добавляем "Действие" в необходимый тип карточки документа (обзываем, выбираем иконку)
2. Вписываем код, который представлен ниже:

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

3. Меняем настройки прикладного действия: "Показать в контекстном меню" -> "Да"
4. По желанию добавляем кнопку в ленту карточки.

 

upd: Добавлена проверка на авторство системными учетными записями и проверка статуса учетной записи автора (Действующая/Закрытая)

  Doc = Object.Info
  Requester = ServiceFactory.GetUserByName(CurrentUserName())
  AccessRights = Object.AccessRights
  Subject = 'Запрос прав доступа от ' & 
             Requester.FullName & ' на документ "' & Doc.Name & '"'
  SystemAcc1 = "dbo"
  SystemAcc2 = "Administrator"
  SystemAcc3 = "ISBuilderSystem"  
  AuthorState = References.SYSREF_USERS_REFERENCE.GetObjectByID(Doc.Author.ID).SYSREQ_STATE

  //Проверка на авторство системы     
  if Doc.Author.Name == SystemAcc1 or 
       Doc.Author.Name == SystemAcc2 or 
         Doc.Author.Name == SystemAcc3
    Message = 'Данный документ создан системой.' &
            cr & 'Обратитесь к администратору.'         
    Raise(CreateException("AuthIsSystem"; Message; ecWarning))
  else
    //Проверка на автора     
    if Doc.Author.Code == Requester.Code
      Message = 'Вы не можете запросить права, т.к. являетесь автором документа.' &
              cr & 'Если права отсутствуют, обратитесь к администратору системы.'         
      Raise(CreateException("AuthReqSelfRights"; Message; ecWarning))
    else
      //Проверка на наличие прав
      if AccessRights.UserCanWrite(Requester)
        Message = 'У вас уже есть права на изменение документа.'         
        Raise(CreateException("UserReqHaveRights"; Message; ecWarning))  
      else   
        //Учетная запись автора действующая?
        if AuthorState <<>> 'Действующая'
          Message = 'Учетная запись автора документа закрыта.' &
              cr & 'Обратитесь к администратору системы.'         
          Raise(CreateException("AuthorIsClosed"; Message; ecWarning))  
        else
          //Запрос причины
          ReasonDialog = InputDialogEx('*Причина запроса';'';'String:200';
                                       'Запрос прав на документ';;;;
                                       'Отправить|Отмена';'Отправить';'Отмена';
                                       'Запрос прав на документ';;;)
          Cancel = FindSubString('Отмена'; ReasonDialog; '|')     
          //Проверяем на результат "Отмена"      
          if Cancel = 0
            ReasonText = Replace(ReasonDialog; '|Отправить'; '')
            //Создание и отправка задачи
            Task = Tasks.CreateNew()
            Task.Subject = Subject
            Task.ActiveText = 'Причина запроса: ' & cr & ReasonText
            RouteStep = Tasks.CreateRouteStep(1; Doc.Author; jkJob; Today(); ''; )
            Task.Route.Add(RouteStep)
            Task.GetAttachments(true).Add(Doc)
            TaskStart = true
            if TaskStart
              try
                Task.Start
              except
                Task.Cancel
              endexcept
            else
              Task.Save
            endif        
          endif
        endif
      endif
    endif
  endif  

 

11
Авторизуйтесь, чтобы оценить материал.
4
Кирилл Ревенков

Очень полезный сценарий, спасибо! 

Но что делать, если документ был создан системной учеткой, например, при регистрации через ЭП?

Константин Дудкин

Кирилл, спасибо, не предусмотрел такой вариант.

В итоге добавил проверку на авторство тремя учетными записями (dbo (он же sa), ISBuilderSystem, Administrator) и проверку на состояние учетной записи автора (Действующая, Закрытая)

Не уверен, что редактирование статьи не приведет к её переходу в рецензирование, потому вот код:       

  Doc = Object.Info
  Requester = ServiceFactory.GetUserByName(CurrentUserName())
  AccessRights = Object.AccessRights
  Subject = 'Запрос прав доступа от ' & 
             Requester.FullName & ' на документ "' & Doc.Name & '"'
  SystemAcc1 = "dbo"
  SystemAcc2 = "Administrator"
  SystemAcc3 = "ISBuilderSystem"  
  AuthorState = References.SYSREF_USERS_REFERENCE.GetObjectByID(Doc.Author.ID).SYSREQ_STATE

  //Проверка на авторство системы     
  if Doc.Author.Name == SystemAcc1 or 
       Doc.Author.Name == SystemAcc2 or 
         Doc.Author.Name == SystemAcc3
    Message = 'Данный документ создан системой.' &
            cr & 'Обратитесь к администратору.'         
    Raise(CreateException("AuthIsSystem"; Message; ecWarning))
  else
    //Проверка на автора     
    if Doc.Author.Code == Requester.Code
      Message = 'Вы не можете запросить права, т.к. являетесь автором документа.' &
              cr & 'Если права отсутствуют, обратитесь к администратору системы.'         
      Raise(CreateException("AuthReqSelfRights"; Message; ecWarning))
    else
      //Проверка на наличие прав
      if AccessRights.UserCanWrite(Requester)
        Message = 'У вас уже есть права на изменение документа.'         
        Raise(CreateException("UserReqHaveRights"; Message; ecWarning))  
      else   
        //Учетная запись автора действующая?
        if AuthorState <<>> 'Действующая'
          Message = 'Учетная запись автора документа закрыта.' &
              cr & 'Обратитесь к администратору системы.'         
          Raise(CreateException("AuthorIsClosed"; Message; ecWarning))  
        else
          //Запрос причины
          ReasonDialog = InputDialogEx('*Причина запроса';'';'String:200';
                                       'Запрос прав на документ';;;;
                                       'Отправить|Отмена';'Отправить';'Отмена';
                                       'Запрос прав на документ';;;)
          Cancel = FindSubString('Отмена'; ReasonDialog; '|')     
          //Проверяем на результат "Отмена"      
          if Cancel = 0
            ReasonText = Replace(ReasonDialog; '|Отправить'; '')
            //Создание и отправка задачи
            Task = Tasks.CreateNew()
            Task.Subject = Subject
            Task.ActiveText = 'Причина запроса: ' & cr & ReasonText
            RouteStep = Tasks.CreateRouteStep(1; Doc.Author; jkJob; Today(); ''; )
            Task.Route.Add(RouteStep)
            Task.GetAttachments(true).Add(Doc)
            TaskStart = true
            if TaskStart
              try
                Task.Start
              except
                Task.Cancel
              endexcept
            else
              Task.Save
            endif        
          endif
        endif
      endif
    endif
  endif    

 

Константин Дудкин: обновлено 20.12.2017 в 06:39
Константин Дудкин: обновлено 20.12.2017 в 06:39
Елена Питомцева

Константин, может править саму статью.

Марина Котусева

Очень круто!

Андрей Клоков

Добавлю несколько кейсов:

1. Учетка у автора может быть и открыта, но он уже не имеет полных прав. А права имеет другой ответственный за документ. 

2. Учетка у автора закрыта и полные права у кого либо другого, кто может мне их выдать, но судя по всему процесс останавливается.

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

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