Задачку так и не решил. Писал в IBM, отправлял логи, ничего.
Может кто-то разбирается глубоко в вопросе? Может быть механизм подписи поменять и поможет?
Вообщем, готов заплатить за решение задачки. Подробности в личке.
[doublepost=1488969867,1488898277][/doublepost]Вообщем, разобрался.
Был у меня такой код. Взялся он откуда не знаю, но может и с форума:
Код:
Public Class SignatureDocument
Private session As NotesSession
Private curdb As NotesDatabase
Private item As NotesItem
Private debugMode As String
Private Log As NotesStream
Sub New ()
Set Me.session = New NotesSession
Set Me.curdb = Me.session.currentDatabase
End Sub
Public Sub sign(doc As NotesDocument)
'Подписать
Dim dialog As NotesDocument
fields = doc.GetItemValue("dspSignedFields" )
Set dialog = Me.curdb.createDocument
Call dialog.replaceItemValue("SaveOptions", "0")
ForAll fname In fields
If Not fname = "Signer" Then
Call Me.copyItemToDialogDoc(doc, dialog, CStr(fname))
End If
End ForAll
Set item = dialog.replaceItemValue("Signer" , Me.signer)
item.IsSigned = True
Set item = dialog.replaceItemValue("SignedFields" , doc.GetItemValue("dspSignedFields" ))
item.IsSigned = True
Set item = dialog.replaceItemValue("$signed" , Now())
item.IsSigned = True
Call dialog.Sign()
If dialog.HasItem("$Signature") Then
Set item = dialog.GetFirstItem("$Signature")
Call item.CopyItemToDocument(doc, "$Signature1" )
Set item = doc.replaceItemValue("Signer" , dialog.GetItemValue("Signer" ))
Set item = doc.replaceItemValue("SignedFields" , dialog.GetItemValue("SignedFields" ))
Set item = dialog.GetFirstItem("$signed" )
Call item.CopyItemToDocument(doc, "$signed" )
Else
Print "Нет поля $Signature"
End If
End Sub
Private Sub copyItemToDialogDoc(doc As NotesDocument, dialog As NotesDocument, fname As String)
If Not doc.hasItem(fname) Then Exit Sub
Set item = doc.GetFirstItem(fname)
Call item.CopyItemToDocument(dialog, fname)
Set item = dialog.GetFirstItem(fname)
item.IsSigned = True
End Sub
Private Function signer As Variant
Dim usernamelist As Variant
usernamelist = Me.session.usernameList
Dim v As Variant
Dim ub%
If UBound(usernamelist) > 0 Then ub% = 1 Else ub% = 0
ReDim v(ub%)
v(0) = usernamelist(0).canonical
If ub% = 1 Then v(1) = usernamelist(1).canonical
signer = v
End Function
Public function verifySign(doc As NotesDocument) As Boolean
verifySign=false
Dim dialog As NotesDocument
fields = doc.GetItemValue("SignedFields" )
Set dialog = Me.curdb.createDocument
Call dialog.replaceItemValue("SaveOptions", "0")
ForAll fname In fields
Call copyItemToDialogDoc(doc, dialog, CStr(fname))
End ForAll
Set item = dialog.replaceItemValue("Signer" , doc.getItemValue("Signer" ))
item.IsSigned = True
Set item = dialog.replaceItemValue("SignedFields" , doc.getItemValue("signedFields" ))
item.IsSigned = True
Set item = dialog.replaceItemValue("$signed" , doc.getItemValue("$signed" ))
item.IsSigned = True
Set item = doc.GetFirstItem("$Signature1" )
Call item.CopyItemToDocument(dialog, "$Signature")
If dialog.IsSigned Then
If dialog.Signer = "" then Exit function
Dim nam As NotesName
Set nam = Me.session.CreateName(dialog.Signer)
verifySign=true
Else
End If
End function
End Class
И как раз в некоторых случаях код давал signer="" без какой-то логики.
Я решил пойти сначала, и сделал простой код подписи документа целиком.
Код:
Sub Click(Source As Button)
Dim ws As New NotesUIWorkspace
Dim doc As NotesDocument
Set doc=ws.CurrentDocument.Document
Call doc.Sign
Call doc.Save(True,False)
End Sub
Проверил на проблемной машине таким кодом
Код:
Sub Click(Source As Button)
Dim ws As New NotesUIWorkspace
Dim doc As NotesDocument
Set doc=ws.CurrentDocument.Document
Print doc.Signer
End Sub
Без проблем все сработало как надо, возвращается подписант.
Соответственно, если документ пересохраняется, то signer возвращает пустое значение.
Однако, есть проблемка. Если собакоагентом присвоить значение поля какое-то в док, то подпись не слетает.
Лечится тем, что у поля надо указать свойство на 3-й закладке: sign if mailed or saved in section.
Вообщем, для многих эта инфа уже очевидная, но решил написать. Главное, не мудрить, там где это не надо