Для интереса решил подписать дизайн сервером и при всех условиях, на которых работало железно (блокировка EffectiveUserName, нет галки "Enforcing a consistent access control"), получил на сервере Err=4000:
Notes error: You cannot update or delete the document(s) since you are not listed as an allowable Author for this document
она же:
Вы не можете обновлять и удалять документы, так как не входите в список авторов
Сильно удивился, т.к. до сих пор были известны такие причины её возникновения:
1. Нет прав на изменение (NotesDocument.Save) документа (пользователя нет в полях типа Authors).
2. При попытке блокировки сервером:
• сервер реально не имеет права на обработку документа (см. п.1); случается крайне редко.
• при попытке блокировать с помощью NS.UserName.
• при использовании в БД общего ACL (стоит галка "Enforcing a consistent access control").
Код:
Class Locker
'...
'кем будем пытаться заблокировать
Private m_arrLockers() As String
'...
%REM
Sub setLockers
Description: установка списка блокировщиков
%END REM
Private Sub setLockers()
Dim ns As New NotesSession
ReDim Me.m_arrLockers(1)
Me.m_arrLockers(0) = ns.EffectiveUserName
Me.m_arrLockers(1) = Join(Evaluate(|@Unique|)) '"ID" текущего процесса
End Sub
%REM
Function lockDoc
Description: штатная блокировка
%END REM
Private Function lockDoc() As Boolean
If Not Me.IsLocked() Then
Call Me.m_ndSource.Lock(Me.m_arrLockers)
Me.lockDoc = Me.IsLocked()
End If
End Function
'...
End Class
Сервер, естественно, Manager.
Уже и добавлял его куда только можно на закладке Security документа сервера - бесполезно.
После разбирательств добавилась ещё одна причина в п.2:
• при соблюдении всех вышеуказанных условий ошибка вылетает на документах, в которых вообще нет READERS/AUTHORS-item'ов, при попытке записи дополнительного значения в списке блокировщиков, не находящегося в АК сервера, и когда EffectiveUserName (кем подписан дизайн) = UserName (запустивший агент, т.е. сервер).
<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">Рабочий код (фактически обход такой ситуации, т.к. по другому не выходит)</div></div><div class="sp-body"><div class="sp-content">
Код:
Private Sub setLockers()
Dim ns As New NotesSession
If ns.IsOnServer Then
If ns.EffectiveUserName = ns.UserName Then
'Ненормальная ситуация: кем_подписан_дизайн = сервер_запустивший_агент
ReDim Me.m_arrLockers(0)
Me.m_arrLockers(0) = ns.EffectiveUserName
Exit Sub
End If
End If
ReDim Me.m_arrLockers(1)
Me.m_arrLockers(0) = ns.EffectiveUserName
Me.m_arrLockers(1) = Join(Evaluate(|@Unique|)) '"ID" текущего процесса
End Sub
Т.е. при подписании дизайна сервером, невозможно указать и, соответственно, определить текущим ли процессом заблокирован документ или нет.
Получили ещё один минус и ограничение по использованию такого решения.