%REM
    Function ProverkaForAttach
    Description: Comments for Function
%END REM
Function Proverka_attach(mes As String, namefile As String) As Boolean
    On Error GoTo errh    
    Dim mas_tmp As Variant, item As NotesItem, ws As New NotesUIWorkspace, dc As NotesDocumentCollection
    Dim i As Integer, view As NotesView, tmp As String, sep As String, b As Boolean, c_files_ext As string
    Dim rtitemA As Variant, idx As Variant, oname As String, mas() As String, picklist As Variant
    Proverka_attach=True    
    pars_template="0"
    If Not L_doc.HasEmbedded Then    mes="Нет вложений в документе!." : Error 1000        
    ' Индивидуальные значения для организации
    Set view = L_db.GetView ("reg" )
    Set doc_reg = view.GetFirstDocument
    If doc_reg Is Nothing Then mes="Нет доступа к настройкам регистрации!" :  Error 1000    
    
    'выбор шаблона по которому будем формировать
    Set view = L_db.GetView("searchtemplates")    
        
    picklist = ws.PickListStrings(PICKLIST_CUSTOM,     False, L_db.Server, L_db.FilePath,     "admin_templatesO1",     "Шаблоны", "Выберите шаблон, по которому будем формировать XML:", 2) 
    If IsEmpty(picklist) Then mes="Шаблон не выбран!" :  Error 1000
    
    Set dc = view.GetAllDocumentsByKey(picklist(0), True)
    Set doc_templ = dc.GetFirstDocument()
    If doc_templ Is Nothing Then mes="Не найден документ шаблона": Error 1000
    
    'выбор приложения с которого будем формировать
    Set rtitemA=Nothing
    idx=ArrayGetIndex(doc_templ.name_rekv, "приложение")
    If Not IsNull(idx) Then                
        If doc_templ.items_notes_doc(idx)<>sys_NUL$ Then                    
            Set rtitemA = L_doc.GetFirstItem(doc_templ.items_notes_doc(idx))
        Else
            mes="В документе шаблона не указано поле для приложений." : Error 1000
        End If
    Else
        mes="В документе шаблона не указано поле для приложений." : Error 1000
    End If
    i=0
    If  Not rtitemA Is Nothing Then
        Call rtItemA.update    
        If rtitemA.Type = RICHTEXT Then 
            If Not IsEmpty(rtitemA.EmbeddedObjects) Then
                ForAll empID In c_files_MIME 'собираем список допустимых типов файлов для приложений
                    If c_files_ext$="" Then c_files_ext$=ListTag(empID) Else c_files_ext$=c_files_ext$+", "+Listtag(empID)
                End ForAll      
                ForAll obj In rtitemA.EmbeddedObjects
                    If ( obj.Type = EMBED_ATTACHMENT ) Then   
                        If Not IsElement(c_files_MIME(LCase(StrRightBack(obj.Source , ".")))) Then    'проверим на соответствие типов приложений                            
                            mes="Допустимы приложения в форматах: "+c_files_ext$
                            Error 1000
                        End If                            
                        If LCase(StrRightBack(obj.Source , "."))="docx" Or LCase(StrRightBack(obj.Source , "."))="docm" Then
                            oname$ = Replace_OName(CStr(obj.Source ))
                            ReDim Preserve mas(i)        
                            mas(i)=oname$ 
                            i=i+1
                        End If                    
                    End If                
                End ForAll
            End If
        End If
    Else
        mes="В документе нет итема для приложений." : Error 1000
    End If
    
    If i=0 Then mes="Нет подходящего вложения в документе!." : Error 1000    
    'вывод списка для выбора вложения
    Erase picklist
    picklist = ws.Prompt (PROMPT_OKCANCELLIST, "Выбор приложения", "Выберите приложение из которого необходимо формировать XML.", "", mas)
    If IsEmpty (picklist) Then     mes="Не выбрано приложение для формирования XML!." : Error 1000        
    namefile=picklist
    tmp$="" 
    sep$=""    
    i=0
    'проверяем на обязательность заполнения полей в документе лотус
    ForAll v In doc_templ.flag_obyaz_XML
        If v="1" Then
            If doc_templ.items_notes_doc(i)<>sys_NUL$ Then
                mas_tmp=Split(doc_templ.items_notes_doc(i),sys_sep$)
                b=True
                ForAll v1 In mas_tmp
                    If L_doc.HasItem(v1) Then
                        Set item=L_doc.GetFirstItem(v1)
                        If Trim( item.Text )="" Then b=False:Exit ForAll
                    End If
                End ForAll
                If Not b  Then tmp$=tmp$+sep$+Replace(doc_templ.name_rekv(i),"_"," ") : sep$=", "
            End If                
        End If
        i=i+1
    End ForAll
    If  tmp$<>""Then mes= "Заполните все поля: " + tmp$    :  Error 1000        
ext:
    Exit Function
errh:
    Proverka_attach=False
    If Err<>1000 Then mes="Ошибка пропускной системы " & Error(Err) & " в строке " & Erl    
    Resume ext
End Function
Function Replace_img(mytext  As String) As String 'ищем картинки в тексте и конвертим их в base64
    On Error GoTo ErrH   
    Const sub_dir="doctmp.files"
    Const c_files_ext="jpeg; jpg; png; tif"    'для проверки на типы картинок которые могут быть в тексте
    
    Dim inStream As NotesStream, patchName As String, fileName As String, session As New NotesSession, c_files_MIME List As String
    Dim arr As Variant, L_str As String, R_str As String, plainText As String
    Set inStream=session.Createstream()     
    
    patchName=datpatch+sub_dir
    
    If  Dir$ (patchName,16 )="" Then ' проверка на наличие  папки "doctmp.files", т.к. если в шаблоне в тексте нет картинок, то эта папка не создается
        Replace_img=mytext
        Exit Function
    '    Mkdir datpatch
    '    Mkdir datpatch+"\OUT"
    End If
    
    patchName=patchName+"\"    
    
    fileName = Dir$(patchName, 0)    
    
    If fileName$<>"" Then
        arr=Split(c_files_ext,"; ")
        GoSub const_zapoln                
    End If
    
    Do While fileName$ <> ""
        Print "картинка: "+fileName$
        If Not IsNull(ArrayGetIndex(arr,LCase(StrRightBack(fileName$, "."))))    Then 'проверяем на допустимый тип картинки
%REM
дана подстрока 
<img width=236 height=420 id="Рисунок 1" src="doctmp.files/image001.jpg">
<img width=603 height=190 src="doctmp.files/image001.png" align=left hspace=12>
ее нужно заменить на соответствующий base64 файл
%END REM
        'нужно найти src="doctmp.files/image001.jpg"
            '    If Instr(mytext, {src="}+sub_dir+{/}+fileName$+{">})>0 Then 'если в html файле есть картинка которая есть в директории - то преобразовываем картинку в base64
            If InStr(mytext, {src="}+sub_dir+{/}+fileName$+{"})>0 Then 'если в html файле есть картинка которая есть в директории - то преобразовываем картинку в base64
            '    L_str$=Strleft(mytext, {src="}+sub_dir+{/}+fileName$+{">}) 'вырезали все что до src="doctmp.files/image001.jpg">
                L_str$=StrLeft(mytext, {src="}+sub_dir+{/}+fileName$+{"}) 'вырезали все что до src="doctmp.files/image001.jpg"
                L_str$=StrLeftBack(  L_str$ ,  {<img})                                 'вырезали все что до <img        
            '    R_str$=Strright(mytext, {src="}+sub_dir+{/}+fileName$+{">})        ''вырезали все что после src="doctmp.files/image001.jpg"
                R_str$=StrRight(mytext, {src="}+sub_dir+{/}+fileName$+{"})        ''вырезали все что после src="doctmp.files/image001.jpg"
                R_str$=StrRight(R_str$, {>})        ''вырезали все что после src="doctmp.files/image001.jpg"
                
                Call inStream.Open(patchName & fileName$, "binary")    ' в поток inStream файл        
                Dim b64 As New CBase64()
                plainText$ =  b64.encode (inStream)        
                plainText$=     Replace(plainText$,Chr(10),"") ' удаляем спецсимволы во вложениях
                plainText$=     Replace(plainText$,Chr(9),"")
                plainText$=     Replace(plainText$,Chr(13),"")
                Call inStream.Close
                Kill patchName & fileName$
        'склеиваем результат            
                mytext = L_str$  + {<object }+Replace(c_files_MIME(LCase(StrRightBack(fileName$, "."))),"href","data")
                mytext = mytext + plainText$ +{"></object>} 
                mytext = mytext +R_str$+ Chr(13)                                            
            End If
            
        End If
        fileName$ = Dir$()
    Loop
    Replace_img=mytext
    Exit Function
    
const_zapoln:
    ' https://ru.wikipedia.org/wiki/Список_MIME-типов      -   подсказка
    c_files_MIME("jpeg")    =    {href="data:image/jpeg;base64,}
    c_files_MIME("jpg")    =    {href="data:image/jpeg;base64,}
    c_files_MIME("png")    =    {href="data:image/png;base64,}
    c_files_MIME("tif")        =    {href="data:image/tif;base64,}
    Return
ErrH:    
    Print "Библиотека 'MED_XML' ф-ция 'Replace_img'. Ошибка " & Error(Err) & " в строке " & Erl    
End Function
Function Strclean (mystr As String) As String
    On Error GoTo ErrH
    Dim ascx As String, tmpstr  As String, lenstr As Variant, x As Variant
    tmpstr= ""
    'tmpstr=mystr
    lenstr = Len(mystr)
    'MsgBox mystr
    '%REM
    For x=1 To lenstr 'очищаем от ненужных символов (указываем только те - которые нужны)
        ascx =  Mid$(mystr,x,1) 
'        If (Asc(ascx)>31) And (Asc(ascx)<38) Or ( Asc(ascx)>38 And Asc(ascx)<153) Or (Asc(ascx)>191)  And (Asc(ascx)<256) _
'        Or (Asc(ascx)=171)  Or (Asc(ascx)=187) Or (Asc(ascx)=185) Then        
        If (Asc(ascx)>31 And Asc(ascx)<38) Or ( Asc(ascx)>38 And Asc(ascx)<153) Or (Asc(ascx)>191 And Asc(ascx)<256) _
        Or Asc(ascx)=163 Or Asc(ascx)=165 Or Asc(ascx)=168_
        Or Asc(ascx)=170 Or Asc(ascx)=171 Or Asc(ascx)=175 Or Asc(ascx)=178 Or Asc(ascx)=179_
        Or Asc(ascx)=180 Or (Asc(ascx)>=184 And Asc(ascx)<=187)_
        Or Asc(ascx)=191 Or Asc(ascx)=177 Then                
            tmpstr = tmpstr + ascx
        End If
    Next
    'MsgBox tmpstr    
    '%END REM
    
'HTML символы заменяем (появляются после сохрания в html)   http://_.ascii.cl/htmlcodes.htm
    
    tmpstr = Replace(tmpstr,{quot;},{"})  ' "
    tmpstr = Replace(tmpstr,{amp;},{&})  ' &
    
    tmpstr = Replace(tmpstr,{lt;},{<})  ' <
    tmpstr = Replace(tmpstr,{gt;},{>})  ' >
    
    tmpstr = Replace(tmpstr,{nbsp;},{ })  ' неразрывный пробел
    tmpstr = Replace(tmpstr,{iexcl;},{¡})  
    tmpstr = Replace(tmpstr,{cent;},{¢})  
    tmpstr = Replace(tmpstr,{pound;},{£})  
    tmpstr = Replace(tmpstr,{curren;},{¤})  
    tmpstr = Replace(tmpstr,{yen;},{¥})  
    tmpstr = Replace(tmpstr,{brvbar;},{¦})  
    tmpstr = Replace(tmpstr,{sect;},{§})  
    tmpstr = Replace(tmpstr,{uml;},{¨})  
    tmpstr = Replace(tmpstr,{copy;},{©})  
    tmpstr = Replace(tmpstr,{laquo;},{«})  
    tmpstr = Replace(tmpstr,{reg;},{®})  
    tmpstr = Replace(tmpstr,{macr;},{¯})  
    
    tmpstr = Replace(tmpstr,{euro;},{€})  
    
    tmpstr = Replace(tmpstr,{sup1;},{¹})  ' верхний индекс "один"
    tmpstr = Replace(tmpstr,{sup2;},{²})  
    tmpstr = Replace(tmpstr,{sup3;},{³})  
    
    tmpstr = Replace(tmpstr,{frac14;},{¼})  'дробь - одна четверть
    tmpstr = Replace(tmpstr,{frac12;},{½})  '     дробь - одна вторая
    tmpstr = Replace(tmpstr,{frac34;},{¾})  'дробь - три четверти
    'MsgBox tmpstr    
    'удаляем пустые параграфы
    tmpstr = Replace(tmpstr,{<p><span style="padding:0px 10px;"></span></p>},"") 
    
    'fileNum% = Freefile()
    'Open  "C:\xml\temp.txt" For Append As fileNum%
    'Print # fileNum%, tmpstr
    'Close  fileNum%
    
    'Dim array1(1) As String ' для замены переносов строк в содержании
    'Dim array2(1) As String
    'array1(0) = Chr(13)
    'array1(1) = Chr(9)
    'array2(0) = "</p><p>"
    'array2(1) = {<span style="padding:0px 10px;"></span>}
    'tmpstr = Replace(tmpstr,array1,array2) 
    'tmpstr = "<p>" +  tmpstr + "</p>"
    
    'Msgbox tmpstr
    Strclean  =    tmpstr
    Exit Function
ErrH:
    Print "Библиотека 'MED_XML' ф-ция 'Strclean'. Ошибка " & Error(Err) & " в строке " & Erl    
End Function
Function Strclean2 (mystr As String) As String
    ' для обращения "Уважаемый", отдельная функция, т.к. может быть в ображении две строки с Имя Отчество.
    On Error GoTo ErrH
    Dim ascx As String, tmpstr  As String    
    tmpstr= mystr
    
'HTML символы заменяем (появляются после сохрания в html)   http://_.ascii.cl/htmlcodes.htm
    tmpstr = Replace(tmpstr,{quot;},{"})  ' "
    tmpstr = Replace(tmpstr,{amp;},{&})  ' &
    
    tmpstr = Replace(tmpstr,{lt;},{<})  ' <
    tmpstr = Replace(tmpstr,{gt;},{>})  ' >
    
    tmpstr = Replace(tmpstr,{nbsp;},{ })  ' неразрывный пробел
    tmpstr = Replace(tmpstr,{iexcl;},{¡})  
    tmpstr = Replace(tmpstr,{cent;},{¢})  
    tmpstr = Replace(tmpstr,{pound;},{£})  
    tmpstr = Replace(tmpstr,{curren;},{¤})  
    tmpstr = Replace(tmpstr,{yen;},{¥})  
    tmpstr = Replace(tmpstr,{brvbar;},{¦})  
    tmpstr = Replace(tmpstr,{sect;},{§})  
    tmpstr = Replace(tmpstr,{uml;},{¨})  
    tmpstr = Replace(tmpstr,{copy;},{©})  
    tmpstr = Replace(tmpstr,{laquo;},{«})  
    tmpstr = Replace(tmpstr,{reg;},{®})  
    tmpstr = Replace(tmpstr,{macr;},{¯})  
    
    tmpstr = Replace(tmpstr,{euro;},{€})  
    
    tmpstr = Replace(tmpstr,{sup1;},{¹})  ' верхний индекс "один"
    tmpstr = Replace(tmpstr,{sup2;},{²})  
    tmpstr = Replace(tmpstr,{sup3;},{³})  
    
    tmpstr = Replace(tmpstr,{frac14;},{¼})  'дробь - одна четверть
    tmpstr = Replace(tmpstr,{frac12;},{½})  '     дробь - одна вторая
    tmpstr = Replace(tmpstr,{frac34;},{¾})  'дробь - три четверти
    
    'удаляем пустые параграфы
    tmpstr = Replace(tmpstr,{<p><span style="padding:0px 10px;"></span></p>},"") 
    
    Strclean2  =    tmpstr
    Exit Function
ErrH:
    Print "Библиотека 'MED_XML' ф-ция 'StrClean2'. Ошибка " & Error(Err) & " в строке " & Erl    
End Function