Каждый разработчик рано или поздно сталкивался с необходимостью контроля возможности подписания любым типом подписи определенных документов. В данной статье я упомяну возможные способы контроля и углублюсь в кастомайзинг.
Итак, если вы хотите контролировать право подписи то это можно сделать следующими способами.
1. Право подписи вида электронного документа - администраторская мера, поэтому она нам не интересна.
2. Регулировка права подписи с помощью назначения/отбора прав на изменение. Мера вынужденная, сотворяющая для разработчика кучу лишних проблемм, т.к. права влияют на все и вся. Кроме того, эта мера не действенна на хитрых индивидов, которые замещают других всевластных индивидов, т.к. действует наследование прав по замещению.
3. Как описано ниже.
Предыстория:
Жил был сервер, жил он не тужил, пока не стал главным и не обнаружил что есть еще и вторичный. Все бы было хорошо, если бы пользователи главного документы не подписывали одновременно с пользователями вторичного. И началось время смутное - конфликтное. И стали подписи в решенных конфликтных ситуация недействительные.
Почему?
Подпись документа содержит в себе информацию о предыдущих подписях. На разных серверах подписи проставлялись одновременно, в каждую из них зашилась информация только о предках с родного сервера. Поэтому в результате подписи становятся недействительными.
Что делать?
Подписывать на каждом из сервером последовательно. А как отобрать права подписи сначало у пользователей одного сервера, потому у пользователей другого сервера, с учетом, того что необходимо вносить изменения в документ, и пользователя одного сервера может замещать пользователь с другого сервера.
Как?
Существует компонента содержащая подписи документов. Ознакомится с ней можно поместив следующий код на событие "Сохранание до" типа карточки электронного документа. И пересохранив подписанный документ с соответствующим типом карточки.
Component = References.EDOCUMENT_SIGNATURE.GetComponent
CompDataSet = Component.DataSet
AddWhereID = CompDataSet.AddWhere(Format("%s.%s = %s";ArrayOf(Component.TableName; Component.Requisites('EDocumentID').SQLFieldName; Object.ID)))
CompDataSet.open
RecordCount = CompDataSet.RecordCount
CompDataSet.First
while not CompDataSet.EOF
CompDataSet.OpenRecord
RequisteValuesList = Component.RequisiteValues
Count = RequisteValuesList.Count
i = 0
while i <= Count - 1
Showmessage(RequisteValuesList.Names(i))
Showmessage(CompDataSet.Requisites(RequisteValuesList.Names(i)).AsString)
i = i + 1
endwhile
CompDataSet.Next
endwhile
CompDataSet.Close
CompDataSet.DelWhere(AddWhereID)
Данная компонента, как мы только что убедились, содержит список подписей для версий подписанных документов. Соответственно идея достаточно простая: "Если пользователь сохраняет документ и количество подписей этого документа увеличилось, а пользователю подписывать нельзя, то необходимо его отчитать и откатить изменения".
Непонял, что?
- Поместить на документ реквизит типа целое число для хранения количества подписей документа. Например: "Ссылка3"
- Заполнить во всех существующих документах данный реквизит, подсчитав количество подписей, да побыстрей:
Search = Searches.CreateNew(ckEdocument)
SearchCriteria = Search.SearchCriteria
SearchCriterion = SearchCriteria.Add('PseudoEDocType')
SearchCriterion.SetSimpleValue(CARD_TYPE_CODE)
Contents = Search.Execute
foreach DocumentInfo in Contents
Document = DocumentInfo.Document
Document.Events.AddCheckPoint
Document.Events.DisableAll
Component = References.EDOCUMENT_SIGNATURE.GetComponent
CompDataSet = Component.DataSet
AddWhereID = CompDataSet.AddWhere(Format("%s.%s = %s";ArrayOf(CompDataSet.TableName; CompDataSet.Requisites('EDocumentID').SQLFieldName; Document.ID)))
CompDataSet.open
RecordCount = CompDataSet.RecordCount
Document.Ссылка3 = RecordCount
CompDataSet.Close
CompDataSet.DelWhere(AddWhereID)
Document.Save
Document.Events.ReleaseCheckPoint
endforeach
- Проверять, на событии ТКЭД "Сохранение до", можно ли текущему пользователю подписывать:
Component = References.EDOCUMENT_SIGNATURE.GetComponent
CompDataSet = Component.DataSet
AddWhereID = CompDataSet.AddWhere(Format("%s.%s = %s";ArrayOf(Component.TableName; Component.Requisites('EDocumentID').SQLFieldName; Object.ID)))
CompDataSet.open
RecordCount = CompDataSet.RecordCount
LastRecordCount = Object.Ссылка3
if Assigned(LastRecordCount)
CurrentUserName = Application.Connection.UserName
if LastRecordCount <> RecordCount and CurrentUserName == 'Administrator'
Raise(CreateException(''; 'Подпись данного документа, вам Владимир Владимирович, на текущий момент запрещена'; ecWarning))
endif
endif
CompDataSet.Close
CompDataSet.DelWhere(AddWhereID)
Таким образом, если неугодный пользователь захочет подписать документ, он получит сообщение:
На этом все. Выражаю благодарность за помощь в подготовке материала Степану Мурашову.
Авторизуйтесь, чтобы написать комментарий