Поиск блогу

среда, 11 мая 2011 г.

Скрипт смены состояния карточки из бизнес-процесса

К сожалению, стандартными процедурами бизнес-процесса невозможно изменить состояние карточки. Для изменения состояния нужно поставить элемент "Скрипт" и написать в нем код, представленный ниже.
Важно помнить о следующей структурной особенности состояний: они различны у каждого вида карточки, поэтому сначала надо получать текущий вид карточки, а затем выбирать соответствующее ему состояние.


// подключение системных библиотек
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
   {
       // стандартная функция, которая будет вызвана подсистемой СУБП
       //
       // входные параметры функции:
       //
       // process - информация о процессе. содержит коллекции
       //     Gates - коллекция шлюзов процесса
       //     Variables - коллекция переменных процесса
       // passInfo - информация о текущем проходе
       //
        private string state = "Согласование с контрагентом"; //Название состояния, в которое мы хотим перевести карточку
        private DVGate m_DVGate;
       public void Execute (DocsVision.Workflow.Runtime.ProcessInfo process, PassState passInfo)
       {
            try
            {
                //Получаем ссылку на карточку, у которой надо сменить состояние. В данном случае она хранится в переменной процесса, которая называется "Инициирующий договор"
                ProcessVariable pvCard = process.GetVariableByName("Инициирующий договор");
                DVCard dvCard = (DVCard)pvCard.Value;

                //получаем шлюз
                m_DVGate = (DVGate)process.Gates[DVGate.GateID];

                // получаем сессию
                UserSession oSes = m_DVGate.Session;
                  
                //Получаем данные карточки
                CardData card = oSes.CardManager.get_CardData(dvCard.ID);

                //Получаем ссылку на секцию "Основная информация". Так как карточка стандартная, то гуид берем из справочника в предыдущем посте. В противном случае - из DVExplorer.
                SectionData mainInfo = card.Sections["8C77892A-21CC-4972-AD71-A9919BCA8187"];

                //Получаем ссылку на справочник типов. Гуид берем из справочника в предыдущем посте.
                CardData RefTypes = oSes.CardManager.get_DictionaryData("BE14D55D-92B7-4345-AD10-32588981F83D");

                //Получаем тип карточки из справочника типов
                RowData currentType = RefTypes.Sections["49AD5A2D-17EC-46E2-A49E-C58D0BBD9C1A"].Rows[mainInfo.FirstRow.get_Value("Type")];

                //Устанавливаем состояние карточки, найдя его по имени и в соответствии с типом карточки
                mainInfo.FirstRow.set_Value("DocState", currentType.ChildRows.GetItemByValue("Name", state).ID);

            }
            catch (Exception ex)
            {
                 // запись в журнал ошибки исполнения
                 process.LogMessage("Ошибка выполнения скрипта:" + ex.Message);
            }
            return;
        }
    }
}

3 коммент.:

Олег Баранов комментирует...

Почему нельзя использовать универсальную функцию обмена? Ведь состояние карточки - это обычное поле. И получить из справочника список состоний тоже наверняка можно.

Anton Volkov комментирует...

К сожалению, в функции универсального обмена не нашел способа вытащить состояние карточки, равно как и сменить его. Может быть это возможно, буду рад, если вы подскажете, как это сделать.

Anton Volkov комментирует...

Потестил скрипт, он отказался работать. Нашел способ, как сменить через универсальную функцию. Достаточно 3х присвоений, если известно конечное состояние.

Отправить комментарий