В стандартной версии системы доступно несколько вариантов маршрутизации входящих документов. Разработчик может изменить стандартные алгоритмы выбора ответственного сотрудника.
Допустим, что необходимо найти в системе договор по данным из формализованного первичного документа, определить ответственного сотрудника и отправить ему задание на обработку первичного документа.
Для этого:
1. | На основании данных из XML-файла определите договор и настройте его автоматическое заполнение в карточке первичного документа. |
Данные о договоре могут содержаться в разных узлах документа. Об этом контрагенты договариваются заранее. Подробнее см. пример заполнения договора на основании узла ОснПер.
2. | Измените существующие вычисления в роли ОтветственныйЗаОбмен на следующие: |
ResponsibleUserCode = ""
// Если есть сообщение для входящих или исходящих документов
IncomingMessageParam = Sender.WorkflowParams.FindItem("IncomingMessage")
if Assigned(IncomingMessageParam)
IncomingMessageCode = IncomingMessageParam.Value.Code
IsOutComingMessage = ReferenceRequisiteValue("DISIMessages"; IncomingMessageCode; "DISIMessageType") == "Исходящее"
// Получить ответственного сотрудника из договора
MessageID = IncomingMessageParam.Value.ID
Query = Format("-- Вычисление роли ОтветственныйЗаОбмен
EXECUTE sp_executesql N'select top 1
emp.Kod
from
dbo.MBAnValR dds
inner join dbo.MBAnalit docType on
docType.Analit = dds.DISIDocTypeT
and docType.Vid = %0:s
-- Только формализованные
and docType.YesNo = ''Д''
inner join dbo.SBEDoc doc on
doc.XRecID = dds.DocT
inner join dbo.MBAnalit dog on
dog.Analit = doc.Dogovor
and dog.Vid = %1:s
inner join dbo.MBAnalit emp on
emp.Analit = dog.FIO
and emp.Vid = %2:s
and emp.Polzovatel is not null
where
dds.Vid = %3:s
and dds.Analit = @ID',
N'@ID int', @ID = %4:s"; ArrayOf(
References.DISIDocTypes.ID;
References.ДГВ.ID;
References.РАБ.ID;
References.DISIMessages.ID;
MessageID))
EmployeeCode = SQL(Query)
if EmployeeCode <<>> ''
ResponsibleUserCode = ReferenceRequisiteValue("РАБ"; EmployeeCode; "Пользователь")
else
// Определить сотрудника, ответственного за организацию контрагента
// Для исходящих документов, загруженных с сервиса обмена
if IsOutComingMessage
AddressCode = ReferenceRequisiteValue("DISIMessages"; IncomingMessageCode; "DISISubscriberAddress2")
else
// Для входящих документов
AddressCode = ReferenceRequisiteValue("DISIMessages"; IncomingMessageCode; "DISISubscriberAddress")
endif
if Assigned(AddressCode)
SubscriberCode = ReferenceRequisiteValue("DISISubscriberAddresses"; AddressCode; "DISISubscriber")
if Assigned(SubscriberCode)
OrgCode = ReferenceRequisiteValue("DISISubscribers"; SubscriberCode; "Организация")
EmployeeCode = ReferenceRequisiteValue("ОРГ"; OrgCode; "Employee")
if Assigned(EmployeeCode)
ResponsibleUserCode = ReferenceRequisiteValue("РАБ"; EmployeeCode; "Пользователь")
endif
endif
endif
endif
// Определить ответственного сотрудника из адреса абонента системы обмена
if ResponsibleUserCode == ""
// Для исходящих документов, загруженных с сервиса обмена
if IsOutComingMessage
SubscriberAddressCode = ReferenceRequisiteValue("DISIMessages"; IncomingMessageCode; "DISISubscriberAddress") // DISISubscriberAddress - отправитель
else
// Для входящих документов
SubscriberAddressCode = ReferenceRequisiteValue("DISIMessages"; IncomingMessageCode; "DISISubscriberAddress2") // DISISubscriberAddress2 - получатель
endif
if Assigned(SubscriberAddressCode)
ResponsibleUserCode = ReferenceRequisiteValue("DISISubscriberAddresses"; SubscriberAddressCode; "Пользователь")
endif
endif
endif
// Если нет сообщения или ответственный сотрудник не определен
if ResponsibleUserCode == ""
ResponsibleUser : IUser = DISIGetResponsibleUser()
if not Assigned(ResponsibleUser)
Raise(CreateException("EDIRInvalidUserAction"; LoadString('DIR01984F01_F0E3_4434_B7DB_21CCBE9CE057'; 'DISI'); ecWarning))
endif
Result.Add(ResponsibleUser)
else
Result.Add(ServiceFactory.GetUserByCode(ResponsibleUserCode))
endif
© Компания Directum, 2020 | Сообщество пользователей Directum |