"Запретить, нельзя подписывать" или "Запретить нельзя, подписывать"

11 6

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

Итак, если вы хотите контролировать право подписи то это можно сделать следующими способами.

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)

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

 На этом все. Выражаю благодарность за помощь в подготовке материала Степану Мурашову.

Пока комментариев нет.

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