Данный функционал был внедрен в разгар пандемии, и потом остался как возможность информирования сотрудников при необходимости о зарегистрированных документах в системе документооборота для работы с ними или ознакомления. Данный функционал позволяет решать 2 основные задачи:
Для корректности функционирования необходимо, чтобы у каждого сотрудника в справочнике "Работники" было заполнено поле "Рабочий емайл". Документы, зарегистрированные в системе, можно отправлять сотрудникам, которые не автоматизированы в системе при наличии карточки работника.
Делопроизводитель при регистрации документа помимо штатных возможностей отправки документа посредством задач и заданий на ознакомление и исполнение, может отправить документ для работы на электронную почту:
При наличии у документа электронной подписи(ЭП), в отправляемое письмо будет добавлен документ с отсоединенной электронной подписью в виде вложений. Если ЭП у документа нет, или документ подписан живой подписью, то в формируемое письмо будет вложен скан оригинала документа.
Неполный вариант 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
Спасибо за внимание.
Авторизуйтесь, чтобы написать комментарий