Sub Click(Source As Button)
' я предполагаю, что этот код будет работать по кнопке, на форме текущего документа, куда вставляется шаблон
' (не важно новый или открытый для изменения)
On Error 4091 Resume Next ' чтобы перехватить исключение метода NotesDatabase.GetDocumentByUNID, если унид неверный
Dim ws As New NotesUIWorkspace
Dim s As New NotesSession
Dim templatesDb As NotesDatabase
Dim templateCol As NotesDocumentCollection
Dim templateDoc As NotesDocument
Dim templateAttach As NotesRichTextItem
Dim curuiDoc As NotesUIDocument
Dim newuiDoc As NotesUIDocument
Dim curDoc As NotesDocument
Dim curAttach As NotesRichTextItem
Const templateViewName = "AttachTemplates"
Const templateAttachName = "TemplateAttach"
' пытаемся открыть БД, которая с шаблонами
'Set templatesDb = s.GetDatabase("ServerName", "templatesDb.nsf", False)
' для простоты примера все работает в одной базе, но верхней строкой можно открыть любую БД,
' подставив соотв. значения сервера и пути
Set templatesDb = s.CurrentDatabase
' проверяем открылась ли БД
If Not(templatesDb.IsOpen) Then
Msgbox "Не удалось открыть БД шаблонов!"
Exit Sub
End If
' начинаем работать
' предполагаю, что документ с шаблоном будет выбираться из вида с именем/алиасом "AttachTemplates"
' причем выбираться за один раз будет только один шаблон
Set templateCol = ws.PickListCollection(3, False, templatesDb.Server, templatesDb.FilePath, templateViewName, "Выбор шаблона", "Укажите шаблон")
' если пользователь че-то выбрал, то оно будет в коллекции первым доком, иначе - он отказался
Set templateDoc = templateCol.GetFirstDocument
If templateDoc Is Nothing Then
' is - оператор сравнения объектов, Nothing - спец.объект, аналог NULL/nil
' таким образом мы проверяем содержит ли переменная templateDoc объект документа
Exit Sub
Else
' смотрим, есть ли в выбранном шаблоне поле "TemplateAttach",
' предположительно с вложением, но на наличие вложения мы проверять не станем,
' если надо будет, то см. NotesRichTextNavigator
If templateDoc.HasItem(templateAttachName) Then
Set templateAttach = templateDoc.GetFirstItem(templateAttachName)
' на всякий случай проверим тип поля, но это не обязательно, если код абсолютно наш
If templateAttach.Type = RICHTEXT Then
' теперь инициализируем наш текущий документ
Set curuiDoc = ws.CurrentDocument
Set curDoc = curuiDoc.Document
' теперь вытащим из текущег дока поле "Attach", которое будет получать нужные вложения
If curDoc.HasItem("Attach") Then
Set curAttach = curDoc.GetFirstItem("Attach")
' если в текущем доке есть такой итем и он не RichText, то поступим грубо - убъем нафик
If Not(curAttach.Type = RICHTEXT) Then
Set curAttach = Nothing
Call curDoc.RemoveItem("Attach")
End If
End If
' если после вышепроделанных манипуляций объекта нету, значит такого итема нет в документе, создадим!
If curAttach Is Nothing Then
Set curAttach = curDoc.CreateRichTextItem("Attach")
End If
' итак. у нас есть материалы для обработки!
' скопируем значение поля-шаблона и...
' сделаем финт ушами :)
Call curAttach.AppendRTItem(templateAttach)
Call curAttach.Update
' тут один важный момент! если документ новый, то он не будет иметь привязки к форме!
' поэтому для последующего финта, нужно самому эту привязку организовать
' я предполагаю, что документ, в который копируется шаблон, создается по форме "GetTemplateAttach"
If curDoc.GetItemValue("Form")(0) = "" Then
Call curDoc.ReplaceItemValue("Form", "GetTemplateAttach")
End If
' финт заключается в переоткрытии текущего документа без сохранения!
' очень важный финт и полезный :)
Call ws.EditDocument(True, curDoc)
Call curDoc.ReplaceItemValue("SaveOptions", "0")
Call curuiDoc.Close(True)
Else
Messagebox "Ай! Шаблон поломался..."
End If
Else
Messagebox "Шаблон не содержит ничего интересного :)"
End If
End If
End Sub