Сообщение создается в типовом маршруте Исполнение поручения на блоке «Пауза».
Структура обработчика отправки
1. | Получить запись справочника поручения. ИД записи хранится в параметрах процесса, добавляется в параметры в момент создания межсистемного процесса. |
2. | Подготовить список для передаваемых данных справочника. |
3. | Заполнить список данными. Передать необходимые реквизиты по поручению и список исполнителей, которые относятся к системе-приемнику. |
4. | Сохранить подготовленные данные справочника в сообщении. |
5. | Если у поручения есть основной документ, подготовить список с его реквизитами. По умолчанию передаются следующие реквизиты документа: глобальный ИД, наименование, имя вида документа, имя типа карточки документа, расширение приложения-редактора. |
При исполнении поручения передается документ с типом карточки «Письма входящие», поэтому требуется дополнительно передать список обязательных реквизитов этого типа карточки.
Document = EDocuments.GetObjectByID(DocumentID)
DocumentGUID = DCIGetGlobalID(Document)
DocumentInfo = Document.Info
// Подготовить для передачи список реквизитов согласуемого документа.
AdditionalReq = ''
if DocumentInfo.EDocKind.Name == 'Письмо входящее'
AdditionalReq = 'Дополнение|Дата4|Организация|Дополнение3'
endif
DocumentData = DCICreateDocumentMetaDataWithReq(DocumentInfo; AdditionalReq)
6. | Сохранить подготовленные данные документа в сообщении. |
// Сохранить подготовленные данные документа в сообщении.
DCIAttachDataToProcessMessage(ProcessMessage; DocumentData; "DocumentData")
7. | Выгрузить тело документа в сообщение. |
// Прикрепить к сообщению версию документа.
DCIAttachDocumentToProcessMessage(ProcessMessage; "VersionFile"; Document.Info)
8. | Подготовить данные и вложить в сообщение информацию по дополнительным документам, если они есть во вложениях задачи. Вычисления аналогичны вычислениям по основному документу. |
Данные о записях справочников и документах рекомендуется добавлять в разные списки и выгружать отдельными файлами.
Структура обработчика приема
1. | Считать из сообщения данные переданной записи. |
2. | Создать новую запись в справочнике Поручения. |
Примечание
Всегда создается новая запись, так как нельзя повторно отправить поручение на исполнение.
3. | Заполнить реквизиты записи переданными данными. |
4. | Сохранить запись. |
5. | Импортировать основной документ, заполнить реквизиты документа. |
// Импортировать основной документ, если передали
Document = ''
if ProcessMessage.Files.IndexOfName("DocumentData") > -1
DocumentData = DCIGetDataFromProcessMessage(ProcessMessage; "DocumentData")
EDocTypeName = DocumentData.ValueByName("EDocType")
EDocKindName = DocumentData.ValueByName("EDocKind")
EDocTitle = DocumentData.ValueByName("DocumentTitle")
DocumentGUID = DocumentData.ValueByName("DocumentGUID")
// Найти коды вида и типа карточки для основного документа.
try
EDocKindCode = DCIFindRecordReference(
SYSREF_EDOCUMENT_KINDS; SYSREQ_NAME; EDocKindName;
LoadStringFmt('E_EDOC_KIND_NOT_FOUND'; 'DCIEXAMPLE'; EDocKindName))
EDocTypeCode = DCIFindRecordReference(
SYSREF_EDOCUMENT_CARD_TYPES_REFERENCE; SYSREQ_NAME; EDocTypeName;
LoadStringFmt('E_EDOC_CARD_TYPE_NOT_FOUND'; 'DCIEXAMPLE'; EDocTypeName))
except
Exception = GetLastException()
DCIWriteHandlerLog("ERROR"; "Ошибка при поиске вида и типа карточки";
ProcessMessage; Exception.Message)
Raise(Exception)
endexcept
Document: IEDocument = DCIImportDocumentFromProcessMessage(
ProcessMessage; "VersionFile"; "Принят из " & ProcessMessage.Sender;
EDocTypeCode; EDocKindCode)
Document.SYSREQ_EDOC_NAME = EDocTitle
AdditionalReq = DocumentData.ValueByName('Additional')
if not VarIsNull(AdditionalReq)
I = 0
while not AdditionalReq.EOF
// Для реквизита «Корреспондент» найти организацию по наименованию.
if AdditionalReq.GetNames(I) == 'Организация'
OrganisationName = AdditionalReq.GetValues(I)
Document.Requisites(AdditionalReq.GetNames(I)).Value =
DCIFindRecordReference('ОРГ'; SYSREQ_NAME; OrganisationName;
LoadStringFmt('DIRDCI_NOT_FOUND_ORGANIZATION_MESSAGE';
'DCIEXAMPLE'; OrganisationName))
else
if AdditionalReq.GetNames(I) == 'Дата4'
Document.Requisites(AdditionalReq.GetNames(I)).Value =
DCIUTCStrToLocalTime(AdditionalReq.GetValues(I))
else
Document.Requisites(AdditionalReq.GetNames(I)).Value =
AdditionalReq.GetValues(I)
endif
endif
I = I +1
AdditionalReq.Next
endwhile
endif
Document.Save()
DCIWriteHandlerLog("DEBUG"; "Изменения в карточке документа cохранены";
ProcessMessage)
// Указать основной документ в поручении.
Assignment.ISBIntNumber = Document.ID
endif
6. | Импортировать дополнительные документы. Вычисления аналогичны вычислениям по импорту основного документа. |
7. | Заблокировать процесс и записать ИД поручения в параметры процесса. |
try
Process.Lock()
// Обновить параметры процесса
ProcessParams = Process.Params
ProcessParams.SetVar("AssignmentID"; ToString(Assignment.ID))
Process.Save()
finally
Process.Unlock()
endfinally
8. | Стартовать задачу на исполнение поручений, записав в параметры ИД межсистемного процесса. |
© Компания Directum, 2020 | Сообщество пользователей Directum |