Записная книжка разработчика. Отправка зарегистрированного документа из РКК на почту

4 0

Данный функционал был внедрен в разгар пандемии, и потом остался как возможность информирования сотрудников при необходимости о зарегистрированных документах в системе документооборота для работы с ними или ознакомления. Данный функционал позволяет решать 2 основные задачи:

  1. Ознакомление\работа с зарегистрированным документом при нахождении вне рабочего места.
  2. Отправка зарегистрированного исходящего документа непосредственно корреспонденту напрямую из Directum.

Для корректности функционирования необходимо, чтобы у каждого сотрудника в справочнике "Работники" было заполнено поле "Рабочий  емайл".  Документы, зарегистрированные в системе, можно отправлять сотрудникам, которые не автоматизированы в системе при наличии карточки работника.

Делопроизводитель при регистрации документа помимо штатных возможностей отправки документа посредством задач и заданий на ознакомление и исполнение, может отправить документ для работы на электронную почту: 

  • Если документ  зарегистрирован в журнале  "Внутренние РКК" - по списку рассылки документа.
  • Если документ зарегистрирован в журнале "Исходящие РКК" - корреспонденту документа.
  • Если документ зарегистрирован в журнале "Входящие РКК" - адресату документа. 

При наличии у документа электронной подписи(ЭП), в отправляемое письмо  будет добавлен документ с отсоединенной электронной подписью в виде вложений. Если ЭП у документа нет, или документ подписан живой подписью, то в формируемое письмо будет вложен скан оригинала документа.

Неполный вариант c комментариями:

  BoundEDocumentsSearchDescr = Searches.Load("BOUND_EDOCUMENT_SEARCH")
  // Найти связанные документы
  BoundEDocumentsSearchDescr.InitializeSearch(Object.Info)
  EDocumentList = BoundEDocumentsSearchDescr.Execute 
  // Список документов
  DocIDList = CreateStringList()
  // Список имен файлов
  DocFileNameList = CreateStringList()
  // Список имен документов 
  DocNameList = CreateStringList()
  Search = Searches.Load('EDOCUMENT_SEARCH')                               
  // Сформировать условия поиска документов, которые связаны с РКК
  foreach EDocument in EDocumentList
    DocIDList.Add(EDocument.ID)
    EDoc = EDocuments.GetObjectByID(EDocument.ID)
    // Версия документа
    VersionNumber = GetLastActiveEDocumentVersionNum(EDoc)
    // Текущая версия документа
    CurrentVersion = EDoc.Versions.ValueByName(VersionNumber)
    // Получение информации о документе
    EDocInfo=EDocuments.ObjectInfo(EDocument.ID)
         
    // Определить расширение файла и перевести в нижний регистр
    CheckExtension = LowerCase(EDoc.Info.Editor.Extension)
  
    // Имя основного файла. Можно сформировать по имени или ID документа
    // FileName = GetTempFolder() & '\' &EDocument.ID& '.' &CheckExtension
    FileName = GetTempFolder() & ClearFileName(EDoc.SYSREQ_EDOC_NAME) & '.' &CheckExtension

    // Имя файла с приклепленной подписью в формате ESD
    // FileNameESD = GetTempFolder() &EDocument.ID& '.' &CheckExtension   
    FileNameESD = GetTempFolder() & ClearFileName(EDoc.SYSREQ_EDOC_NAME)& '.' &CheckExtension
      
    // Имя файла формируемой отсоединенной цифровой подписи     
    FileNamesigOrig = FileNameESD & '.sig'
          
    //Проверка на подписанность документа
   
    if EDocInfo.Signed
  
    //Получаем версию документа, которая подписана ЭП.
    //Данный блок можно удалить или оставить на усмотрение.
    //Дополнительная проверка не помешает.                
    //Можно обойтись и без поиска версии документа, которая подписана
    //В полной версии сценария это код присутствует
   
    // экспорт документа ESD  
    EDoc.Export(VersionNumber; FileNameESD; False; False; True;;)
    ESDDoc = CreateObject('MSXML.DOMDocument') 
    ESDDoc.Load(FileNameESD) 
    Root = ESDDoc.DocumentElement
    DeleteFile(FileNameESD)
    SignaturesNode = Root.SelectSingleNode('DigitalSignatures') 
    SignNodeCount = SignaturesNode.ChildNodes.length 
    I = 0
      while I < SignNodeCount
        SignNode = SignaturesNode.ChildNodes.Item(I)
        DataNode = SignNode.ChildNodes.Item(1)
        WriteFile(FileNamesigOrig;; DataNode.Text)
        I = I + 1
        Reslt = 1
    endwhile    
      
      DocFileNameList.Add(FileNamesigOrig)
      EDoc.Export(VersionNumber; FileName; False; False;;;)
    else

 // Если у документа нет подписанной версии, то просто добавляем  документ без подписи
      EDoc.Export(VersionNumber; FileName; False; False;;;)
    endif
     
           
   // Добавить путь до документа в отдельный список для функции MailSend    
   // DocFileNameList.Add(FileName)

    DocFileNameList.Add(FileName)
    DocNameList.Add(EDocument.Name) 
   
  endforeach
      
 // Проверить кол-во документов, если 0, то уведомляем пользователя  
  if DocIDList.Count == 0 
    ShowMessage("Документы не найдены, загрузите документы")
    Exit()
  endif  

  // Определить текущего пользователя
  CurrentUser = EDocuments.CurrentUser
  CurrentUserID = CurrentUser.ID
 // Получить код работника по ИД пользователя
   REC_NOT_EXIST = 0
   FIRST_WORKER_INDEX = 0
   EmployeeCodeList = GetEmployeesByUserID(CurrentUserID)
                  
  if EmployeeCodeList.Count > REC_NOT_EXIST
    EmployeeCode = EmployeeCodeList.Values(FIRST_WORKER_INDEX)
    EmployeesReference = CreateCachedReference("РАБ"; FALSE)
    EmployeesReference.Open
  if EmployeesReference.Locate(SYSREQ_CODE; EmployeeCode)    
      EmployeeCode = EmployeesReference.SYSREQ_CODE
   endif 
   else
    UsersReference = CreateCachedReference("ПОЛ"; FALSE)
    UsersReference.Open
    if UsersReference.Locate(SYSREQ_ID; CurrentUserID)    
      EmployeeCode = UsersReference.Код
   endif 
  endif   

  // Получить e-mail и ФИО текущего пользователя
  EmployeeReqList = GetRequisitesValues("РАБ"; EmployeeCode; 
  ArrayOf("Строка2";"Дополнение");ArrayOf("S"; "S"))
  EmployeeName = EmployeeReqList[1]
  EmployeeEmail = EmployeeReqList[0]
  // Создать список рассылки
  ToIStringList = CreateStringList()
  // Создать список для раздела
  EmployeeDDSList = CreateStringList()  
  Subject = ""
  Text = ""
  // Получить наименования вложенных документов
  DocString = ""
  foreach Doc in DocNameList
    DocString = DocString & Doc & CR
  endforeach 

//Внутренние РКК
  if Object.ViewName == 'InnerRRC'
    ReqDS = Object.DetailDataSet(3)
    // Тема сообщения
    Subject = 'Зарегистрирован внутренний документ в системе Directum: '& DocString
    // Текст сообщения
    Text = 'Вы являетесь получателем данного документа по списку рассылки. Ознакомтесь с поступившими документами:' & CR & DocString 
    if ReqDS.RecordCount > 0
        ReqDS.First
        while not ReqDS.EOF
          // Получить список содержащий почту и имя адресата
          EmployeeDDSList = GetRequisitesValues("РАБ"; ReqDS.РаботникТ3; ArrayOf("Строка2";"Дополнение");ArrayOf("S"; "S"))
          EmployeeDDSEmail = EmployeeDDSList[0]
          ToIStringList.Add(EmployeeDDSEmail)
          ReqDS.Next
        endwhile
    else
      ShowMessage("Не заполнен список рассылки документа в РКК!")
      Exit()        
    endif
  endif
  
  ReqDS = nil
// Отправить письмо
  DocFileNameList.Delimiter = ";"  
  DocMailList = DocFileNameList.DelimitedText 
// Список рассылки
  ToIStringList.Delimiter = ";"  
  ToIMailList = ToIStringList.DelimitedText 
  ПЧТОтправитьПисьмо(ToIMailList;;; Subject; Text;;DocMailList;) 
  ShowMessage("Документы обработаны" & CR & "Письмо успешно отправлено")

При отправке документа из справочника "Внутренние РКК" и "Входящие  РКК" используется поле "Рабочий  емайл", которое уже есть в качестве реквизита в карточке, и нужно только его заполнить. А вот при отправке документа корреспонденту из "Исходящих РКК", такого поля нет.  

Для решения необходимо сгенерировать(создать) новый реквизит  в справочнике "Реквизиты справочников", например со следующими параметрами: 

Для использования в данном сценарии данный реквизит добавить на карточку в справочнике "Организации":

При заполнении(редактировании) можно указать в карточке официальный адрес почты и через данный сценарий отправлять зарегистрированную  исходящую корреспонденцию  в адрес данной организации. 

У нас такой способ применяется при отправке ответов на запросы о факте обучения, о подлинности диплома и т.д. и т.п. при направлении частному лицу и как вариант организациям при необходимости. Если  корреспонденту нужен бумажный вариант, то  ответ направляется по обычной почте.

Для удобства работы делопроизводителя создаем действие в  "Типы справочников - РКК", выносим на ленту кнопочку, например так: 


Пример письма, которое получает корреспондент\адресат: 


Полная версия: ExportMailDocument.txt

Спасибо за внимание.

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

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