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

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  

 

Кирилл Ревенков

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

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

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

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

В итоге добавил проверку на авторство тремя учетными записями (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. Учетка у автора закрыта и полные права у кого либо другого, кто может мне их выдать, но судя по всему процесс останавливается.

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

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