DocsVision 4.5 Руководство разработчика в среде СУБП Пособие для партнёров DocsVision 3Copyright © DocsVision, 2002–2010. Все права защищены v.4.5.0 СОДЕРЖАНИЕ Введение ............................................................................................................... 4 1 2 Общее описание СУБП .................................................................................... 4 1.1 Бизнес-процесс ............................................................................................ 4 1.2 Переменные процесса .................................................................................. 5 1.3 Функции ...................................................................................................... 5 1.4 Шлюзы ........................................................................................................ 6 Программные компоненты СУБП ................................................................... 6 2.1 Шлюзы ........................................................................................................ 6 2.1.1 Клиентский компонент шлюза ................................................................. 6 2.1.2 Серверный компонент шлюза .................................................................. 7 2.2 Функции ...................................................................................................... 8 2.2.1 Клиентский компонент функции .............................................................. 8 2.2.2 Серверный компонент функции .............................................................. 9 2.3 Сценарии..................................................................................................... 9 2.3.1 Разработка сценариев .......................................................................... 10 2.3.2 Объектная модель сценариев ................................................................ 10 2.3.2.1 Работа со шлюзами ........................................................................ 11 2.3.2.2 Работа с переменными ................................................................... 11 2.3.3 Отладка сценариев .............................................................................. 12 2.3.4 Сохранение сценариев в сборку и подключение сборок.......................... 13 Приложение 1: Описание стандартных интерфейсов ............................................. 16 IObjectUI ......................................................................................................... 16 IDVObjectUI ..................................................................................................... 16 IObjectLocalize ................................................................................................. 16 IGateInit .......................................................................................................... 16 IGateUI ........................................................................................................... 16 IFunctionUI ...................................................................................................... 17 IExportableFunctionUI ....................................................................................... 18 IStateFunctionUI ............................................................................................... 18 IGate .............................................................................................................. 18 IGateVariable ................................................................................................... 19 IGateVariableCustomProperties .......................................................................... 20 ICollectionalProperty ......................................................................................... 20 ILockalableObject ............................................................................................. 20 IFunction ......................................................................................................... 21 Приложение 2: Объектная модель карточек СУБП ................................................. 22 Library ............................................................................................................ 23 Dictionary ........................................................................................................ 24 DocsVision 4.5: Руководство разработчика в среде СУБП 2 DictGate .......................................................................................................... 24 DictFunction ..................................................................................................... 24 Process ............................................................................................................ 24 Gate ................................................................................................................ 25 ProcFunction .................................................................................................... 26 PassState ......................................................................................................... 26 Constraint ........................................................................................................ 26 DocType .......................................................................................................... 27 Link................................................................................................................. 27 LogMessage ..................................................................................................... 27 Variable ........................................................................................................... 28 EnumValue ...................................................................................................... 28 LogValue.......................................................................................................... 28 Перечисления.................................................................................................. 29 ProcessStateEnum ......................................................................................... 29 TemplateStateEnum....................................................................................... 29 FuncStateEnum ............................................................................................. 29 LinkTypeEnum .............................................................................................. 29 ActionTypeEnum............................................................................................ 29 VarTypeEnum ............................................................................................... 29 Приложение 3: примеры сценариев...................................................................... 30 Получение ФИО пользователя ....................................................................... 30 Получение заместителя пользователя ............................................................ 30 Получение URL-ссылки на карточку ............................................................... 31 Перемещение ярлыка карточки ..................................................................... 32 Удаление унаследованных прав на карточку .................................................. 33 DocsVision 4.5: Руководство разработчика в среде СУБП 3 ВВЕДЕНИЕ Настоящий документ предназначен для системных аналитиков и разработчиков, использующих платформу DocsVision и приложение «Управление процессами» для создания дополнительных функций, сценариев, шлюзов и других объектов системы, расширяющих её функциональные возможности по реализации специфичных бизнеспроцессов. Документ освещает следующие вопросы: правила разработки пользовательских функций и шлюзов; правила разработки, отладки и использования сценариев; описания интерфейсов, свойств и методов объектов системы; примеры кода. Документ содержит следующие разделы: раздел 1 «Общее описание СУБП» посвящён общему описанию бизнеспроцессов, переменных процесса, функций и шлюзов; раздел 2 «Программные компоненты СУБП» содержит правила построения шлюзов, функций, создания и отладки сценариев; раздел Error! Reference source not found. «Error! Reference source not found.» посвящён описанию стандартных интерфейсов, объектной модели карточек СУБП, шлюза к файловой системе и шлюза к DocsVision. Перед использованием данного руководства рекомендуется ознакомиться с документом «Руководство пользователя DocsVision», раздел «Управление процессами»; а также “Руководством разработчика на платформе DocsVision”. 1 ОБЩЕЕ ОПИСАНИЕ СУБП Платформа DocsVision и приложение «Управление процессами» (далее – СУБП) представляют собой систему описания сложных процессов обработки информации в организации и полнофункциональный Workflow-сервер. СУБП является решением на основе платформы DocsVision, предназначенным для создания бизнес-процессов любой сложности и управления ими. СУБП может быть установлена автономно (отдельно от сервера DocsVision), либо совместно с ним. Автономная установка подразумевает наличие выделенного сервера, на котором будут работать сервисы СУБП. При этом необходимо также наличие сервера DocsVision, предназначенного для хранения данных. Ключевыми объектами в терминологии переменные процесса, функции и шлюзы. 1.1 СУБП являются бизнес-процесс, БИЗНЕС-ПРОЦЕСС Бизнес-процесс представляет собой формальное описание бизнес-процесса организации. Формальное описание строится из набора атомарных операций (функций), составляющих процесс, и связей между ними, определяющих порядок выполнения операций. Функции процесса оперируют данными внешних систем с помощью шлюзов и обмениваются ими через переменные процесса. Процесс должен обязательно включать в себя специальную функцию, инициирующую выполнение процесса, а также одну или несколько функций, завершающих выполнение процесса. Остальные функции могут быть связаны между собой произвольным количеством связей, которые определяют порядок их выполнения в процессе. Возможно наличие в процессе циклов, условных и безусловных переходов. Физически бизнес-процесс состоит из набора данных, хранящихся в БД DocsVision, набора свойств и методов для операций с этими данными и карточки бизнес-процесса – DocsVision 4.5: Руководство разработчика в среде СУБП 4 карточки DocsVision, данными процесса. 1.2 реализующей пользовательский интерфейс для управления ПЕРЕМЕННЫЕ ПРОЦЕССА Переменные процесса являются субъектами, которыми оперируют функции процесса, обеспечивая единый способ обмена информацией между функциями процесса. Каждая переменная имеет уникальный идентификатор (в формате строки), позволяющий отличить её от остальных переменных бизнес-процесса: имя, значение (величину или набор данных, которые характеризуют переменную) и отображаемое значение, которое может как соответствовать значению, так и характеризовать переменную для пользователя более явным образом. Например, для переменной, представляющей карточку DocsVision, значением является идентификатор карточки, а отображаемым значением – её название. ПРИМЕЧАНИЕ Имена переменных в бизнес-процессе являются регистро-зависимыми. Все переменные являются строго типизированными. К стандартным (системным) типам переменных относятся следующие типы: String – строка; Integer - целое число; Double – число с плавающей точкой; Boolean – булевское значение; DateTime – дата и время; Перечисление – при формировании шаблона процесса можно описать поля типа перечисления и задать все возможные значения. Все значения перечисления в процессе – строковые. Кроме этих стандартных типов, в процесс могут быть добавлены переменные шлюзов. Каждый зарегистрированный в системе шлюз поставляет собственные типы переменных. Автоматического преобразования типов не предусмотрено. Для преобразования экземпляра переменной из одного типа в другой (если таковое возможно) необходимо использовать специальные функции, либо воспользоваться сценарием. 1.3 ФУНКЦИИ Описание процесса содержит набор принадлежащих ему функций, настройки их свойств (свойства функции могут быть проинициализированы как непосредственным заданием значения, так и некой переменной процесса) и описание связей между функциями. Каждая функция имеет собственный набор данных (обычно - в формате XML), отображающих настройки функции и любые дополнительные данные. Функции и связи между ними могут иметь собственные названия и описания для улучшения читаемости бизнес-процесса. Экземпляры каждой функции могут выполняться как параллельно (при установке соответствующего свойства), так и последовательно, что означает использование одних и тех же данных для выполнения функции при ее повторном запуске (например, в циклах). Последовательное выполнение экземпляров функции подразумевает, что её повторный запуск не будет произведен, пока не будет завершено исполнение предыдущего экземпляра. Функция может быть как независимой (выполняться без взаимодействия с внешними системами), так и привязанной к одной или нескольким внешним системам DocsVision 4.5: Руководство разработчика в среде СУБП 5 при помощи шлюзов. Привязка к шлюзам декларируется функцией на программном уровне и проверяется на этапе добавления функции в процесс. 1.4 ШЛЮЗЫ Шлюз представляет собой совокупность программных компонент, предназначенных для обеспечения взаимодействия СУБП с внешними системами. Основными функциями шлюза являются: обмен данными между прикладной системой и СУБП; маршрутизация ссылки на объект прикладной системы в функциях СУБП; специализированная обработка прикладного объекта в рамках процесса. Шлюзы также предоставляют свой набор типов переменных, которыми можно оперировать в СУБП наряду с обычными переменными. Под типами переменных подразумеваются все возможные виды объектов, которыми может оперировать шлюз. Например, шлюз к файловой системе оперирует двумя типами объектов – файлами и папками файловой системы. Соответственно, данный шлюз предоставляет бизнеспроцессам два типа переменных – Папка файловой системы и Файл файловой системы. Выбор механизма использования уникальных значений и отображаемых значений переменных, поставляемых конкретным шлюзом, выбирается разработчиком шлюза. Например, в рассмотренном выше шлюзе к файловой системе, в качестве уникальных значений используются полные физические пути к файлам и папкам, а в качестве отображаемых значений – их частичные имена. 2 ПРОГРАММНЫЕ КОМПОНЕНТЫ СУБП 2.1 ШЛЮЗЫ Пользовательские шлюзы разрабатываются как дополнение к системе управления бизнес-процессами при решении задач интеграции СУБП с внешними системами, взаимодействие с которыми не предусмотрено в стандартной поставке DocsVision. К таким системам можно отнести сторонние системы документооборота, EPR-системы, бухгалтерские системы и прочие. Все пользовательские шлюзы заносятся в справочник шлюзов. После занесения в справочник шлюз становится доступен в объектной модели и в карточке бизнеспроцесса. Реализация пользовательского шлюза включает в себя, как минимум, два основных компонента: клиентский компонент, реализующий отображения и выбора объектов шлюза; пользовательский интерфейс для серверный компонент, работающий в рамках сервиса СУБП и реализующий программный интерфейс для работы с объектами шлюза. Каждый шлюз имеет собственный уникальный идентификатор, задаваемый на этапе разработки. Этот идентификатор заносится в справочник и используется в дальнейшем для обеспечения уникальности шлюзов в системе. 2.1.1 Клиентский компонент шлюза Клиентский компонент шлюза представляет собой стандартный COM-компонент, реализующий ряд предопределенных интерфейсов, в частности: интерфейс IObjectUI – стандартный для всех клиентских объектов СУБП (функций и шлюзов); содержит свойства, возвращающие идентификатор объекта, его название, иконку и хранимые данные; интерфейс IGateUI – стандартный интерфейс клиентского компонента шлюза. Реализует свойства и методы для работы с доступными типами переменных DocsVision 4.5: Руководство разработчика в среде СУБП 6 (объектов шлюза). Например, шлюз к файловой системе может обрабатывать два типа переменных – файлы и папки файловой системы; интерфейс IDVObjectUI (необязательный) – стандартный интерфейс для компонент, использующих объекты DocsVision. Позволяет получить доступ к текущей сессии и окну Навигатора. Наиболее важными в реализации клиентского компонента шлюза являются следующие методы: GetObjectTypes – возвращает коллекцию описаний регистрируемых шлюзом типов переменных; GetMethods – возвращает коллекцию описаний методов, предоставляемых шлюзом для манипуляций над объектами; SelectObject – выбор значения переменной указанного типа. Обычно, вызов данного метода влечет за собой открытие одного или нескольких диалоговых окон; GetObjectDisplayValue – возвращает отображаемое значение переменной указанного типа по её числовому значению. Шлюз может иметь собственные хранимые данные (например, настройки соединения с внешней системой или иные необходимые настройки), которые могут меняться в зависимости от того, в каком процессе используется шлюз. В таком случае эти данные передаются и возвращаются при помощи свойства Data интерфейса IObjectUI и сохраняются в БД DocsVision. Пользовательский интерфейс для изменения этих настроек (при необходимости) также реализуется клиентским компонентом шлюза при помощи страниц свойств. Для передачи шлюзу настроек, общих для всех экземпляров шлюза одного типа, также предусмотрен интерфейс IGateInit. В существующих шлюзах он используется для установки xml-описания шлюза. Для разработки страниц свойств рекомендуется использовать компонент Property Page Designer (DDPropPageD.ocx), входящий в комплект поставки DocsVision. Настройки (данные) шлюза используются в дальнейшем в серверном компоненте шлюза при его инициализации. При занесении шлюза в справочник необходимо указать идентификатор (ProgID) разработанного клиентского компонента. программный Клиентский компонент может быть разработан с использованием Visual Basic или Visual C++. 2.1.2 Серверный компонент шлюза Серверный компонент шлюза реализуется как .NET assembly, и используется сервисом СУБП при работе с объектами шлюза (переменными). Компонент реализует следующую функциональность: предоставление программного интерфейса для обработки объектов шлюза; создание экземпляров объектов; удаление экземпляров объектов; сравнение объектов; дополнительные функции (свои для каждого шлюза). Компонент реализует стандартный интерфейс вызываемые сервисом СУБП или функциями процесса. IGate, содержащий методы, Кроме этого интерфейса, серверный компонент шлюза определяет собственные интерфейсы для всех типов переменных, реализуемых шлюзом. Каждый объект шлюза реализует стандартный интерфейс IGateVariable для совместимости с другими шлюзами, а также, возможно, некоторые специфические для данного типа методы. Например, тип DocsVision 4.5: Руководство разработчика в среде СУБП 7 Пользователь может, кроме стандартных свойств, содержать такие специфические свойства как ФИО, Дата рождения и другие. Серверный компонент шлюза реализуется на любом из языков платформы .NET – Visual Basic .NET или C#. 2.2 ФУНКЦИИ Пользовательские функции разрабатываются как дополнение к системе управления бизнес-процессами при решении задач расширения функциональности СУБП, которые не могут быть решены при помощи сценариев. Чаще всего, пользовательские функции реализуют механизмы работы со специфическими (пользовательскими) шлюзами и поставляются вместе с ними. Все пользовательские функции заносятся в справочник функций. После добавления в справочник функция становится доступной в объектной модели и появляется на панели инструментов в карточке бизнес-процесса. Реализация компонента: пользовательской функции включает в себя два основных клиентский компонент, реализующий пользовательский интерфейс настройки параметров функции (если таковые предусмотрены); для серверный компонент, работающий в рамках сервиса СУБП и реализующий логику работы функции. Функция может быть независимой от шлюзов (глобальной функцией СУБП), либо требовать для своего исполнения наличия в процессе одного (либо нескольких) предустановленных шлюзов. Эти требования определяются на этапе разработки функции. Например, функция копирования файлов может требовать для своей работы наличия в процессе шлюза к файловой системе. Каждая функция имеет собственный уникальный идентификатор (ID), задаваемый на этапе разработки. Этот идентификатор заносится в справочник и используется в дальнейшем для обеспечения уникальности функций в системе. 2.2.1 Клиентский компонент функции Клиентский компонент функции представляет собой COM-компонент, имеющий пользовательский интерфейс для настройки её свойств. Клиентский компонент функции реализует ряд предопределенных интерфейсов: интерфейс IObjectUI – стандартный для всех клиентских объектов СУБП – содержит свойства, возвращающие идентификатор объекта, его название, иконку и хранимые данные; интерфейс IFunctionUI – стандартный интерфейс клиентского компонента функции – реализует свойства и методы, вызываемые карточкой бизнеспроцесса при использовании функции; интерфейс IExportableFunctionUI (необязательный) – интерфейс, предназначенный для функций, обладающих специфическим механизмом экспорта/импорта. Методы данного интерфейса используются для корректной работы функции при загрузке и выгрузке процесса в XML; интерфейс IStateFunctionUI (необязательный) – данный интерфейс должен быть реализован в функциях, имеющих собственный набор состояний (например, таких как функция Задание). Свойства и методы данного интерфейса позволяют определить для каждого состояния функции собственный цвет, название и иконку, которые будут отображаться на графе бизнес-процесса. Наиболее важными в реализации клиентского компонента функции являются следующие методы: DocsVision 4.5: Руководство разработчика в среде СУБП 8 GetRequiredGates – возвращает список необходимых для работы функции шлюзов (идентификаторы шлюзов, разделенные запятой). При разработке функции, данные идентификаторы должны быть известны; AllowExecute – разрешает или запрещает исполнение функции. В зависимости от того, все ли необходимые для запуска функции параметры указаны, функция может разрешить или запретить создание экземпляра процесса. Вызов данного метода производится из карточки бизнес-процесса; Convert – позволяет преобразовать настройки функции при преобразовании процесса к более поздней версии. Все настройки функции сохраняются в строчном формате, передаются и возвращаются при помощи свойства Data интерфейса IObjectUI и сохраняются в БД DocsVision. Для удобства сохранения настроек функции рекомендуется использовать формат XML. При реализации визуального интерфейса настройки параметров функции рекомендуется использовать механизм страниц свойств (Property Pages). Тогда уникальные страницы свойств функции будут добавлены к стандартным страницам свойств в карточке бизнес-процесса. При разработки страниц свойств рекомендуется использовать компонент Property Page Designer (DDPropPageD.ocx), входящий в комплект поставки DocsVision. При занесении функции в справочник необходимо указать программный идентификатор (ProgID) разработанного клиентского компонента. Например: DVFunctonsUI.StartFunction. Клиентский компонент функции может быть разработан с использованием Visual Basic или Visual C++. 2.2.2 Серверный компонент функции Серверный компонент функции реализуется как .NET assembly и реализует внутреннюю логику работы функции. Компонент реализует следующую функциональность: доступ к настройкам (параметрам) функции; проверка возможности выполнения функции; реализация действий, требуемых от данной функции. Серверный компонент функции реализует интерфейс IFunction, методы которого вызываются сервисом СУБП во время исполнения функции. До начала непосредственного исполнения функция получает заданные пользователем настройки в виде строки (свойство Data) и производится повторная проверка на их достаточность и полноту (метод AllowExecute). Далее вызывается метод Execute, реализующий непосредственно логику функции. Серверный компонент функции реализуется на любом из языков платформы .NET – Visual Basic .NET или C#. 2.3 СЦЕНАРИИ Сценарии представляют собой мощный механизм расширения функциональности СУБП, используемый в тех случаях, когда требуемые действия слишком сложно (или невозможно) выполнить при помощи стандартных функций. Типовые применения сценариев следующие: преобразование типов и форматов данных; динамическое изменение данных процесса во время его работы (добавление и удаление переменных процесса, изменение значений переменных); DocsVision 4.5: Руководство разработчика в среде СУБП 9 сложные операции обработки данных, которые невозможно осуществить стандартными средствами (например, работа со справочниками и специфическими карточками DocsVision); взаимодействие с внешними системами (не предусмотренное функциями или шлюзами этих систем). Функция сценария (Script) позволяет выполнить в рамках процесса произвольный код на языке платформы .NET (C# или VB.NET). 2.3.1 Разработка сценариев Разработка сценариев включает в себя следующие этапы: написание кода сценария; отладка кода сценария; сохранение готового сценария в процессе или подпроцессе. Написание кода сценария можно производить как непосредственно в диалоговом окне функции сценария, так и в любом другом редакторе или при помощи Visual Studio.NET - с последующей вставкой полученного кода в функцию процесса. Последний вариант предпочтительнее, так как позволяет избежать грубых ошибок форматирования, синтаксиса и преобразования типов. Код сценария должен располагаться в классе DVScript, в пространстве имён DVScriptHost: namespace DVScriptHost { class DVScript { } } Сценарий также может содержать другие классы и пространства имен, но существенным является именно указанный. Класс должен содержать стандартный метод: public void Execute (ProcessInfo process, PassState passInfo) В начале исполнения функции управление будет передано данному методу. Входящие параметры метода содержат ссылки на информацию о процессе (process) и данные о текущем проходе (passInfo). Под проходом в данном случае понимается совокупность данных (контекст), специфических для выполнения данного конкретного экземпляра функции. При повторном вызове функции эти данные могут измениться. Функция сценария должна ссылаться на внутренние пространства имен: DocsVision.Workflow.Objects – пространство имен, содержащее описания структур данных карточек СУБП (карточка процесса, справочники); DocsVision.Workflow.Runtime – пространство производящего обработку процессов; DocsVision.Workflow.Gates – пространство имен стандартных шлюзов. имен сервиса СУБП, Для работы с клиентскими объектами DocsVision необходимо дополнительно указать ссылку на пространство имен DocsVision.Platform.ObjectManager (описание соответствующих объектов приведено в руководстве разработчика DocsVision). При необходимости использовать внешние системы (напрямую или через шлюзы) имеется возможность подключить необходимые программные модули на странице свойств функции сценария. 2.3.2 Объектная модель сценариев Основные объекты, которыми оперирует функция сценария, – это внутренние объекты сервиса СУБП, специфические для исполняемого процесса. К ним относятся DocsVision 4.5: Руководство разработчика в среде СУБП 10 переменные процесса, шлюзы, журнал процесса и др. Необходимые типы данных расположены в пространстве имен DocsVision.Workflow.Runtime. Класс ProcessInfo содержит данные о текущем выполняющемся процессе и включает в себя следующие свойства и методы: Gates – коллекция шлюзов, входящих в процесс; Variables – коллекция переменных процесса; Library – ссылка на справочники (библиотека WorkflowObjects); ProcessData – ссылка на карточку процесса (библиотека WorkflowObjects); ProcessLog – журнал процесса (библиотека WorkflowObjects); GetGateByName – получение шлюза с указанным именем; GetVariableByName – получение переменной с указанным именем; LogMessage – запись информационного сообщения в журнал процесса. Экземпляр данного класса выступает в качестве входного параметра функции сценария. С его помощью сценарий может оперировать данными процесса. Для получения конкретных экземпляров переменных или шлюзов рекомендуется использовать методы GetVariableByName и GetGateByName. Корректность выполнения данных методов обеспечивается уникальностью имён шлюзов и переменных в процессе. 2.3.2.1 Работа со шлюзами Коллекция шлюзов процесса (Gates) содержит типизированные экземпляры серверных классов шлюзов, реализующих общий интерфейс IGate. Для получения конкретного шлюза из коллекции, необходимо знать его название или тип. Тип шлюза (уникальный идентификатор) задается в процессе его разработки и в дальнейшем не должен изменяться. Для организации взаимодействия с объектами внешней системы сценарий может общаться с ней как напрямую (при помощи ее собственного API ), так и с помощью шлюза, который может содержать вспомогательные классы для работы с каждым из объектов внешней системы. Например, при работе со справочником сотрудников DocsVision разработчик сценария может работать как напрямую с данными справочника (см. «Руководство разработчика на платформе DocsVision»), так и воспользоваться соответствующими объектами шлюза DocsVision. Однако чаще всего такие объекты шлюза служат внутренним целям (для организации работы стандартных функций), и могут не иметь всех свойств и методов по сравнению с оригинальным API. Поэтому при наличии такой возможности, рекомендуется работать с внешней системой напрямую. Пример работы с объектами DocsVision через оригинальный API: // получение шлюза DVGate dvGate; dvGate = (DVGate)process.Gates[DVGate.GateID]; // получение объекта сессии для доступа к API UserSession session = oDVGate.Session; // работа через API DocsVision - получение данных карточки CardData data = session.CardManager.get_CardData("..."); 2.3.2.2 Работа с переменными Коллекция переменных бизнес-процесса содержит объекты ProcessVariable, включающие в себя следующие свойства и методы: класса ID – уникальный идентификатор переменной; Name – название переменной; DocsVision 4.5: Руководство разработчика в среде СУБП 11 DisplayValue – отображаемое значение объекта, хранящегося в переменной; Type – тип переменной (VarTypeEnum); TypeID – идентификатор типа переменной в шлюзе. Для простых типов переменных не заполняется; GateID – идентификатор шлюза, которому принадлежит переменная. Для простых типов этот идентификатор является пустым GUID; Value – значение переменной. Для простых типов переменных содержит значение соответствующего типа (string, long, …). Для шлюзовых переменных содержит экземпляр переменной шлюза, реализующий стандартный интерфейс IGateVariable; VarEnumValues – коллекция строчных значений (для переменных типа Перечисление); Values – коллекция значений для переменной-коллекции; IsNull – флаг, показывающий, что значение переменной не задано; IsMultipleValued – флаг, показывающий, что переменная хранит несколько значений (переменная-коллекция). Необходимо подчеркнуть, что при работе с переменными простых типов данных, значение переменной можно получить непосредственно из свойства Value. Для прочих типов (переменные шлюзов) в качестве значения переменной будет возвращена ссылка на соответствующий типизированный объект шлюза. Пример: // получение переменных простого и сложного типа ProcessVariable varStr = process.GetVariableByName("Строка"); ProcessVariable varDoc = process.GetVariableByName("Карточка договора"); // получение типизированных значений переменных string strValue = (string)varStr.Value; DVCard card = (DVCard)varDoc.Value; Присваивание значений переменным выполняется аналогичным образом. Переменные простых типов получают непосредственное значение, тогда как шлюзовые переменные в качестве нового значения могут получать только объекты шлюза: // получение переменных простого и сложного типа ProcessVariable varStr = process.GetVariableByName("Строка"); ProcessVariable varDoc = process.GetVariableByName("Карточка договора"); // получение типизированных значений переменных varStr.Value = "новое значение строки"; varDoc.Value = dvGate.GetVariable((int)DVVariableType.DOCUMENT, "ID_карточки"); Примеры простейших сценариев можно найти в приложении 3. 2.3.3 Отладка сценариев Отладка сценариев представляет собой процесс тестирования разработанного кода сценария с последующим включением его в разработанный бизнес-процесс. Отладку можно условно разделить на две стадии: отладка на стадии компиляции; отладка на стадии исполнения. При обработке экземпляра СУБП исполнение всех функций сценария проходит две фазы: компиляция и непосредственное исполнение. Компиляция производится при первом обращении к функции сценария и осуществляется при помощи стандартного DocsVision 4.5: Руководство разработчика в среде СУБП 12 компилятора, входящего в состав Microsoft .NET Framework. Язык сценария (C# или VB.NET) выбирается соответствующим переключателем в настройках функции. Если компиляция кода сценария завершилась с одной (или несколькими) ошибками, то дальнейшее выполнение бизнес-процесса считается невозможным и работа бизнес-процесса завершается с ошибкой. Подробное описание возникших ошибок можно найти в журнале соответствующего экземпляра бизнес-процесса (они будут помечены именем функции сценария, компиляция которой не удалась) или в общем журнале работы СУБП - если такой журнал ведется. Подробнее о журнале работы можно узнать в «Руководстве пользователя DocsVision». Проверить компиляцию сценария можно непосредственно из окна ввода текста сценария, нажатием кнопки “Компилировать”. В случае, если компиляция завершена успешно, производится исполнение сценария. Исполнение производится последовательно, если структурой кода не предусмотрено иное. После завершения исполнения всего кода сценария сервис СУБП переходит к обработке следующей функции бизнес-процесса. Для упрощения отладки бизнес-процесса на этапе исполнения можно использовать механизм сообщений. Сценарий может выводить произвольные сообщения в журнал бизнес-процесса при помощи функции LogMessage класса ProcessInfo. Сообщения могут носить декларативный характер (например, сообщать о корректном выполнении тех или иных участков кода) или информировать о состоянии данных (например, значениях переменных). После завершения отладки необязательные для работы сценария сообщения желательно убрать из кода, чтобы избежать замусоривания журнала готового бизнес-процесса. Сценарии могут использовать для организации корректной работы стандартный механизм исключений. Исключения могут возникать в результате ошибок исполнения сценария, либо сознательно продуцироваться в коде для выполнения необходимых действий. Все возможные исключения сценарий должен обрабатывать самостоятельно и в зависимости от этого реализовывать тот или иной вариант работы (например, записать информацию об исключении в журнал или выполнить другой участок кода). Если исключение не было обработано сценарием, то оно обрабатывается сервисом СУБП, и сценарий считается завершенным с непредвиденной ошибкой. Обработка процесса в этом случае прерывается на функции сценария, вызвавшей исключение. Итак, сценарий завершается успешно (исполнение процесса продолжается), если: компиляция сценария завершена без ошибок; все возникшие сценарием; во время исполнения исключения обработаны самим или неуспешно (исполнение бизнес-процесса прерывается), если: возникла одна или более ошибок при компиляции кода сценария (синтаксические, семантические ошибки или не удалось подключить дополнительные библиотеки); во время исполнения сценария возникло хотя бы одно необработанное исключение. 2.3.4 Сохранение сценариев в сборку и подключение сборок Начиная с версии DocsVision 4.5 в функции “Сценарий” появилась кнопка “Создать функцию”, которая позволяет сохранить сценарий как библиотеку, т.е. файл *.dll: DocsVision 4.5: Руководство разработчика в среде СУБП 13 При нажатии на эту кнопку отображается стандартный диалог выбора файла для сохранения сборки. При успешной компиляции сборки производится добавление ссылки на сборку в список сборок в справочнике системных настроек, в ветке, относящейся к настройкам Workflow. Это позволяет в дальнейшем использовать данный сценарий в других процессах как готовую функцию, без необходимости копирования его исходного кода. Внимание! Возможность сохранения сценария в сборку доступна только на сервере DocsVision, т.к. файлы сборок должны располагаться на сервере для возможности работы с ними сервиса Workflow. После сохранения сценария как .Net-сборки, он отображается в диалоге выбора типа объекта в Универсальной функции в дереве на одном уровне с добавленными в процесс шлюзами: DocsVision 4.5: Руководство разработчика в среде СУБП 14 Чтобы обеспечить возможность повторного использования сценария в виде скомпилированной сборки, в нем обязательно должен быть хоть один публичный (publiс) класс, а в нем должны присутствовать публичные статические (отмеченные в коде как public static) методы. В рамках одного сценария возможно наличие произвольного числа таких методов – каждый из них будет выступать как отдельная функция в Универсальной функции. При этом, методы в качестве параметров и возвращаемого значения должны содержать только параметры типов реализованными шлюзами Workflow (включая шлюз к базовым типам). Таким образом, если в поле Тип выбрать в качестве типа переменных класс, принадлежащий сборке, в поле Функция отобразятся статические методы выбранного класса, а в поле Параметры функции — параметры метода. Помимо сборок, созданных на базе сценариев, возможно подключение в таком качестве любых произвольных сборок, отвечающих тем же требованиям: в них обязательно должны присутствовать публичные статические (отмеченные в коде как public static) методы методы в качестве параметров и возвращаемого значения должны содержать только параметры типов реализованными шлюзами Workflow (включая шлюз к базовым типам) Такие сборки необходимо вручную добавить ее в список сборок в справочнике системных настроек, в ветке, относящейся к настройкам Workflow. Для корректной работы диалога на клиенте сборка должна находиться либо в одном каталоге с клиентским приложением (IE), либо в GAC. На сервере сборка должна находиться либо в одном каталоге с ExecLogic.exe, либо в GAC. DocsVision 4.5: Руководство разработчика в среде СУБП 15 ПРИЛОЖЕНИЕ 1: ОПИСАНИЕ СТАНДАРТНЫХ ИНТЕРФЕЙСОВ IObjectUI Интерфейс, шлюзов). реализующий Свойства и методы Тип свойства клиентских Параметры объектов СУБП (функций, Описание Data (R/W) string Данные объекта (функции, шлюза) Icon (R/O) IPictureDisp Иконка объекта TypeName (R/O) string Название данного типа объектов ID (R/O) string Уникальный идентификатор объекта IDVObjectUI Реализуется всеми объектами, использующими DocsVision. Позволяет объекту работать с сессией и хостом. Свойства и методы Тип Параметры Описание UserSession (R/W) IDispatch Сессия DocsVision Host (R/W) IDispatch Хост DocsVision IObjectLocalize Дополнительный интерфейс для объектов, поддерживающих локализацию: Свойства и методы Тип Параметры Получить идентификатор текущей локализации long GetLocaleID (long) LocaleID SetLocaleID Описание Установить идентификатор текущей локализации IGateInit Интерфейс клиентских компонент шлюза. Реализует свойства и методы для работы с доступными типами переменных. Свойства и методы Тип Initialize Параметры Описание (string) Data – данные шлюза Инициализирует шлюз, передавая данные, сохраненные в настройках шлюза в справочнике шлюза. Как правило – xmlописание шлюза. IGateUI Интерфейс клиентских компонент шлюза. Реализует свойства и методы для работы с доступными типами переменных. Свойства и методы Тип Параметры DocsVision 4.5: Руководство разработчика в среде СУБП Описание 16 GetObjectTypes IobjectType Collection Коллекция описаний типов объектов, поддерживаемых шлюзом GetMethods Imethod Collection Коллекция описаний методов, поддерживаемых шлюзом SelectObject bool (long) hWnd – идентификатор родительского окна (long) TypeID – идентификатор типа объекта (string) ObjectID – выходной параметр, идентификатор\значение объекта в шлюзе Выбор объекта в шлюзе. Метод позволяет выбрать и вернуть идентификатор объекта указанного типа. Измененное значение возвращается в параметре ObjectID. Метод возвращает true, если значение было выбрано, и false в противном случае. ShowObject (long) hWnd – идентификатор родительского окна (long) TypeID – идентификатор типа объекта (string) ObjectID – идентификатор/значение объекта в шлюзе Отображение объекта в шлюзе. Метод позволяет активизировать объект по его идентификатору и типу. Может быть поддержано не для всех типов объектов. GetObjectDisplayValue string (long) TypeID – идентификатор типа (string) ObjectID – идентификатор объекта в шлюзе Возвращает отображаемое значение объекта по его типу и идентификатору GetObjectReference string GetQuickSearchValues IDispatch (long) TypeID – Возвращает строку-ссылку идентификатор типа на объект в шлюзе (string) ObjectID – идентификатор объекта в шлюзе (ObjectReferenceTypeEnum) – тип ссылки (long) TypeID – идентификатор типа (string) SearchFor – строка для поиска Возвращает коллекцию идентификаторов объектов, найденных по строке, заданной параметром SearchFor IFunctionUI Интерфейс клиентских компонент функции. Реализует методы, вызываемые карточкой бизнес-процесса при работе с функцией. Свойства и методы Тип Параметры Описание GetRequiredGates string Возвращает список идентификаторов необходимых шлюзов (разделенных запятой) AllowExecute bool Проверка на наличие всех необходимых для запуска функции данных. Возвращает true, если DocsVision 4.5: Руководство разработчика в среде СУБП 17 функция готова к выполнению, и false в противном случае IExportableFunctionUI Клиентский интерфейс для функций, обладающих собственным механизмом экспорта/импорта в XML. Свойства и методы Тип Параметры Описание Вызывается при экспорте функции. Возвращает данные для экспорта в виде строки. string Export (string) Data – данные функции Import Вызывается при импорте функции. IStateFunctionUI Клиентский состояний. интерфейс Свойства и методы для Тип функций, обладающих Параметры собственным набором Описание CurrentIcon (R/O) IPictureDisp Возвращает иконку для текущего состояния CurrentName (R/O) string Возвращает локализованное название текущего состояния CurrentColor (R/O) long Возвращает цвет иконки для текущего состояния (в формате OLE Color) CurrentFunction (R/W) IDispatch Данные о состоянии функции (ProcFunction) IGate Данный интерфейс реализуется серверными компонентами шлюзов. При помощи методов, представленных в данном интерфейсе, сервис СУБП работает с переменными шлюза. Свойства и методы Тип Параметры Описание Data string Сохраненные настройки шлюза. Позволяет передать шлюзу настройки, заданные в клиентской части. GetVariable IGateVariable (long)Type – тип переменной (string)ID – идентификатор переменной Получение переменной из шлюза по типу в формате long. Возвращает стандартизованную переменную. GetVariable IGateVariable (int)Type – тип переменной (string) ID – идентификатор переменной Получение переменной из шлюза по типу в формате int. Возвращает стандартизованную переменную. GetVariable IGateVariable (int)Type – тип Получение переменной из DocsVision 4.5: Руководство разработчика в среде СУБП 18 GetVariableReference переменной (string)SubTypeID – идентификатор подтипа переменной (string) ID – идентификатор переменной шлюза с указанием подтипа переменной. Возвращает стандартизованную переменную. string (int)Type – тип переменной (string)ID – идентификатор переменной Получение внешней ссылки на переменную из шлюза. object (int)Type – тип переменной (string)ID – идентификатор переменной Получение ссылки на переменную во внутреннем формате интегрируемой шлюзом системы. GetVariableInternalReference AddVariable IGateVariable (int)Type – тип переменной (string)VariableInfo – информация о создаваемом объекте DeleteVariable CompareVariables long Создание нового объекта заданного типа. (int)Type – тип переменной (string)ID – идентификатор переменной Удаление объекта из шлюза. (int)Type – тип сравниваемых переменных (string)ID1 – идентификатор первой переменной (string)ID2 – идентификатор второй переменной Сравнение двух переменных одного типа. IGateVariable Данный интерфейс описывает свойства стандартной переменной шлюза, единые для всех типов переменных. Все переменные, уникальные для конкретного шлюза, должны реализовывать этот интерфейс. Свойства и методы Тип Параметры Описание ID string Идентификатор переменной GateID string Уникальный идентификатор шлюза Name string Название переменной DisplayValue int Отображаемое значение Type long Тип переменной в шлюзе LogicalOperation bool (string)OperationType – тип операции (IGateVariable)Variable – переменная для сравнения DocsVision 4.5: Руководство разработчика в среде СУБП Сравнение с другой переменной того же типа 19 Convert object (VarTypeEnum)VarType – тип Сконвертировать переменную переменной в переменную другого типа (IGate) Gate – ссылка на шлюз (int)TypeID – тип переменной в шлюзе IGateVariableCustomProperties Данный интерфейс описывает методы для работы с пользовательскими свойствами объекта шлюза, поддерживающего обработку подобных свойств. Свойства и методы GetCustomProperty Тип Параметры Описание object (string)PropertyName – название свойства Получить значение свойства (string)PropertyName – название свойства (object) – значение свойства Установить значение свойства SetCustomProperty ICollectionalProperty Данный интерфейс описывает способ свойством стандартной переменной шлюза. интерфейсов IEnumerable, IEnumerator. Свойства и методы Тип взаимодействия с Данный интерфейс Параметры коллекционным унаследован от Описание Count int Число элементов в коллекции [Key] object Получить элемент по ключу Add object AddNew object AddNew object (object)Item – элемент для добавления Добавить существующий элемент в коллекцию Добавить новый элемент в коллекцию (object)Key – элемент для добавления Добавить новый элемент в коллекцию с указанием ключа (IEnumerator)Key – элементы Добавить несколько для добавления элементов в коллекцию с указанием ключа AddRange (int)Index– индекс элемента Получить элемент по индексу Remove (object)Key– ключ элемента Удалить элемент по ключу RemoveAt (int)Index– индекс элемента Удалить элемент по индексу GetByIndex object Очистить коллекцию Clear ILockalableObject Данный интерфейс описывает методы и свойства поддерживающего блокировку доступа к данным объекта. Свойства и методы Тип Параметры объекта шлюза, Описание IsLocked bool Заблокирован ли объект PlaceLock bool Заблокировать объект. Результат – флаг успешности операции блокирования DocsVision 4.5: Руководство разработчика в среде СУБП 20 PlaceAutoLock Заблокировать объект и получить объект блокировки. Блокировка автоматически снимется при уничтожении объекта ObjectLock ObjectLock Снять блокировку RemoveLock IFunction Этот интерфейс реализует свойства и методы серверного компонента функции. Свойства и методы Тип Параметры Описание Data string Сохраненные настройки функции. Позволяет передать функции настройки, заданные в клиентской части. FunctionData ProcFunction Данные функции в процессе AllowExecute bool (ProcessInfo)process – данные о процессе (PassState)pass – данные прохода Проверка, можно ли начинать выполнение функции string (ProcessInfo)process – данные о процессе (PassState)pass – данные прохода Получить описание причины, по которой функция не может быть выполнена GetExecuteDisallowReason Execute ExecResultEnum (ProcessInfo)process – данные о процессе (PassState)pass – данные прохода GetNextExecuteTime DateTime (int) PoolingInterval – заданный для функции интервал опроса DocsVision 4.5: Руководство разработчика в среде СУБП Выполнение функции Вычислить время следующего срабатывания функции с учетом заданного в минутах интервала опроса, вызывается для функций, оставшихся в активном состоянии 21 ПРИЛОЖЕНИЕ 2: ОБЪЕКТНАЯ МОДЕЛЬ КАРТОЧЕК СУБП Объектная модель карточек СУБП представляет собой ряд классов, содержащих свойства и методы, позволяющие оперировать соответствующими объектами (данными) в базе данных DocsVision. К ним относятся следующие карточки: Бизнес-процесс; Справочник функций; Справочник шлюзов. Все объекты и коллекции содержат следующие стандартные методы: BeginUpdate – включение режима отложенных изменений; UpdateNow – закрепление всех сделанных изменений; EndUpdate – окончание режима отложенных изменений с их сохранением; CancelUpdate – отмена режима отложенных изменений с их отменой; Refresh – обновление данных. Все коллекции, помимо того, обладают также рядом стандартных свойств и методов: Count – количество элементов в коллекции; Keys – ключи элементов коллекции; Values – значения элементов коллекции; AddNew – добавление нового элемента в коллекцию; Clear – очистка коллекции; СontainsKey – наличие элемента с указанным ключом; ContainsValue – наличие элемента с указанным значением; CopyTo – копирование в массив элементов; GetEnumerator – получение указателя на нумератор; Remove – удаление элемента с указанным ключом. На рис. 2.1 приведена схема объектной модели карточек СУБП. DocsVision 4.5: Руководство разработчика в среде СУБП 22 Рис. 2.1. Схема объектной модели карточек СУБП Ниже приводится детальное описание всех объектов. Library Библиотека карточек СУБП: Свойства и методы Dictionary Тип Параметры Описание Справочники Dictionary (UserSession) Session – сессия Конструктор Library GetProcesses ProcessCollection (bool) IsTemplate – только шаблоны (bool) IsActive – только активные Получение списка всех процессов GetProcess Process ProcessID (Guid) идентификатор процесса Получение конкретного процесса CreateProcess Process (Process) Template - шаблон процесса Создание экземпляра процесса по шаблону DocsVision 4.5: Руководство разработчика в среде СУБП 23 Dictionary Справочники СУБП: Свойства и методы Тип Параметры Описание Functions DictFunctionCollection Справочник функций Gates DictGateCollection Справочник шлюзов DictGate Шлюз в справочнике шлюзов: Свойства и методы Тип Параметры Описание ID Guid Глобальный уникальный идентификатор данного шлюза Key Guid Ключ элемента в коллекции Assembly string Название и путь к сборке серверного компонента шлюза Class string Класс в сборке серверного компонента шлюза Name string Название шлюза в справочнике UIClass string ProgID клиентского компонента шлюза DictFunction Функция в справочнике функций: Свойства и методы Тип Параметры Описание ID Guid Глобальный уникальный идентификатор данной функции Key Guid Ключ элемента в коллекции Assembly string Название и путь к сборке серверного компонента функции Class string Класс в сборке серверного компонента функции Name string Название шлюза в справочнике UIClass string ProgID клиентского компонента шлюза IsStart bool Является ли функция стартовой IsStop bool Является ли функция конечной Process Описание процесса: Свойства и методы Тип Параметры Описание ID Guid Идентификатор процесса Functions ProcFunctionCollection Функции процесса Gates GateCollection Шлюзы процесса Links LinkCollection Связи процесса DocsVision 4.5: Руководство разработчика в среде СУБП 24 Variables VariableCollection Переменные процесса DocTypes DocTypeCollection Типы инициирующих документов LogMessages LogMessageCollection Журнал процесса State ProcessStateEnum Состояние экземпляра процесса AuthorCreated string Автор шаблона процесса AuthorModified string Автор последних изменений Calendar string Ссылка на бизнес-календарь DateCreated DateTime Дата создания DateModified DateTime Дата последних изменений DateBegin DateTime Дата начала работы экземпляра DateEnd DateTime Дата окончания работы экземпляра Description string Описание процесса Folder string Папка для создания экземпляров HasLayout bool Имеется ли нарисованный граф InstanceName string Название экземпляра процесса LocaleID int Языковые настройки пользователя, запустившего процесс Name string Название шаблона процесса SubProcess bool Признак подпроцесса TemplateState TemplateStateEnum Состояние шаблона процесса Version int Номер версии шаблона PlaceLock Блокировка карточки процесса ForceUnlock Немедленное разблокирование RemoveLock Снятие блокировки карточки Gate Шлюз в бизнес-процессе: Свойства и методы Тип Параметры Описание ID Guid Идентификатор Key Guid Ключ элемента в коллекции Caption string Название шлюза в процессе Data string Персональные данные шлюза Description string Описание шлюза TypeID Guid Идентификатор шлюза в справочнике шлюзов DocsVision 4.5: Руководство разработчика в среде СУБП 25 ProcFunction Функция в бизнес-процессе: Свойства и методы Тип Параметры Описание ID Guid Идентификатор Key Guid Ключ элемента в коллекции Caption string Название функции в процессе Data string Персональные данные функции Description string Описание функции TypeID Guid Идентификатор функции в справочнике функций CardID string Идентификатор связанной карточки (дополнительные данные функции) Height int Высота функции на графе Width int Ширина функции на графе XPos int Абсцисса функции на графе YPos int Ордината функции на графе ReuseStep bool Разрешать повторное использование данных прохода States PassStateCollection Состояния функции в проходах PassState Данные о проходе функции: Свойства и методы Тип Параметры Описание ID Guid Идентификатор Key Guid Ключ элемента в коллекции Pass int Номер прохода Data string Данные прохода State FuncStateEnum Состояние функции Constraints ConstraintCollection Коллекция предшествующих ограничений Constraint Ограничение в проходе функции: Свойства и методы Тип Параметры Описание ID Guid Идентификатор Key Guid Ключ элемента в коллекции Completed bool Признак успешного выполнения PrevFunction Guid Идентификатор предыдущей выполненной функции DocsVision 4.5: Руководство разработчика в среде СУБП 26 DocType Тип инициирующего документа. Свойства и методы: Свойства и методы Тип Параметры Описание ID Guid Идентификатор Key Guid Ключ элемента в коллекции TypeID Guid Идентификатор типа документа Link Описывает связь между двумя функциями в процессе: Свойства и методы Тип Параметры Описание ID Guid Идентификатор Key Guid Ключ элемента в коллекции Caption string Название связи Source Guid Идентификатор начальной функции Destination Guid Идентификатор конечной функции LinkType LinkTypeEnum Тип срабатывания связи Style int Стиль отображения связи на графе (прямая, ломаная, кривая) LogMessage Запись в журнале бизнес-процесса: Свойства и методы Тип Параметры Описание ID Guid Идентификатор Key Guid Ключ элемента в коллекции Action string Описание производимого действия ActionType ActionTypeEnum Тип производимого действия ChangeState string Смена состояния функции (для событий от функций) FunctionName string Имя функции (для событий от функций) InputParameters string Входные данные функции (обычно – XML), для событий от функций OutputParameters string Выходные данные функции (обычно – XML), для событий от функций MessageDate DateTime Дата и время события Priority int Приоритет события (1..100). Приоритет выставляется инициатором события по собственному усмотрению. DocsVision 4.5: Руководство разработчика в среде СУБП 27 Variable Переменная бизнес-процесса: Свойства и методы Тип Параметры Описание ID Guid Идентификатор Key Guid Ключ элемента в коллекции DefaultValue object Значение по умолчанию (для шаблонов) Description string Описание переменной EnumValues EnumValueCollection Коллекция значений перечисления (для переменных перечислимого типа) LogValues LogValueCollection Коллекция значений переменной (для переменных с историей изменения значений) GateID Guid Идентификатор шлюза, которому принадлежит переменная (для шлюзовых переменных) TypeID int Тип переменной в шлюзе (для шлюзовых переменных) Name string Имя переменной IsAdded bool Признак того, что переменная была добавлена во время выполнения процесса IsAdditive bool Признак переменной с сохранением истории изменения значений IsDefault bool Признак наличия значения “по умолчанию” IsRequired bool Признак обязательного заполнения значения переменной IsMultipleValued bool Признак переменной-коллекции Value object Значение переменной VarType VarTypeEnum Тип переменной EnumValue Значение переменной перечислимого типа: Свойства и методы Тип Параметры Описание ID Guid Идентификатор Key Guid Ключ элемента в коллекции Value string Значение переменной LogValue Запись в журнале изменения значения переменной: Свойства и методы ID Тип Guid Параметры Описание Идентификатор DocsVision 4.5: Руководство разработчика в среде СУБП 28 Key Guid Ключ элемента в коллекции ChangeDate DateTime Дата и время изменения значения Value String Новое значение Перечисления ProcessStateEnum – состояние экземпляра процесса { NonActive = 0, остановлен Active = 1, активен Paused = 2, приостановлен Failed = 3, приостановлен из-за ошибки Finished = 4, завершен успешно } TemplateStateEnum – состояние шаблона процесса { Design = 0, в разработке InUse = 1, используется Test = 2, тестирование ReadyToStart = 3, готов к созданию экземпляров } FuncStateEnum – состояние функции в проходе { NonActive = 0, не активна Wait = 1, готова к исполнению Active = 2, выполняется Done = 3, проход завершен Finished = 4, процесс завершен Error = 5, ошибка исполнения функции } LinkTypeEnum – тип связи { LinkSuccess = 0, выполняется только при успешном завершении функции LinkFail = 1, выполняется только при неудачном завершении функции LinkCompletion = 2, выполняется всегда } ActionTypeEnum – тип записи в журнале процесса { Error = 0, ошибка Warning = 1, предупреждение Information = 2, дополнительная информация } VarTypeEnum – тип переменной { Generic = 0, шлюзовая Integer = 1, целое Float = 2, дробное String = 3, строка Boolean = 4, да/нет DateTime = 5, дата/время Enum = 6, перечисление } DocsVision 4.5: Руководство разработчика в среде СУБП 29 ПРИЛОЖЕНИЕ 3: ПРИМЕРЫ СЦЕНАРИЕВ Получение ФИО пользователя class DVScript { // Получение ФИО пользователя DV // На входе – переменная “UserDV” типа “Пользователь DV” // На выходе – переменная “User” типа “Строка” public void Execute(DocsVision.Workflow.Runtime.ProcessInfo process, PassState passInfo) { try { process.LogMessage("Получение ФИО Пользователя DV..."); // Переменная типа пользователь DV ProcessVariable oEmployeeID = process.GetVariableByName("UserDV"); // Переменная типа строка ProcessVariable oUserFIO = process.GetVariableByName("User"); //Получаем Гейт к DocsVision DVGate m_oDVGate = (DVGate)process.Gates[DVGate.GateID]; //Получаем Сотрудника DVPrincipal oEmployee = (DVPrincipal)oEmployeeID.Value; ///Подготоваливаем строки вида Фамилия И.О. string sTempFIO = ""; if (oEmployee.LastName.Length > 0) { sTempFIO = oEmployee.LastName; } if (oEmployee.FirstName.Length > 0) { sTempFIO += " " + oEmployee.FirstName.Substring(0, 1) + "."; } if (oEmployee.MiddleName.Length > 0) { sTempFIO += oEmployee.MiddleName.Substring(0, 1) + "."; } oUserFIO.Value = sTempFIO; process.LogMessage("ФИО:" + sTempFIO); } catch (Exception ex) { // запись в журнал ошибки исполнения process.LogMessage("Ошибка выполнения скрипта:" + ex.Message); } return; } } Получение заместителя пользователя class DVScript { // вход: переменная "UserDV" процесса типа Пользователь DV // выход: переменная "Deputy" процесса типа Пользователь DV, // которая вычисляется как первый заместитель у пользователя из переменной1 public void Execute(DocsVision.Workflow.Runtime.ProcessInfo process, PassState passInfo) { try DocsVision 4.5: Руководство разработчика в среде СУБП 30 { process.LogMessage("Получение заместителя..."); // Переменная типа пользователь DV ProcessVariable oUserDV = process.GetVariableByName("UserDV"); ProcessVariable oDeputy = process.GetVariableByName("Deputy"); DVPrincipal dvUser = (DVPrincipal)oUserDV.Value; process.LogMessage("Пользователь: " + dvUser.LastName + " " + dvUser.FirstName + " " + dvUser.MiddleName); DVPrincipal dvDeputy = dvUser.ActiveDeputy; oDeputy.Value = dvDeputy; // Результат process.LogMessage("Заместитель: " + dvDeputy.LastName + " " + dvDeputy.FirstName + " " + dvDeputy.MiddleName); } catch (Exception ex) { // запись в журнал ошибки исполнения process.LogMessage("Ошибка выполнения скрипта:" + ex.Message); } return; } } Получение URL-ссылки на карточку class DVScript { // вход: // переменная "Card" процесса типа "Карточка DV" – карточка // выход: // переменная "URL" процесса типа строка – содержит URL на карточку private DVGate m_oDVGate; public void Execute(DocsVision.Workflow.Runtime.ProcessInfo process, PassState passInfo) { try { process.LogMessage("Формирование URL карточки..."); // Переменные ProcessVariable oURL = process.GetVariableByName("URL"); ProcessVariable oCard = process.GetVariableByName("Card"); // Получаем шлюз m_oDVGate = (DVGate)process.Gates[DVGate.GateID]; // Приводим тип переменной DVCard dvCard = (DVCard)oCard.Value; // Формируем URL string strUrl = oURL.Value.ToString(); if (m_oDVGate.BaseURL != null) strUrl += Environment.NewLine + "<" + m_oDVGate.BaseURL + ((m_oDVGate.BaseURL.IndexOf('?') > 0) ? "&" : "?") + "CardID=" + dvCard.ID + ">"; // Результат oURL.Value = strUrl; process.LogMessage("Url: " + strUrl); } DocsVision 4.5: Руководство разработчика в среде СУБП 31 catch (Exception ex) { // запись в журнал ошибки исполнения process.LogMessage("Ошибка выполнения скрипта:" + ex.Message); } return; } } Перемещение ярлыка карточки class DVScript { // вход: // переменная "TargetFolder" процесса типа "Папка DV" – целевая папка // переменная "Card" процесса типа "Документ DV" – карточка // выход: // перемещает сильную ссылку карточки "Card" в "TargetFolder" private DVGate m_oDVGate; public void Execute(DocsVision.Workflow.Runtime.ProcessInfo process, PassState passInfo) { try { process.LogMessage("Перемещение ярлыка..."); // Переменные ProcessVariable oTargetFolder = process.GetVariableByName("TargetFolder"); ProcessVariable oCard = process.GetVariableByName("Card"); // Приводим типы переменных DVFolder dvTargetFolder = (DVFolder)oTargetFolder.Value; DVCard dvCard = (DVCard)oCard.Value; // Получаем шлюз m_oDVGate = (DVGate)process.Gates[DVGate.GateID]; process.LogMessage("Получили шлюз"); // получаем сессию UserSession oSes = m_oDVGate.Session; process.LogMessage("Получили сессию"); // получение карточки папок FolderCard oFoldersCard = (FolderCard)oSes.CardManager.get_Card(oSes.CardManager.GetCardByRow(dvTargetF older.ID, "FE27631D-EEEA-4E2E-A04C-D4351282FB55").ID); process.LogMessage("Получили карточку папок"); // получение ярлыка Shortcut oShortcut = oFoldersCard.GetHardLink(dvCard.ID); process.LogMessage("Получили ярлык, перемещаем"); // перемещение ярлыка oShortcut.Move(dvTargetFolder.ID); process.LogMessage("Ярлык перемещен успешно."); } catch (Exception ex) { // запись в журнал ошибки исполнения process.LogMessage("Ошибка выполнения скрипта:" + ex.Message); } return; } DocsVision 4.5: Руководство разработчика в среде СУБП 32 } Удаление унаследованных прав на карточку class DVScript { // Удаление унаследованных прав на карточке // На входе – переменная “Карточка” типа “Карточка DV” public void Execute(DocsVision.Workflow.Runtime.ProcessInfo process, PassState passInfo) { try { ProcessVariable varCard = process.GetVariableByName("Карточка"); // получение шлюза DVGate dvGate; dvGate = (DVGate)process.Gates[DVGate.GateID]; // получение объекта сессии для доступа к API UserSession session = dvGate.Session; // получение дескриптора string cardID = ((DVCard)varCard.Value).ID; ISecurable secureCard = session.AccessManager.GetSecureCard(cardID); byte[] descBytes = (byte[])secureCard.ADsSecurityDescriptor; CommonSecurityDescriptor desc = new CommonSecurityDescriptor(true, false, descBytes, 0); // отключение наследования desc.SetDiscretionaryAclProtection(true, false); // сохранение измененного дескриптора descBytes = new byte[desc.BinaryLength]; desc.GetBinaryForm(descBytes, 0); secureCard.ADsSecurityDescriptor = descBytes; process.LogMessage("Унаследованные права удалены"); } catch (Exception ex) { process.LogMessage("Ошибка выполнения скрипта:" + ex.Message); } return; } } DocsVision 4.5: Руководство разработчика в среде СУБП 33