Предлагаю сообществу небольшой инструмент для решения одной из постоянно всплывающих проблем, а именно отсутствие прав на изменение документа. Решаем ее запуском подзадачи с запросом прав доступа.
Чтобы пользователю было удобно это делать, добавляем прикладное действие в контекстное меню документа.
Далее вкратце:
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) и проверку на состояние учетной записи автора (Действующая, Закрытая)
Не уверен, что редактирование статьи не приведет к её переходу в рецензирование, потому вот код:
Константин, может править саму статью.
Очень круто!
Добавлю несколько кейсов:
1. Учетка у автора может быть и открыта, но он уже не имеет полных прав. А права имеет другой ответственный за документ.
2. Учетка у автора закрыта и полные права у кого либо другого, кто может мне их выдать, но судя по всему процесс останавливается.
Я бы предложил сделать выбор из пользователей с полными правами, кому отправить запрос. В случае, если если такой пользователь один(может так получится, что он и не автор), то отправлять ему задание без диалоговых окон.
Авторизуйтесь, чтобы написать комментарий