0
Голосовать

Задачи в БП

Создано:
Метки записи:

Добрый день, в БП необходимо создать задачу с заголовком в виде результата предыдущей задачи, как я понимаю ну жно создать параметр

function Action1OnAfterExecute(ActionItem, IsComplete) {
var Parameter = ActionItem.ParentItems.ParentDiagram.Parameters.ItemsByName('DetailedResult');
Parameter.Value = ActionItem.Parameters.ItemsByName('DetailedResult').Value;

//TODO
}

А вот как дальше вытащить его значение?

Комментарии

Гамора Дмитрий

Решение изложено тут:
http://www.terrasoft.com.ua/forum/viewtopic.php?p=7584#7584

Добрый день! Очень хочется запустить процес прямо из карточки контакта, для чего в ней создана спец. кнопка, как я понимаю обработчик должен быть следующим:

function Button1OnClick(Control) {
var MyArray = new Array('OwnerID','ContactID', 'AccountID');
var DefaultValues = new Array(OwnerID, ContactID, AccountID);
DefaultValues.Add('OwnerID', OwnerID);
DefaultValues.Add('ContactID', ContactID);
DefaultValues.Add('AccountID', AccountID);
WFStartByID('{6F8EBFBB-DDCB-4907-8ADF-0F1E71692828}', MyArray, DefaultValues);

????
Спасибо!

Гамора Дмитрий

Правильный ответ:

function Button1OnClick(Control) {
var MyArray = new Array('OwnerID','ContactID', 'AccountID');
var DefaultValuesArray = new Array(OwnerID, ContactID, AccountID);
WFStartByID('{6F8EBFBB-DDCB-4907-8ADF-0F1E71692828}', MyArray, DefaultValuesArray);

Дело в том, что функция WFStartByID принимает в качестве параметров ID сервиса диаграммы, и два массива - с именами параметров и их значениями.

Желаю успехов!

Спасибо, уже все получилось
function Button1OnClick(Control) {
var ContactID = dlData.Dataset.Values('ID');
var AccountID = dlData.Dataset.Values('AccountID');
var MyArray = new Array('ContactID', 'AccountID');
var DefaultValues = new Array(ContactID, AccountID);
WFStartByID('{6F8EBFBB-DDCB-4907-8ADF-0F1E71692828}', MyArray, DefaultValues);

Другой вопрос: как передать детали задачи на следующую задачу?

Гамора Дмитрий

Решение есть, хотя и непростое (и ресурсоемкое).
1. Сформировать список деталей, записи с которых нужно копировать на следующую задачу.
2. Реализовать передачу в окно карточки новой задачи определенного признака - ID предыдущей задачи.
3. При сохранении новой задачи по процессу, если указанный признак был установлен, то осуществить копирование требуемых записей (пример можно посмотреть в скрипте scr_DocumentEdit, на событии AfterPost реализовано копирование детали Продукты, в Вашем случае реализация будет похожей).

Желаю успехов!

Дмитрий, мне как раз и надо скопировать значение детали продукты в следующую задачу, если я правильно понял, то
----------------------------------------------------------------------------
// scr_TasktEdit
// ----------------------------------------------------------------------------

function ProcessCopyOfferingDetail(Dataset) {
var IsCopy = Self.Attributes('IsCopy');
if (!IsCopy) {
return;
}
var SourceOfferingInItemDatasetCode = 'ds_OfferingInDocument';
var DestinationOfferingInItemDatasetCode = 'ds_OfferingInDocument';
var SourceParentItemIDFieldName = 'DocumentID';
var DestinationParentItemIDFieldName = 'DocumentID';
var SourceItemID = Self.Attributes('SourceRecordID');
var DestinationItemID = Dataset.Values('ID');
CopyOfferingInItemDetail(SourceOfferingInItemDatasetCode,
DestinationOfferingInItemDatasetCode, SourceParentItemIDFieldName,
DestinationParentItemIDFieldName, SourceItemID, DestinationItemID);
}

// ----------------------------------------------------------------------------
// Event handlers
// ----------------------------------------------------------------------------

function dlDataOnDatasetDataChange(DataField) {
var DataFieldName = DataField.Name;
switch (DataFieldName){
case ('DocumentTypeID'):
edtState.UnprepareDropDownList();
break
}
}

function dlDataOnDatasetAfterPost(Dataset) {
ProcessCopyOfferingDetail(Dataset);
}
а затем в событии onAfterExecute указываем dlDataOnDatasetAfterPost(Dataset)?

Заранее спасибо за ответ!

Гамора Дмитрий

Задачу нужно решать поэтапно.
1. Реализовать передачу в окно карточки новой задачи определенного признака - ID предыдущей задачи.
1.1 Для этого нужно в параметрах диаграммы создать новый параметр TaskID, типа строка. Затем в wa_TaskAction нужно создать параметр элемента, назвать его TaskID, тип Строка.
1.2 В диаграмме процесса настроить в первом элементе (Задаче) соответствие параметров - параметр диаграммы - TaskID, модификатор - Исходящий. Для следующего элемента (Задачи) нужно настроить параметр диаграммы - TaskID, модификатор - Входящий. Таким образом, осуществляется настройка передачи параметров из элемента в элемент.
1.3 Реализовать передачу значения параметра TaskID из элемента диаграммы в атрибуты окна редактирования задачи. Для этого в скрипте wa_TaskActionScript перед вызовом функции ShowEditWindowEx нужно указать:

        var PreviousTaskID = ActionItem.Parameters.ItemsByName('TaskID').Value;
        Attributes('PreviousTaskID') = PreviousTaskID;
        ShowEditWindowEx('wnd_TaskEdit', Attributes, DefaultValues);

2. При сохранении новой задачи по процессу, если указанный признак был установлен, то осуществить копирование требуемых записей.
Для этого нужно считать значение атрибута PreviousTaskID из окна карточки задачи, и осуществлять копирование продуктов только в случае добавления задачи (т.е. после редактирования продукты не копировать, т.к. они уже скопированы):

function dlDataOnDatasetAfterPost(Dataset) {
        CreateContactsInTask(Self, Dataset);
        ActualizeRemindings();
        ActualizeContacts();
// новый код:
        ProcessCopyOfferingDetail(Dataset);
}

function ProcessCopyOfferingDetail(Dataset) {
        var SourceItemID = Self.Attributes('PreviousTaskID');
        if (!SourceItemID) {
                return;
        }
        if (!TaskEdit.IsNewTask) {
                return;
        }
        var SourceOfferingInItemDatasetCode = 'ds_OfferingInTask';
        var DestinationOfferingInItemDatasetCode = 'ds_OfferingInTask';
        var SourceParentItemIDFieldName = 'TaskID';
        var DestinationParentItemIDFieldName = 'TaskID';
        var DestinationItemID = Dataset.Values('ID');
        CopyOfferingInItemDetail(SourceOfferingInItemDatasetCode,
        DestinationOfferingInItemDatasetCode, SourceParentItemIDFieldName,
        DestinationParentItemIDFieldName, SourceItemID, DestinationItemID);
}

Желаю успехов!

Добрый день! Все так и зделал, несколько раз перепроверил, но копирование не происходит, что может быть?

Спасибо за ответ

Гамора Дмитрий

В случае, когда все вроде бы сделано правильно, но не работает как надо, поможет отладка. Точную причину проблемы назвать не могу, видимо, где-то ошибка в коде.
В функции ProcessCopyOfferingDetail первой строчкой можно написать:
debugger;
и затем, когда выполнение кода дойдет до этой функции, Вы сможете пошагово выполнять код в отладчике (рекомендуется MS Visual Studio) и увидеть причину. Наиболее вероятно, что атрибут PreviousTaskID не попадает в окно Задачи. Также возможна ситуация, когда в диаграмме неправильно настроена передача параметра во вторую задачу, и соответственно, атрибут PreviousTaskID попадает в окно уже пустой.
Желаю успехов!

Добрый день, у меня два вопроса:

1. При сохранении любой задачи по процессу, возникает окно с предложением скопировать
деталь продукты, как будто не выполняется условие
if (!SourceItemID) {
return;
}
if (!TaskEdit.IsNewTask) {
return;
}
2. Насколько я понял dlDataOnDatasetAfterPost(Dataset) отрабатывает при сохранении задачи в любом состоянии, как бы сделать

так что процедура ProcessCopyOfferingDetail(Dataset); срабатывала только при сохранении задачи в конечном состоянии

Очень расчитываю на Вашу помощь

Гамора Дмитрий

Добрый день, Павел!

Для того, чтобы копирование продуктов осуществлялось только тогда, когда это нужно (а не для любой задачи по процессу), необходимо организовать правильную установку атрибута окна PreviousTaskID. Для этого, возможно, потребуется отладка и настройка в диаграмме процесса правильной передачи этого параметра.

Насчет отслеживания состояния задачи - можно использовать переменную TaskEdit.StatusIsFinish, которая равна true, если задача установлена в конечное состояние.

Желаю успехов!

Добрый день! Вопрос по поводу передачи значения параметра TaskID из элемента диаграммы в атрибуты окна редактирования задачи. Вы писали:

---
Для этого в скрипте wa_TaskActionScript перед вызовом функции ShowEditWindowEx нужно указать:

Код:
var PreviousTaskID = ActionItem.Parameters.ItemsByName('TaskID').Value;
Attributes('PreviousTaskID') = PreviousTaskID;
ShowEditWindowEx('wnd_TaskEdit', Attributes, DefaultValues);
---

Насколько я понимаю необходимо так же указать
WFSetParamValue(ActionItem, 'TaskID', TaskID);?

Гамора Дмитрий

Павел, проблема лежит глубже.

Под фразой "организовать правильную установку атрибута окна PreviousTaskID" следует понимать то, что в диаграмме в нужном месте процесса должна появляться передача параметра TaskID из одной задачи в следующую или следующие. Для этого в диаграмме нужно настроить соответствие параметров диаграммы и элементов, и указать тип Модификатора (Входящий) только для тех задач, для которых нужно копировать содержимое детали.

Если в элемент процесса правильно помещается значение параметра TaskID (который должен быть непустым только в определенных случаях, но не всегда), то дальнейшая правильная установка атрибута окна и далее механизм копирования деталей будет работать как следует.

Желаю успехов!

Дмитрий, добрый день! Все делаю именно так, создаю параметр диаграммы, настраиваю связи и т.д., все равно не выходит. Хочу пойти другим, может менее гибким путем.

function dlDataOnDatasetAfterPost(Dataset) {
CreateContactsInTask(Self, Dataset);
ActualizeRemindings();
ActualizeContacts();

var Dataset = dlData.Dataset;
var TaskTypeID = Dataset.Values('TypeID');
if (!!TaskEdit.StatusIsFinish && TaskTypeID ==
'{d7340b40-1fd6-40c5-ab77-1e080b5c6cc5}') {
ProcessCopyOfferingDetail(Dataset);
}

но что-то не выходит, условие не выполняется?

Зарание спасибо за помощь

}

Гамора Дмитрий

Могу посоветовать использовать отладчик и правильно расставить скобки в условии if:

if (!!TaskEdit.StatusIsFinish && (TaskTypeID ==
'{d7340b40-1fd6-40c5-ab77-1e080b5c6cc5}')) {
ProcessCopyOfferingDetail(Dataset);
}

Желаю успехов!

Zemaitiene Laima

Добрый день,у меня вопрос на счет повторяющейся задачи в WF – как создать такой тип задачи? На интерфейсе WorkFlow такого выбора нет.

Стоян Виталий

Параметры циклических задач задаются полями CycleTaskParamID, CycleStartDate, CycleDueDate, CycleTaskCount, TaskCyclePeriodType (посмотреть можно в датасете ds_Task).
Для того, чтобы задать эти параметры нужно доработать карточку действия "Задача" бизнес-процесса -- сервис wnd_TaskActionEdit (Workflow\Workflow Actions\Task\wnd_TaskActionEdit).
Добавьте туда необходимые поля. Дальше посмотрите реализацию заполнения параметров задачи в элемент процесса (она в скрипте wnd_TaskActionEditScript в функции SaveData).
В итоге Вы получите карточку с необходимым набором полей для создания циклической задачи. В функции SaveData сохраните эти значения в параметры.
Далее в скрипте wa_TaskActionScript на событии wa_TaskActionOnExecute перед вызовом ShowEditWindowEx нужно добавить в DefaultValues значения для циклических задач, сохраненные в параметры диаграммы.
Посмотрите выше в данной теме, есть примеры заполнения.

Алёна Овсянникова
Гамора Дмитрий пишет:
Решение изложено тут:
http://www.terrasoft.com.ua/forum/viewtopic.php?p=7584#7584

Я понимаю, что я несколько отстала от жизни :smile: Но очень хочется почитать описание именно этого решения, но страница упорно не хочет находится.
Меня интересует конкретно как в бизнес процессе передавать данные из одного поля (Результат подробно) в другое (заголовок).

samarasoft.ru

Яворский Алексей

По данной ссылке пройти у меня также не получилось. По поводу передачи параметра в задаче, я сделаю видео, прикреплю его к данной теме, ориентировочный срок понедельник.

С уважением,
Яворский Алексей
Эксперт 3-й линии поддержки

Administrator
Алёна Марусина пишет:
но страница упорно не хочет находится.

Раньше форум был на официальном сайте Terrasoft (ссылка 2008 года).
Позже появилось community и все ветки были перенесены сюда (по этому старая ссылка уже не актуальна).
При импорте топиков, из-за разных движков форума, нумерация не сохранилась прежней и найти топик можно разве, что по ключевым словам.

Если будут вопросы обращайтесь.
Мы с радостью Вам поможем!

Алёна Овсянникова

Алексей, спасибо, жду!

samarasoft.ru

Яворский Алексей

Алёна, недавно реализовывал такую задачку, "менять статус документа, не привязываясь при этом к задачкам."
Передается ID документа через окно выбора документа (элемент БП)

Присваивать значение в элементе скрипт, в данном случае, можно к примеру так:
WFSetParamValue(ScriptItem.ParentItems.ParentDiagram, 'DocumentID', '{id документа}');

Код с Видео :

var DocumentID = WFGetParamValue(ScriptItem.ParentItems.ParentDiagram, 'DocumentID');
var DataSet = Services.GetNewItemByUSI('ds_Document');
ApplyDatasetFilter(DataSet, 'ID', DocumentID, true);
DataSet.Open();
DataSet.Edit();
DataSet.Values('StateID') = '{C04AE493-C687-4A57-823F-C784ACFB2FF8}'; // в работе
DataSet.Post();

wf_without_task_document_status_edit_camtasia – формат Camtasia Studio 7 с мышью
wf_without_task_document_status_edit_avi – без мышки

Надеюсь данное видео будет вам полезно.

По поводу вашего вопроса "как в бизнес процессе передавать данные из одного поля (Результат подробно) в другое (заголовок)." Я немного не понимаю, "поле (Результат подробно)", это поле заполняется в окне которое появляется во время работы БП и вы его хотите значение этого поля поместить в заголовок другого окна?

Прикрепленный файлРазмер
wf_without_task_document_status_edit_avi.rar 1.48 Мб
wf_without_task_document_status_edit_camtasia.rar 1.49 Мб

С уважением,
Яворский Алексей
Эксперт 3-й линии поддержки

Алёна Овсянникова

Спасибо!

Яворский Алексей пишет:
Я немного не понимаю, "поле (Результат подробно)", это поле заполняется в окне которое появляется во время работы БП и вы его хотите значение этого поля поместить в заголовок другого окна?

Пользователь при выполнении задачи заполняет поле результат подробно. И как только он нажимает "Ок", создается новая задача у которой в заголовок идет этот самый текст. Задачи просто одна из другой вытекают и клиент хочет, чтобы не было нужны смотреть результат предыдущей задачи, если новая выполняется через несколько дней.

samarasoft.ru

Яворский Алексей

Алена, на идейном уровне, это примерно так : во время создания задачи вноситься запись в таблицу tbl_Task, за поле "Результат подробно" отвечает колонка DetailedResult, за заглавие Title. Считывание данных полей первой задачи, можно сделать в обработчике события OnBeforeExecute второй задачи, открыть датасет ds_Task, и профильтровать его по параметру ID который формируется в первой задаче в БП, заполняем полученные данные DetailedResult в Title новой задачи.

Чуть позже отпишу, как получить данные с элемента Задача в БП

С уважением,
Яворский Алексей
Эксперт 3-й линии поддержки

Яворский Алексей

Алена, нашел в нашей базе интересную статью на данную тему:
Реализация передачи параметра из первого элемента процесса в последующие.
Постановка задачи: есть бизнес-процесс, первый элемент – проект. Необходимо, чтобы при появлении после него задачи по процессу, в поле «Проект» проставлялось значение предыдущего проекта.

На сколько я понимаю задача аналогична вашей.
Если у вас возникнут какие либо вопросы, обращайтесь.

Прикрепленный файлРазмер
peredacha_parametrov_iz_proekta_v_zadachi.doc 673 кб

С уважением,
Яворский Алексей
Эксперт 3-й линии поддержки

Алёна Овсянникова

Спасибо Алексей! Обязательно посмотрю материалы!

samarasoft.ru

Сидоров Павел
Яворский Алексей пишет:
Алена, нашел в нашей базе интересную статью на данную тему:
Реализация передачи параметра из первого элемента процесса в последующие.
Постановка задачи: есть бизнес-процесс, первый элемент – проект. Необходимо, чтобы при появлении после него задачи по процессу, в поле «Проект» проставлялось значение предыдущего проекта.

На сколько я понимаю задача аналогична вашей.
Если у вас возникнут какие либо вопросы, обращайтесь.

Алексей, спасибо за выложенный материал.
Я как раз пытаюсь реализовать передачу параметров из одной задачи в другую. В прикрепленном Вами описании все понятно, но у меня не получается добавлять параметры для всей диаграммы и действий( wa_TaskAction), на скриншотах я вижу кнопки для добавления параметра и грид, содержащий информацию о параметрах (название, тип итд.) Я создал диаграмму бизнес процесса, но при открытии сервиса wd_MyProcess я не наблюдаю подобного грида и кнопок для создания параметров, то же самое и с параметрами действий, при открытии сервиса wa_TaskAction.

Яворский Алексей

Дело в том что документ который прикреплен в последнему моему сообщению, был написан не мной, и написан для более ранней версии, в нем описана сама идея передачи параметров.
Для вашей веррсии (3.3.2.127) аналогичный грид будет иметь вид

Подробнее про параметры бизнес-процесса можно почитать в документации "Terrasoft Administrator Руководство Пользователя" параграф 7.1.3. Параметры бизнес-процесса, страница 151

Прикрепленный файлРазмер
params_wd.jpg 41.34 кб

С уважением,
Яворский Алексей
Эксперт 3-й линии поддержки

Сидоров Павел

Да,Алексей, грид параметров диаграммы имеет именно такой вид как показано на вашем изображении.
То есть с добавлением параметра в диаграмму уже нет проблем, а вот как добавить параметр в действие по-прежнему не ясно. При нажатии на правую кнопку мыши на элементе диаграммы(см рис1) и выборе пункта параметры действия открывается список стандартных параметров, но добавить новый нет возможности(см рис2). Если открыть сам сервис действия wa_TaskAction, то тоже нет возможности добавить параметр(см рис3)
Бизнес-процесс я реализую в системе Terrasoft CRM 3.3.2.127

Яворский Алексей пишет:
Подробнее про параметры бизнес-процесса можно почитать в докукентации "Terrasoft Administrator Руководство Пользователя" параграф 7.1.3. Параметры бизнес-процесса, страница 151

- данного руководства не нашел в директории с документацией. Есть руководство администратора, в нем в главе 7-Автоматизация бизнес процессов есть некоторая информация, но она не помогла решить проблему.

Прикрепленный файлРазмер
1.jpg 36.1 кб
2.jpg 29.09 кб
3.jpg 28.86 кб
Яворский Алексей

Павел, выслал вам на почту актуальную документацию.

Яворский Алексей
Эксперт 3-й линии поддержки

С уважением,
Яворский Алексей
Эксперт 3-й линии поддержки

Сидоров Павел

Большое спасибо, Алексей.
В присланной вами документации нашел ответы на свои вопросы.

Сидоров Павел

Схема бизнес процесса имеет вид рис.1
Необходимо передать значение поля "Результат подробно" из Задачи№1 в поле "Заголовок" Задачи№2.
Для диаграммы процесса создан параметр Title, в wa_TaskAction создан параметр Title.
Настроены связи с параметрами элементов(рис.2) Но необходимо настроить 2 связи с параметрами, для Параметра Title из Задачи№1 установить модификатор-"Исходящий", а для параметра Title из задачи№2 установить модификатор-"Входящий". В приложенном выше руководстве пользователя, видимо описана более старая версия, в которой модификатор параметра можно было установить непосредственно в окне редактирования, выбрав нужный из выпадающего списка. Я реализую процесс в CRM 3.3.2.127 и модификатор определяется автоматически исходя из параметров, установленных на карточке редактирования (рис.3) - Если отметить пункт "Получить из параметра диаграммы", то устанавливается модификатор "Входящий", если отметить также пункт "Сохранить в параметр введенное значение.." то устанавливается модификатор "Входящий\Исходящий". Установить модификатор в состояние "Исходящий" не получается.

Так как установить первый параметр как исходящий не получилось, я решил пока реализовать
просто передачу параметра Диаграммы в параметр Задачи№2.
Установил значение параметра диаграммы Title ='Тест передачи параметра'. По приложенному выше руководству внес изменения в скрипт wa_TaskActionScript

function wa_TaskActionOnInitialize(WorkflowAction, ActionItem) {
        WFConnectParams(ActionItem, 'AccountID');
        WFConnectParams(ActionItem, 'ContactID');
        WFConnectParams(ActionItem, 'Title');///!!!!!!!!
}

function wa_TaskActionOnGetLinksInfo(WorkflowAction, ActionItem,
                Codes, Captions) {
        var TypeID = WFGetParamsMapItemValue(ActionItem, 'TypeID');
        var TaskResultDataset = Services.GetNewItemByUSI('ds_TaskResult');
        EnableDatasetFilters(TaskResultDataset, true, 'TypeStatus');
        if (!IsEmptyGUID(TypeID)) {
                ApplyDatasetFilter(TaskResultDataset, 'TaskTypeID', TypeID, true);
        }
        TaskResultDataset.Open();
        try {
                // TODO
                // Show Warning
                while(!TaskResultDataset.IsEOF) {
                        Codes.Add(TaskResultDataset.Values('ID'));
                        Captions.Add(TaskResultDataset.Values('Result'));
                        TaskResultDataset.GotoNext();
                }
        }
        finally {
                TaskResultDataset.Close();
        }
}

function wa_TaskActionOnExecute(WorkflowAction, ActionItem, ItemDataset,
                IsComplete, ResultLinkCodes) {
        // TODO
        // Select only required columns
        var ItemID = ItemDataset.ValAsGUID('ID');
        var TaskID = GUID_NULL;
        var AccountID = null;
        var ContactID = null;
        var Title = null;//!!!!!!!!
        var IsFinish = false;
        var ResultID = '';
        var TaskDataset = WFGetLikedItemDataset('ds_Task', ItemID);
        try {
                if (!IsDatasetEmpty(TaskDataset)) {
                        TaskID = TaskDataset.ValAsGUID('ID');
                        AccountID = TaskDataset.ValAsGUID('AccountID');
                        ContactID = TaskDataset.ValAsGUID('ContactID');
                        Title = TaskDataset.ValAsStr('Title');
                        IsFinish = TaskDataset.ValAsBool('StatusIsFinish');
                        ResultID = TaskDataset.ValAsStr('ResultID');
                }
        }
        finally {
                TaskDataset.Close();
        }
        if (IsFinish) {
                WFSetParamValue(ActionItem, 'AccountID', AccountID);
                WFSetParamValue(ActionItem, 'ContactID', ContactID);
                WFSetParamValue(ActionItem, 'Title', Title);//!!!!!!!!
                IsComplete.Value = true;
                ResultLinkCodes.Value = ResultID;
                return;
        }
        var AllowedResultIDs = WFGetOutgoingLinkCodes(ActionItem);
        var Attributes = GetNewDictionary();
        Attributes.Add('RecordID', TaskID);
        WFParamsToDictionary(WorkflowAction, Attributes, 'OwnerGroupID');
        Attributes.Add('AllowedResultIDs', AllowedResultIDs);
        var DefaultValues = GetNewDictionary();
        DefaultValues.Add('Title', ActionItem.Caption);
        DefaultValues.Add('WorkflowItemID', ItemID);
        var ExecuteDate = ItemDataset.ValAsDateTime('ExecuteDate');
        var ExecuteAfterTimeTypeID =
                WFGetParamsMapItemValue(ActionItem, 'ExecuteAfterTimeTypeID');
        var ExecuteAfterTimeValue =
                parseInt(WFGetParamsMapItemValue(ActionItem, 'ExecuteAfterTimeValue'));
        ExecuteDate = WFCalcExecuteTime(ExecuteDate, ExecuteAfterTimeTypeID,
                ExecuteAfterTimeValue);
        ExecuteDate = ExecuteDate.getVarDate();
        DefaultValues.Add('StartDate', ExecuteDate);
        var ExecuteTimeTypeID =
                WFGetParamsMapItemValue(ActionItem, 'ExecuteTimeTypeID');
        var ExecuteTimeValue =
                parseInt(WFGetParamsMapItemValue(ActionItem, 'ExecuteTimeValue'));
        var DueDate = WFCalcExecuteTime(ExecuteDate, ExecuteTimeTypeID,
                ExecuteTimeValue);
        DefaultValues.Add('DueDate', DueDate.getVarDate());
        WFParamsToDictionary(WorkflowAction, DefaultValues,
                'TypeID', 'OwnerID', 'AccountID', 'ContactID', 'Title');!//////
        ShowEditWindowEx('wnd_TaskEdit', Attributes, DefaultValues);
        IsComplete.Value = false;
}

При запуске бизнес процесса получил ошибку 'Microsoft JScript runtime error: Unknown runtime error'
scr_WorkflowUtils
Отладчик останавливается на строке Dictionary.Add(ItemName, Param.Value); В параметре ItemName лежит Title, в параметре
Param.Value лежит текст='Тест передачи параметра', указанный мной как значение параметра диаграммы.
Далее попадает в ф-ию WFStartByID(WorkflowID, ParamNames, ParamValues)
и ошибка вылетает на строке

if (Assigned(Params)) {
                ID = WorkflowEngine.StartWorkflow(WorkflowUSI, Now, Params);
        } else {
                ID = WorkflowEngine.StartWorkflow(WorkflowUSI, Now);//ERROR
        }
        return ID;

ERROR TSWorkflowLibrary.WorkflowEngine: OLE error 80020101

Причина ошибки в посдеднем изменении, внесенном в скрипт wa_TaskActionScript
В строке WFParamsToDictionary(WorkflowAction, DefaultValues,
'TypeID', 'OwnerID', 'AccountID', 'ContactID', 'Title'); добавлен параметр 'Title'.
Без него процесс запускается корректно, но в поле заголовок Задачи№2 не появляется строка 'Тест передачи параметра'.
Возможно для новой версии необходимо вносить другие изменения в скрипт.

Прикрепленный файлРазмер
1.jpg 26.99 кб
2.jpg 30.37 кб
3.jpg 61.12 кб
Яворский Алексей

Здравствуйте Павел,

Реализовать указанную Вами передачу значений можно следующим образом:
1. Открыть сервис wa_TaskActionScript. В тело функции function wa_TaskActionOnExecute(WorkflowAction, ActionItem, ItemDataset, IsComplete, ResultLinkCodes) добавить строки:

WFSetParamValue(ActionItem, 'TaskID', TaskID);
WFSetParamValue(ActionItem.ParentItems.ParentDiagram, 'TaskID', TaskID);

В этой же функции найти строку
DefaultValues.Add('Title', ActionItem.Caption);

Заменить ее на блок кода:
var ResultParameter = WFGetParamValue(ActionItem.ParentItems.ParentDiagram, 'ResultParameter');
if (ResultParameter == null || ResultParameter == '') {
DefaultValues.Add('Title', ActionItem.Caption);
} else {
DefaultValues.Add('Title', ResultParameter);
}

Сохранить изменения в сервисе.
2. Открыть сервис созданного Вами БП. Добавить два параметра БП: ResultParam и TaskID.

Окно параметров диаграммы будет иметь вид:

Затем для задачи, из которой необходимо взять значение поля «Результат задачи» создать обработчик события OnAfterExecute:


В теле функции обработки события прописать код вида:

function Task1OnAfterExecute(ActionItem, IsComplete) {
if (!IsComplete) {
return;
}

var Dataset = Services.GetNewItemByUSI('ds_Task');
var TaskID = WFGetParamValue(ActionItem.ParentItems.ParentDiagram, 'TaskID');

ApplyDatasetFilter(Dataset, 'ID', TaskID, true);
Dataset.Open();
var DetailedResult = Dataset.Values('DetailedResult');
WFSetParamValue(ActionItem.ParentItems.ParentDiagram, 'ResultParameter', DetailedResult);
Dataset.Close();

}

К скрипту диаграммы прикрепить скрипт scr_WorkflowUtils.

3. Сохранить внесенные изменения. Проверить работу функционала.

Прикрепленный файлРазмер
2.jpg 38.76 кб
4.jpg 20.1 кб
5.jpg 28.82 кб
6.jpg 27.53 кб
7.jpg 18.79 кб
1.jpg 53.92 кб
3.jpg 21.47 кб

С уважением,
Яворский Алексей
Эксперт 3-й линии поддержки

Сидоров Павел

Алексей,спасибо Вам за подробное описание.
Реализовал описанные действия - все работает отлично.

Сидоров Павел

Возникла трудность при передаче параметра в зацикленной задаче.

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

//-----------------------------------------------------------------------------
// wd_SaleScript
//-----------------------------------------------------------------------------
function SetTitleForNextTask(ActionItem, IsComplete) {
        if (!IsComplete) {
        return;
    }

    var Dataset = Services.GetNewItemByUSI('ds_Task');
    var TaskID = WFGetParamValue(ActionItem.ParentItems.ParentDiagram, 'TaskID');
               
    ApplyDatasetFilter(Dataset, 'ID', TaskID, true);                                
    Dataset.Open();
    var DetailedResult = Dataset.Values('DetailedResult');
    WFSetParamValue(ActionItem.ParentItems.ParentDiagram, 'ResultParameter', DetailedResult);
    Dataset.Close();
}
//-----------------------------------------------------------------------------

function Action1OnAfterExecute(ActionItem, IsComplete) {
        //TODO
        SetTitleForNextTask(ActionItem, IsComplete);
}


function Action2OnAfterExecute(ActionItem, IsComplete) {
        //TODO
        SetTitleForNextTask(ActionItem, IsComplete);
}

По логике передача параметра от задачи ПК в Повторный звонок, и в Цикле Повторный звонок абсолютно идентична. Возможно я не учитываю какого-то различия в этих случаях?

Прикрепленный файлРазмер
1.jpg 67.04 кб
Яворский Алексей

В описанной инструкции реализована логика котороя подвязывается на конкретные действия (этлементы БП), в вашем примере зациклинно только одно действие.

Строка ActionItem.ParentItems.ParentDiagram отвечает за предыдущую задача( действие, элемент БП), в вашем случае это всегда будет КП.

Павел, на логическом уровне, когды вы выйдите с данного БП ?

Выгрузите пожалуйста сервисы, данного БП

С уважением,
Яворский Алексей
Эксперт 3-й линии поддержки

Сидоров Павел
Яворский Алексей пишет:
Павел, на логическом уровне, когды вы выйдите с данного БП ?

На данный момент БП находится в стадии разработки, то что я привел на изображении - это начальная часть диаграммы. По логике из БП мы выйдем только если КП(коммерческое предложение)
принято, если оно не принято(несогласие), то проводится серия задач с типом повторный звонок.
И в поле "заголовок" каждого повторного звонка должен попадать "результат подробно" предыдущей задачи(при первом отказе предыдущей задачей является КП, при следующих отказах предыдущей задачей уже является Повторный звонок)
Из цикла повторных звонков мы выходим, только в одном случае - если результат -новое КП, которое либо завершится успешно,и мы выйдем из БП, либо по отказу в КП снова попадем в цикл повторных звонков.
По сути,меня интересует каким способом реализовать передачу поля "результат подробно" в поле "заголовок" вот в таком случае:

В архиве прикрепил сервисы БП (диаграмма уже содержит больше элементов, но вышеуказанный цикл присутствует) и сервис wa_TaskActionScript.

Прикрепленный файлРазмер
1.jpg 34.67 кб
bp.rar 5.99 кб
Яворский Алексей

Здравствуйте Павел,
Как я писал в предыдущем посте, в вашу задачу не передается "Результаты подробно" так как мы пытаемся записать параметр с предыдущей задачи (ActionItem.ParentItems.ParentDiagram), в вашем случае, ее просто нет, что бы сделать так что бы "Результаты подробно" подтягивался с самого элемента задачи следует ActionItem.ParentItems.ParentDiagram заменить на ActionItem, т.е сделать следующие изменения :

//-----------------------------------------------------------------------------
// wd_SaleScript
//-----------------------------------------------------------------------------
function SetTitleForNextTask(ActionItem, IsComplete) {
        if (!IsComplete) {
        return;
    }

    var Dataset = Services.GetNewItemByUSI('ds_Task');
    var TaskID = WFGetParamValue(ActionItem, 'TaskID');
               
    ApplyDatasetFilter(Dataset, 'ID', TaskID, true);                                
    Dataset.Open();
    var DetailedResult = Dataset.Values('DetailedResult');
    WFSetParamValue(ActionItem, 'ResultParameter', DetailedResult);
    Dataset.Close();
}
//-----------------------------------------------------------------------------

function Action1OnAfterExecute(ActionItem, IsComplete) {
        //TODO
        SetTitleForNextTask(ActionItem, IsComplete);
}


function Action2OnAfterExecute(ActionItem, IsComplete) {
        //TODO
        SetTitleForNextTask(ActionItem, IsComplete);
}

В скрипте wa_TaskActionScript в ваших сервисах, был код :

                //****************************
                WFSetParamValue(ActionItem, 'TaskID', TaskID);
                WFSetParamValue(ActionItem.ParentItems.ParentDiagram, 'TaskID', TaskID);       
                //****************************

Оставьте только :

WFSetParamValue(ActionItem, 'TaskID', TaskID);

В прикрепленных файлах, сервисы на которых проверял БП аналогичный тому, что у вас на рисунке.
Я бы реализовывал данный функционал на разных действиях (елементах БП), т.е создал бы дополнительный тип задач, например "Задача с циклом", котороя вела бы себя так как описанно в данном посте.

Прикрепленный файлРазмер
wd_cycle.rar 3.33 кб

С уважением,
Яворский Алексей
Эксперт 3-й линии поддержки

Сидоров Павел

Спасибо за ответ, Алексей.

Сидоров Павел

Я создал новый тип задачи-циклическая задача.
Диаграмма БП имеет вид:

Передача параметров в начальных этапах работает корректно, но параметр не передается из задачи ''Получение заявки".

function Action2OnAfterExecute(ActionItem, IsComplete) {
        SetTitleForCicleTask(ActionItem, IsComplete);
}

function Action5OnAfterExecute(ActionItem, IsComplete) {
debugger;
    SetTitleForNextTask(ActionItem, IsComplete);
   
    var ResultParameter = WFGetParamValue(ActionItem.ParentItems.ParentDiagram, 'ResultParameter');
}

Обработчик отвечабщий за эту задачу - Action5OnAfterExecute.
Проверил с помощью отладчика в переменную ResultParameter попадает нужный для передачи текст, но в заголовок след задачи не попадает.

обработчик Action1OnAfterExecute имеет вид:

if (!IsComplete) {
        return;
    }

    var Dataset = Services.GetNewItemByUSI('ds_Task');
    var TaskID = WFGetParamValue(ActionItem.ParentItems.ParentDiagram, 'TaskID');
                   
    ApplyDatasetFilter(Dataset, 'ID', TaskID, true);
                                       
    Dataset.Open();
    //КП - несогласие
    if( Dataset.Values('ResultID') == '{1974CAF2-792C-43D8-B66B-577E9AC17EAF}'){
        var DetailedResult = Dataset.Values('DetailedResult');
        WFSetParamValue(ActionItem.ParentItems.ParentDiagram, 'ResultParameter', DetailedResult);  
        }
        //КП - согласие
        else{
          WFSetParamValue(ActionItem.ParentItems.ParentDiagram, 'ResultParameter', null);
          WFSetParamValue(ActionItem, 'ResultParameter', null);  
        }  
    Dataset.Close();
Этим я добился того, чтобы параметр передавался из ПК в циклическую задачу, но не передавался из задачи КП в задачу Получение заявки.

В чем может быть причина того что из задачи Получение заявки параметр уже не передается?

Прикрепленный файлРазмер
bp.rar 11.13 кб
1.jpg 62.08 кб
Яворский Алексей

Павел на сколько я понял из выше описанного что в действии "Получение заявки" мы не хотим получать никакие параметры, а вот с этого действия должны передать параметр в Циклич. задача. в одном случае и в Формирование счета в другом

Попробуйте дописать в Action5OnAfterExecute

    var Dataset = Services.GetNewItemByUSI('ds_Task');
    var TaskID = WFGetParamValue(ActionItem, 'TaskID');
                   
    ApplyDatasetFilter(Dataset, 'ID', TaskID, true);                                
    Dataset.Open();
    var DetailedResult = Dataset.Values('DetailedResult');
    WFSetParamValue(ActionItem, 'ResultParameter', DetailedResult);

С уважением,
Яворский Алексей
Эксперт 3-й линии поддержки

Сидоров Павел
Яворский Алексей пишет:
Павел на сколько я понял из выше описанного что в действии "Получение заявки" мы не хотим получать никакие параметры, а вот с этого действия должны передать параметр в Циклич. задача. в одном случае и в Формирование счета в другом

Да,все именно так.
Спасибо за ответ,Алексей. Теперь параметр передается и из задачи "Получение заявки".

Сидоров Павел

Появился новый вопрос.
Мне необходимо сделать разветвление при переходе из одной задачи по одному и тому же результату.

Пока я вижу вот такую возможность сделать это

Можно ли сделать это как-то в одном элементе, без двух элементов сравнения?

Прикрепленный файлРазмер
1.jpg 40.7 кб
2.jpg 21.7 кб
Яворский Алексей

Здравствуйте Павел,

На сколько я понял с картинки 1, вы хотите создать параллельный процесс.

Создать параллельные задачи можно построив БП следующим образом:

Для того, чтобы БП продолжался только после выполнения всех параллельных задач, необходимо использовать элемент «Точка слияния»:

Добавьте условия, которые будут срабатывать по параллельным результатам, для того что бы если оно ложно не заходить в задачу а выходить на точку слияния

Прикрепленный файлРазмер
scr1.jpg 44.83 кб
scr2.jpg 53.7 кб

С уважением,
Яворский Алексей
Эксперт 3-й линии поддержки

Сидоров Павел
Сидоров Павел Сергеевич пишет:
На сколько я понял с картинки 1, вы хотите создать параллельный процесс.

Нет, тут будет не параллельный процесс.
Вот более наглядная схема моей ситуации:

То есть у задачи "Подтверждение счета на оплату" при выходе по результату "Счет подтвержден" существует 2 варианта след. задач в зависимости от типа связанной продажи. По предоплате перед отгрузкой идет несколько дополнительных задач, по постоплате - сразу отгрузка.
Или все же можно сделать так? :

Но куда нужно прописать необходимые условия зависимости по какой ветке идти от типа связанной продажи? У точки слияния есть событие Item2OnCollected, но в схеме БП этот элемент находится уже после логической точки ветвления.

Прикрепленный файлРазмер
2.jpg 28.02 кб
3.jpg 71.39 кб
Яворский Алексей

Предлагаю по выходе на "Счет подтвержден" ставить элемент "Выбор" проверять тип связанной продажи, по одной ветви сразу уходим на отгрузку, по второй выполняем задачи, после чего идем на отгрузку, при этом элемент "Точка слияния" использовать не следует, так как это декоратор

С уважением,
Яворский Алексей
Эксперт 3-й линии поддержки

Сидоров Павел

Спасибо,Алексей, сложность была в том что вариантов типа продажи было 4, но я немного пересмотрел логику,и теперь можно как раз сделать как Вы описали - поставить всего один элемент "выбор".

Сидоров Павел

Столкнулся с трудностью при использовании Точки слияния.
Ситуация аналогична вот такой:

То есть у одной задачи есть несколько результатов, которые ведут в точку слияния.
На событие Item8OnCollected я хочу реализовать некоторую логику, но код прописанный на это событие не выполняется, так как из задачи "Контроль полноты отгрузки" в точку слияния входит несколько стрелок, а приходит всегда только какая-то одна.
Или вот такой вариант:

Код на событие Item8OnCollected тоже не исполняется, так как в точку слияния входит 3 стрелки, а приходит всегда только две.
Как можно поступить в этом случае?
И еще один вопрос, в задачах я получал параметры следующим образом:

var OpportunityID = WFGetParamValue(ActionItem.ParentItems.ParentDiagram, 'OpportunityID');

Если этот код прописать в событии точки слияния, то возникнет ошибка из-за отсутствия объекта
ActionItem. Как называеься item, который нужно передать для точки слияния?

Прикрепленный файлРазмер
1.jpg 52.32 кб
2.jpg 73.3 кб
Валерий Андрусик

Между элементом Слияние и задачей "Контроль полноты отгрузки" поставьте блок-скрипт (он будет заглушкой), на него выведите требуемые результаты задач, а из него - одну стрелку на Слияние.

CollectorItem - элемент точки слияния.

--------------------------------------------
Лабитек
Центр разработки приложений

Сидоров Павел

Спасибо за совет,Валерий.