{noformat}' Скрипт запуска бизнес-процесса по нажатию кнопки ' ' v 1.0.0 ' Константы Const TEMPLATE_ID = "{5B78F617-5FEB-4BE4-B299-811B0EE0A088}" ' - идентификтор шаблона процесса Const FOLDER_ID = "{8104D728-6786-4DF9-9374-9C4A6886054E}" ' - идентификатор папки, в которую помещается созданный процесс Const CARD_VARIABLE_NAME = "Карточка заявки" ' - название переменной процесса, в которую запишется карточка, из которой запустили процесс Const PROCESS_NAME = "Рассмотрение заявки" ' - название экземпляра процесса Dim QUESTION_TEXT: QUESTION_TEXT = "Вы хотите запустить бизнес-процесс рассмотрения заявки?" ' - Текст вопроса Dim QUESTION_TITLE: QUESTION_TITLE = "Запуск бизнес-процесса" ' - Заголовок вопроса Const FLAG_PROP_NAME = "Флаг запуска" ' - Название свойства, содержащего признак того, что процесс уже запущен Dim WARNING_TEXT: WARNING_TEXT = "Процесс уже запущен" ' - Текст предупреждения о том, что процесс уже запущен Dim WARNING_TITLE: WARNING_TITLE = "Предупреждение" ' - Заголовок предупреждения о том, что процесс уже запущен ' Основная функция скрипта Function DoEvent(UserSession, CardFrame, CardData, ActivateFlags, ModeID, FolderID) ' Проверить значение флага запуска If GetProp(CardData, FLAG_PROP_NAME, 0) > 0 Then ' Вывести предупреждение MsgBox WARNING_TEXT, vbOK Or vbExclamation, WARNING_TITLE ' Заблокировать кнопку и выйти DoEvent = 1 Exit Function End If ' Задать вопрос пользоватею If MsgBox(QUESTION_TEXT, vbYesNo Or vbInformation, QUESTION_TITLE) = vbYes Then ' Создать процесс WF по шаблону Dim Process, ProcessName Set Process = WFProcessByTemplate(UserSession, TEMPLATE_ID, FOLDER_ID, PROCESS_NAME) ' Записать текущую карточку в переменную Process.Variable(CARD_VARIABLE_NAME) = CardData.ID ' Запуск процесса Process.Start ' Установить флаг запуска SetProp CardData, FLAG_PROP_NAME, 1, "1" ' Выйти и закрыть карточку DoEvent = 8 Or 16 Or 64 Exit Function End If DoEvent = 0 End Function ' Создать WFProcess по шаблону Function WFProcessByTemplate(UserSession, TemplateID, FolderID, ProcessName) Dim Process, Folder Set Process = UserSession.CardManager.CardData(TemplateID).Copy Process.IsTemplate = False Process.Description = ProcessName With MainInfo(Process) .Value("Name") = ProcessName .Value("State") = 0 End With Set Folder = FolderCard(UserSession).GetFolder(FolderID) Folder.Shortcuts.AddNew Process.ID, True Set WFProcessByTemplate = New WFProcess Set WFProcessByTemplate.UserSession = UserSession WFProcessByTemplate.ProcessID = Process.ID End Function ' Класс: процесс WF Class WFProcess Public UserSession, ProcessID ' Получить значение переменной WF Property Get Variable(VarName) Variable = GetVarRow(VarName).Value("Value") End Property ' Установить значение переменной WF Property Let Variable(VarName, VarValue) GetVarRow(VarName).Value("Value") = VarValue End Property ' Запустить процесс Sub Start Dim StartID, Process, Row, ProcessName StartID = GetStartID Set Process = UserSession.CardManager.CardData(ProcessID) With MainInfo(Process) .Value("Prepared") = True .Value("State") = 1 ProcessName = .Value("Name") End With Process.Description = ProcessName & " (активен)" For Each Row In Sect(Process, "Functions").Rows If Row.Value("TypeID") = StartID Then SubSect(Row, "States").FirstRow.Value("State") = 2 End If Next End Sub Private Function GetVarRow(VarName) Dim Vars, VarRow Set Vars = Sect(UserSession.CardManager.CardData(ProcessID), "Variables") For Each VarRow In Vars.Rows If VarRow.Value("Name") = VarName Then Set GetVarRow = VarRow Exit Function End If Next Set GetVarRow = Nothing End Function Private Function GetStartID() Dim MainInfo, Row Set MainInfo = Sect(FunctionList(UserSession), "MainInfo") For Each Row In MainInfo.Rows If Row.Value("IsStart") = True Then GetStartID = Row.Value("ID") Exit Function End If Next GetStartID = vbNullString End Function End Class ' Получение секции карточки по имени Function Sect(CardData, Alias) Set Sect = CardData.Sections(CardData.Type.Sections.GetByAlias(Alias).ID) End Function ' Получение подчиненной секции по имени Function SubSect(RowData, Alias) Set SubSect = RowData.ChildSections(RowData.Section.Type.ChildSections.GetByAlias(Alias).ID) End Function ' Нулевая строка секции MainInfo Function MainInfo(CardData) Set MainInfo = Sect(CardData, "MainInfo").FirstRow End Function ' Справочник сотрудников Function FunctionList(UserSession) Set FunctionList = UserSession.CardManager.DictionaryData("{BDB73D05-8DE1-41B2-9F3C-AA76C4D9CD64}") End Function ' Получение карточки папок Function FolderCard(UserSession) Set FolderCard = UserSession.CardManager.Dictionary("{DA86FABF-4DD7-4A86-B6FF-C58C24D12DE2}") End Function ' Строка свойства Function Prop(CardData, Alias) Set Prop = Nothing Dim Row: For Each Row In Sect(CardData, "Properties").Rows If Row.Value("Name") = Alias Then Set Prop = Row Exit Function End If Next End Function ' Получение значения свойства Function GetProp(CardData, Alias, DefaultValue) Dim Row: Set Row = Prop(CardData, Alias) If Row Is Nothing Then GetProp = DefaultValue Else GetProp = Row.Value("Value") If IsNull(GetProp) Then GetProp = DefaultValue End If End Function ' Установка значения свойства Sub SetProp(CardData, Alias, Value, DisplayValue) With Prop(CardData, Alias) .Value("Value") = Value .Value("DisplayValue") = DisplayValue End With End Sub {noformat}