Поиск блогу

Показаны сообщения с ярлыком состояния. Показать все сообщения
Показаны сообщения с ярлыком состояния. Показать все сообщения

среда, 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;
        }
    }
}