1. Считать из сообщения данные переданной записи.
Считайте данные из сообщения и запишите их в список:
// Считать из сообщения данные переданной записи.
MainRecordData = DCIGetDataFromProcessMessage(ProcessMessage; "MainRecord")
2. Получить глобальный ИД записи.
Чтобы найти изменяемую запись, получите элемент списка, в который записан глобальный ИД записи:
// Получить глобальный ИД записи.
GlobalID = MainRecordData.FindItem("GUID")
3. Найти запись в справочнике по глобальному ИД.
Если запись по глобальному ИД не определена, то ищите ее по другим ключевым реквизитам. Например, по наименованию записи справочника. Если запись не удается найти, то создайте новую запись и присвойте ей переданный глобальный ИД:
// Найти запись в справочнике по глобальному ИД
Record : IReference.RRCAssignments = DCIGetObjectByGlobalID(GlobalID)
// Если запись не найдена, создать ее
if VarIsNull(Record)
Record : IReference.RRCAssignments = References.ReferenceFactory(
'RRCAssignments').CreateNew()
DCIAssignGlobalID(Record; GlobalID)
DCIWriteHandlerLog("DEBUG";
"Создана новая запись справочника. ID: " & Record.SYSREQ_ID;
ProcessMessage)
endif
В карточке вида межсистемного процесса в поле Тип справочника указан справочник Поручения, поэтому тип справочника IReference.RRCAssignments автоматически подставляется в вычисления.
4. Заполнить реквизиты записи переданными данными.
Переберите элементы списка и заполните соответствующие реквизиты переданными значениями. Например:
Record.SYSREQ_NAME = MainRecordData.FindItem("Наименование")
Если передается реквизит типа «Справочник», то по ключевым реквизитам найдите нужную запись и подставьте ее код в значение реквизита.
Если одним из значений является список, то переберите элементы этого вложенного списка и запишите их в детальный раздел справочника.
5. Сохранить запись.
После синхронизации всех реквизитов сохраните запись справочника:
// Сохранить запись.
Record.Save()
DCIWriteHandlerLog("DEBUG"; "Обновлены данные записи справочника " & Record.Name; ProcessMessage)
Постановка задачи Необходимо в системе-приемнике синхронизировать изменения записи справочника Поручения. Программный код
// Получить ProcessMessage ProcessMessage = DCIGetProcessMessage() DCIWriteHandlerLog("DEBUG"; "Начало обработки приема сообщения"; ProcessMessage) // Считать из сообщения данные переданной записи MainRecordData = DCIGetDataFromProcessMessage(ProcessMessage; "MainRecord")
// Получить глобальный ИД записи GUID = MainRecordData.FindItem("GUID") DCIWriteHandlerLog("DEBUG"; "Поиск записи по глобальному ИД"; ProcessMessage)
// Найти запись в справочнике по глобальному ИД Record : IReference.RRCAssignments = DCIGetObjectByGlobalID(GlobalID)
// Установить контекст нашей организации. SetOurFirmContext('ООО')
// Если запись не найдена, создать ее if VarIsNull(Record) Record : IReference.RRCAssignments = References.ReferenceFactory( 'RRCAssignments').CreateNew() DCIAssignGlobalID(Record; GlobalID) DCIWriteHandlerLog("DEBUG"; "Создана новая запись справочника. ID: " & Record.SYSREQ_ID; ProcessMessage) endif
// Заполнить реквизиты записи переданными данными Assignment.Текст = MainRecordData.FindItem("Text")
// Найти работника автора по ФИО. AuthorFIO = MainRecordData.FindItem("Author") Assignment.Employee = DCIFindRecordReference('РАБ'; SYSREQ_NAME; AuthorFIO; Format('Не удалось найти работника с ФИО "%s"^Обратитесь к администратору системы.'; AuthorFIO)) Assignment.Дата2 = UTCToLocalTime(StrToDate(MainRecordData.FindItem("Deadline"); dftDateTime; cltInternal)) Assignment.ControlType = MainRecordData.FindItem("ControlType")
// Найти работника контролера по ФИО. SupervisorFIO = MainRecordData.FindItem("Supervisor") if Assigned(SupervisorFIO) Assignment.Работник = DCIFindRecordReference('РАБ'; SYSREQ_NAME; SupervisorFIO; Format('Не удалось найти работника с ФИО "%s"^Обратитесь к администратору системы.'; SupervisorFIO)) endif
// Заполнить исполнителей в табличной части. AssignmentDDS = Assignment.DetailDataSet(1) Performers : IList = MainRecordData.FindItem("Performers") Num = 0 while not Performers.EOF PerformerData: IList PerformerData = Performers.Values(Num) AssignmentDDS.Append // Найти подразделение по наименованию DepartmentName = PerformerData.FindItem("Department") AssignmentDDS.ПодразделениеТ = DCIFindRecordReference('ПОД'; SYSREQ_NAME; DepartmentName; Format('Не удалось найти подразделение с наименованием "%s"^Обратитесь к администратору системы.'; DepartmentName)) // Найти работника по ФИО и Подразделению. PerformerFIO = PerformerData.FindItem("Performer") AssignmentDDS.PerformerT = DCIFindRecordReference('РАБ'; ArrayOf(SYSREQ_NAME; 'Подразделение'); ArrayOf(PerformerFIO; AssignmentDDS.ПодразделениеТ); Format('Не удалось найти работника с ФИО "%s" и подразделением "%s"^Обратитесь к администратору системы.'; ArrayOf(PerformerFIO; AssignmentDDS.ПодразделениеТ))) AssignmentDDS.Доп2Т = PerformerData.FindItem("Text") AssignmentDDS.Дата2Т = UTCToLocalTime(StrToDate(PerformerData.FindItem("Deadline"); dftDateTime; cltInternal)) Performers.Next Num = Num + 1 endwhile DCIWriteHandlerLog("DEBUG"; "Реквизиты карточки обновлены"; ProcessMessage) // Сохранить запись try Assignment.Save() DCIWriteHandlerLog("INFO"; "Запись справочника успешно принята"; ProcessMessage; "ИД синхронизируемой записи: " & Assignment.SYSREQ_ID) except Assignment.Cancel() DCIWriteHandlerLog("ERROR"; "Ошибка при сохранении записи"; ProcessMessage; GetLastException().Message) endexcept DCIWriteHandlerLog("DEBUG"; "Завершена обработка приема сообщения"; ProcessMessage) |
© Компания DIRECTUM, 2018 | Сообщество пользователей DIRECTUM |