Регистрация

Скрипты в Бизнес-процессе

Вопросы, связанные с разработкой дополнительных справочников, карточек и т.п. на базе DocsVision

Модератор: Модераторы форума

Новичок
Сообщения: 9
Зарегистрирован: 06 апр 2018, 16:00

Скрипты в Бизнес-процессе

Сообщение Ramzes » 06 апр 2018, 17:19

Здравствуйте.
Пытался на C# написать скрипт в БП для завершения Заданий БП.

Код: Выделить всё
// подключение системных библиотек
using System;
using System.Xml;

// подключение библиотек СУБП
using DocsVision.Workflow.Objects;
using DocsVision.Workflow.Runtime;
using DocsVision.Workflow.Gates;
using DocsVision.Platform.HelperAPI;
using DocsVision.Platform.ObjectManager;


namespace DVScriptHost
{
   class DVScript
   {
      
      public void Execute (DocsVision.Workflow.Runtime.ProcessInfo process, PassState passInfo)
      {
         try
         {
            DVGate dvGate = (DVGate)process.Gates[DVGate.GateID]; // Получаем шлюз к DocsVision
            // Запрос на поиск карточек, сформированный в Личном помощнике
            string queryText = @"<Search Version=""4300"" CombineResults=""OR""><AttributiveSearch><CardTypeQuery CardTypeID=""{F7E2090A-EEC3-4B51-B1BB-567D4A0117D6}""><SectionQuery Version=""4300 ""SectionTypeID=""{D48E6155-C774-4205-AB70-7A67AB69DF22}"" Operation=""AND""><ConditionGroup Alias=""alias0"" Operation=""AND""><Condition Alias=""alias1""><Field FieldType=""enum"">TaskState</Field><Op>NE</Op><Value>5</Value></Condition></ConditionGroup><Options Limit=""-1""/></SectionQuery></CardTypeQuery><CardTypeQuery CardTypeID=""{00000000-0000-0000-0000-000000000001}""><SectionQuery Version=""4300"" SectionTypeID=""{00000000-0000-0000-0000-000000000002}""><ConditionGroup Alias=""alias2"" Operation=""AND""><Condition Alias=""alias3"" SystemField=""true""><Field FieldType=""datetime"">CreationDateTime</Field><Op>LE</Op><Value>3/30/2018 12:00:12 AM</Value></Condition></ConditionGroup><Options Limit=""-1""/></SectionQuery></CardTypeQuery></AttributiveSearch><Scope><CardTypes Enabled=""true""><CardType>{F7E2090A-EEC3-4B51-B1BB-567D4A0117D6}</CardType></CardTypes><Folders Enabled=""true""><Folder>{ECD2BBB4-E1A1-42F1-BB9A-479AA0AAB633}</Folder></Folders></Scope><FulltextSearch Mode=""CardsAndFiles""><QueryString></QueryString></FulltextSearch></Search>";
            CardDataCollection CardColl = dvGate.Session.CardManager.FindCards(queryText); // Получаем массив карточек по запросу
            SectionData section = CardColl[0].Sections["Performing".Id];
            RowData row;
            foreach (CardData Card in CardColl)
            {
               row = section.GetRow(Card.Id);// Где взять RowID?
               row.SetValue("TaskState", 5);
            }
         }
         catch (Exception ex)
         {
            process.LogMessage("Ошибка выполнения скрипта. " + ex.Message);
         }
      return;
      }
   }
}


Естественно возникло множество ошибок и вопросов:

1. Возможно ли вообще использовать в скрипте БП методы вроде "GetRow()" или "SetValue()"?
Вопрос возник в связи с тем, что в процессе выполнения, в логах вылезают ошибки, что пространство имён DocsVision.Platform.ObjectManager.RowData не содержит указанного метода.

2. Где взять другие методы, похожие на "SetBoolean()" и "SetByte"?
Цитата из руководства разработчика на платформе:
"Набор методов для записи типизированных значений:
SetBoolean(string alias, bool? value)
SetByte(string alias, byte? value)
SetChar(string alias, char? value)
… и т.д."
Остальные не описаны. Пробовал через "SetValue()", но как уже говорил вылезают ошибки.

3. Где взять RowID Для GetRow()? Сначала думал, что RowID идентичен ID карточки. Глянул в БД, а там в таблице помимо RowID есть ещё InstanceID, который и соответствует ID карточки.
Как получить RowID, имея экземпляр карточки? И даёт ли мне ID карточки метод "Card.Id"?

Видел темы с решением подобной задачи, но там VB, что вызвало больше вопросов...

Новичок
Сообщения: 9
Зарегистрирован: 06 апр 2018, 16:00

Re: Скрипты в Бизнес-процессе

Сообщение Ramzes » 09 апр 2018, 17:25

Дополнение к первому вопросу:
Когда в сценарии бизнес-процесса написал этот простенький код, для архивации одной конкретной карточки
Код: Выделить всё
using System;
using System.Xml;

using DocsVision.Workflow.Objects;
using DocsVision.Workflow.Runtime;
using DocsVision.Workflow.Gates;
using DocsVision.Platform.HelperAPI;
using DocsVision.Platform.ObjectManager;

namespace DVScriptHost
{
   class DVScript
   {
      public void Execute (DocsVision.Workflow.Runtime.ProcessInfo process, PassState passInfo)
      {
         try
         {
            DVGate dvGate = (DVGate)process.Gates[DVGate.GateID];
            UserSession session = dvGate.Session;
            CardData card = session.CardManager.GetCardData(new System.Guid("3FC69E43-1FBF-4560-AC10-69495D2EA460"));
            card.Archive();
         }
         catch (Exception ex)
         {
            process.LogMessage("Ошибка выполнения скрипта:" + ex.Message);
         }
         return;
        }
   }
}

То БП прервался в двумя ошибками:
1. "DocsVision.Platform.ObjectManager.CardData" не содержит определение для "Archive"
2. "DocsVision.Platform.ObjectManager.CardManager" не содержит определение для "GetCardData"

Почему такое происходит? Возможно ли в БП использовать библиотеку "DocsVision.Platform.ObjectManager"?

Новичок
Сообщения: 9
Зарегистрирован: 06 апр 2018, 16:00

Re: Скрипты в Бизнес-процессе

Сообщение Ramzes » 10 апр 2018, 09:32

С ObjectManager разобрался, библиотеку подключать надо так:
extern alias mOM;
using mOM::DocsVision.Platform.ObjectManager;

А сессию так:
DVGate dvGate = (DVGate)process.Gates[DVGate.GateID];
mOM::DocsVision.Platform.ObjectManager.UserSession userSession = dvGate.UserSession;

Вернуться в Разработка на платформе Docsvision

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1