Копировать ссылку на страницу Перейти в предыдущий раздел Перейти в следующий раздел

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

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

Для этого:

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
.navbar > a:hover { background: #FFD73B; }