Доброго времени суток!

В карточке элемента "Задача" в БП есть галка "Открыть окно редактирования карточки".

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

Нравится

9 комментариев

"Беляков Дмитрий" написал:задача почему-то не создается (в базе не создается новых записей).

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

П.С. Хотя "теоретически" в коде все прописано верно:

if (IsNewTask && !WFGetParamsMapItemValue(ActionItem, 'IsProcessImmediately')) {
		CreateNewTask(DefaultValues); //создать задачу "в фоне"
	} else {              	
		ShowEditWindowEx('wnd_TaskEdit', Attributes, DefaultValues);  //открыть окно	
	}

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

Попробуйте сделать так:

  1. Задайте параметр OwnerID элемента БП, предшествующего задаче - это, должно быть логичным, т.к. задача создается по определенному критерию и он должен быть каким-то образом связан с текущими параметрами и элементами БП:




    Параметр OwnerID должен предварительно быть заданным как глобальный в БП.
  2. Затем, на форме элемента БП "Открытие окна", в блоке соответсвия парметров элемента параметрам диаграмме добавьте OwnerID


  3. Задайте параметр элемнта "Задача" в БП

  4. Задайте настройки параметр:

Проверьте результат. У меня все получилось.

Мне кажется дело в чем-то другом, OwnerID у меня передается в элемент процесса. Поставил в дебаггер в начало функции TaskActionOnExecute(WorkflowAction, ActionItem, ItemDataset, IsComplete, ResultLinkCodes), но если галку не ставить, то он не срабатывает, т.е. он вообще не заходит в эту функцию:

function wa_TaskActionOnExecute(WorkflowAction, ActionItem, ItemDataset,
		IsComplete, ResultLinkCodes) {
	debugger;
	// TODO
	// Select only required columns 
	var ItemID = ItemDataset.ValAsGUID('ID');
	var TaskID = GUID_NULL;
	var AccountID = null;
	var ContactID = null;
	var OwnerID = null;
	var DocumentID = null;
	/* MODULE OPPORTUNITIES */
	var OpportunityID = null;
	/* ENDMODULE OPPORTUNITIES */
 
        .    .    .
 
	if (IsNewTask && !WFGetParamsMapItemValue(ActionItem, 'IsProcessImmediately')) {  
		CreateNewTask(DefaultValues);
	} else {
		ShowEditWindowEx('wnd_TaskEdit', Attributes, DefaultValues);
	}
	IsComplete.Value = false;
}

Так как мне вообще не нужно открывать карточку в процессе, убрал проверку этой галки в скрипте:

if (IsNewTask/* && !WFGetParamsMapItemValue(ActionItem, 'IsProcessImmediately')*/) {  
		CreateNewTask(DefaultValues);
	} else {
		ShowEditWindowEx('wnd_TaskEdit', Attributes, DefaultValues);
	} 

Теперь работает в фоне номально, но ведь это не решение проблемы, а обход ее.

В любом случае, буду рад, если найдется нормальное решение.

Дмитрий, провел отладку. Заметил что: метод !WFGetParamsMapItemValue(ActionItem, 'IsProcessImmediately' возращает true если галочка "Открыть окно редактирования задачи" не установлена. Првел отладку.
Пришел к такому решению: в сервсие Workflow\Library\scr_WorkflowUtils изменил функцию WFGetParamsMapItemValue на:

function WFGetParamsMapItemValue(DiagramItem, ItemName, DefaultValue) {   //debugger;
	var ParamsMap = DiagramItem.ParametersMap;
	var ParamsMapItem = ParamsMap.ItemsByItemParameterName(ItemName);
 
	if (Assigned(ParamsMapItem)) {
		return ParamsMapItem.Value;
	}
 
	var Param = DiagramItem.Parameters.ItemsByName(ItemName)
	if (ItemName == 'IsProcessImmediately') {
		return !(Param);
	} else {
		return !!(Param) ? Param.Value : 
			(typeof(DefaultValue) == 'undefined' ? null : DefaultValue);
	}
 
}

Изменения не помогли, где-то слетает раньше, еще до захода в функцию wa_TaskActionOnExecute, где проверяется наличие этой галки. Посмотрите пост №3, я ставил дебагер в начале функции, но если галку не ставить, то он в нее вообще не заходит (дебаггер не вываливается).

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

всем доброго дня!
сталкивался с такой проблемой

решил ее следующим образом:
в wnd_TaskActionEditScript
в LoadData(DiagramItem) строку:

chkProcessImmediately.IsChecked = DiagramItem.ProcessImmediately;

заменяем на:

chkProcessImmediately.IsChecked = WFGetParamsMapItemValue(DiagramItem, 'IsProcessImmediately');

и в SaveData(DiagramItem) строку:

DiagramItem.ProcessImmediately = chkProcessImmediately.IsChecked;

заменяем на:

WFSetParamsMapItemValue(DiagramItem, 'IsProcessImmediately', chkProcessImmediately.IsChecked); 

и все работает!

"Вегера Виталий Вячеславович" написал:и все работает!

Спасибо, Виталий, действительно все работает :twisted:
В очередный раз фиксим баги Террасофт, которые элементарным образом могут быть найдены - простой проверкой сделанной функциональности.

Показать все комментарии

Здравствуйте!

Подскажите, пожалуйста, как получить ID Задачи в функции AfterExecute этой задачи в БП?

Нравится

2 комментария

Добрый день!
На поле "Значение" напротив события OnAfterExecute надо нажать двойным кликом. Откроется дизайнер со скриптом. Туда вставить код. Вроде работает

function Task1OnAfterExecute(ActionItem, IsComplete) {
	if (!IsComplete) {
		return;	
	}
        var ParentDiagram = GetDiagramByItem(ActionItem);
        var TaskID = WFGetParamValue(ParentDiagram, ActionItem.Name+'_TaskID');

интересный ход. Надо будет попробовать:smile:

Как раз на днях тоже мучилась этим вопросом. Поэтому поделюсь своим решением.
Была задача "запомнить" ИД определенной задачи.
Что было сделано:
1) Добавлен в параметр диаграммы параметр NeedTaskID.
2) В скрипте wa_TaskActionScript в конце функции wa_TaskActionOnExecute дописать/изменить:

if (IsNewTask && !WFGetParamsMapItemValue(ActionItem, 'IsProcessImmediately')) {
		CreateNewTask(DefaultValues);
	} else {      //здесь меняем. эта функция возвращает окно задачи.  (в базовом коде идет просто строка вызова этой функции. мы же дописываем переменную, чтобы получить окно)       	
		var TaskWindow = ShowEditWindowEx('wnd_TaskEdit', Attributes, DefaultValues);  	
		//если элемент бп = названию элемента нужной задачи
		if (ActionItem.Name == 'itmNeedTask'){      //запоминаем ИД задачи (которое в атрибуте окна РекордИД) в параметр диаграммы NeedTaskID
			WFSetParamValue(ActionItem, 'NeedTaskID', TaskWindow.Attributes('RecordID'));       
		}
	}
	IsComplete.Value = false;
Показать все комментарии

Добрый день всем.

Помогите понять как правильно настроить отображение записей в разделе Процессы.

Я администратор системы, у меня в этом разделе отражаются списком запущенные всеми пользователями элементы процессов.
У всех остальных пользователей такой роскоши нет. Обычные пользователи в этом разделе видят (ВНИМАНИЕ !) те элементы которые были ими созданы для следующих в процессе исполнителей, те элементы, за которые ответственны другие! А свои элементы они увидеть списком в этом разделе не могут, исключение если пользователь сам выполняет и следующую задачу. В любому случае для таких пользователей раздел по сути бесполезный.

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

Что было бы необходимо:
или отражать в разделе все элементы всех процессов не зависимо от того, кто является создателем
или отражать элементы за которые пользователь ответственный + которые он создал + все элементы по процессу который он создал.

Версия ТС 3.3.2.287
Заранее спасибо.

Нравится

2 комментария

Доюрый день.
Попробуйте изменить фильтр OwnerID в сервисе Workflow\General\Main Grid\sq_Workflow

Старый вариант я переименовал в OwnerID___
Новый - вместо Фильтра сравнения, добавлен "Набор фильтров" : OwnerIDFilter, AuthorIDFilter.

Сделать надо было так , да не совсем так.

В указанных двух CompareFilter надо фильтровать не tbl_Workflow, а tbl_WorkflowItem.
И во втором фильтре конечно по полю CreatedByID.

Спасибо за указание направления , где искать.

Показать все комментарии

Всем доброго времени суток!
Вопрос можно ли реализовать переход от инцидента к задаче по двум результатам? То есть создаётся инцидент от которого идет несколько веток событий. Так вот БП должен идти дальше если инцидент имеет состояние "принят в работу" и в зависимости от типа инцидента должна начать работать одна из веток БП. Как это реализовать? Подскажите пожалуйста.

Нравится

1 комментарий

Добрый день!
Принципиальная схема примерно такая:
В сообытии датасета OnDatasetAfterPost нужно прописать условия старта процесса. В вашем случае это анализ состояния инцидента. Функция для запуска процесса WFStartByID(WorkflowID, ParamNames, ParamValues). А затем в начале процесса добавить элемент с типом "Выбор" и для него прописать анализ типа инцидента и направления процесса в нужную ветку в зависимости от этого типа

Показать все комментарии

есть необходимость выполнить задачу из скрипта (выполнить шаг бизнес-процесса)

сначала обновляю статус и результат задачи на нужные для перехода по БП
из задачи беру WorkflowItemID
далее такие строки:

var WorkflowEngine = GetWorkflowEngine();
WorkflowEngine.ProcessWorkflowItem(WorkflowItemID);

все отлично, задача выполнилась, шаг сделан
создалась новая задача по бизнес-процессу к ней привязана запись в tbl_WorkflowItem, но эта запись не привязана к tbl_Workflow и следовательно бизнес-процесс разваливается

Карло Сергей писал как необходимо сделать: https://community.terrasoft.ru/forum/topic/757#comment-2633

у меня не хватает одной строчки

WorkflowEngine.NotifyObject = NotifyObject;

подскажите, пожалуйста, как создать этот недостающий нотифай

Нравится

5 комментариев

Виталий, мне кажется в Вашем случае дело не в недостающей нотификации.
Вложите, пожалуйста, полную версию скрипта для тестирования.

собственно сам скрипт, вернее функция

function ExecuteWFTaskBG(ID, StatusID, ResultID) {
	var Parameters = CreateSPParameters();
 
 	CreateSPParameter(Parameters, 'ID', pdtGUID, ID);
 	CreateSPParameter(Parameters, 'StatusID', pdtGUID, StatusID);
 	CreateSPParameter(Parameters, 'ResultID', pdtGUID, ResultID); 
 	CreateSPParameter(Parameters, 'WorkflowItemID', pdtGUID, null);
 
	Parameters.ItemsByName('WorkflowItemID').ParamType = 1;
 
	var SQLText = 'exec dbo.tsp_WFTaskEdit :ID, :StatusID, :ResultID, :WorkflowItemID OUTPUT';
	Connector.DBEngine.ExecuteCustomSQL(SQLText, Parameters);
 
	var WorkflowItemID = '{' + Parameters.ItemsByName('WorkflowItemID').Value + '}'; 
 
    var WorkflowEngine = GetWorkflowEngine();
	if (Assigned(WorkflowEngine) && (WFGetItemState(WorkflowItemID) != ws_Done)) {
		WorkflowEngine.ProcessWorkflowItem(WorkflowItemID);
	}
}

в этой части записываются нужные статус и результат задачи, сделал это хранимой процедурой, так как если менять через датасет, то запись затирается и создается аналогичная этой, DisableEvents() не сработал, решил не заморачиваться и по быстрому хранимку написал
ID - Задачи, которую необходимо завершить
StatusID - статут задачи
ResultID - результат задачи, для перехода к нужному следующему шагу
WorkflowItemID - ID записи в tbl_WorkflowItem, задачи которую завершаем

	var Parameters = CreateSPParameters();
 
 	CreateSPParameter(Parameters, 'ID', pdtGUID, ID);
 	CreateSPParameter(Parameters, 'StatusID', pdtGUID, StatusID);
 	CreateSPParameter(Parameters, 'ResultID', pdtGUID, ResultID); 
 	CreateSPParameter(Parameters, 'WorkflowItemID', pdtGUID, null);
 
	Parameters.ItemsByName('WorkflowItemID').ParamType = 1;
 
	var SQLText = 'exec dbo.tsp_WFTaskEdit :ID, :StatusID, :ResultID, :WorkflowItemID OUTPUT';
	Connector.DBEngine.ExecuteCustomSQL(SQLText, Parameters);
 
	var WorkflowItemID = '{' + Parameters.ItemsByName('WorkflowItemID').Value + '}'; 

и две строчки, которые и должны выполнить шаг в бизнес-процессе

    var WorkflowEngine = GetWorkflowEngine();
	WorkflowEngine.ProcessWorkflowItem(WorkflowItemID);

Немного поясню, мы вместе с Виталием бьемся с этой проблемой.

вот команда которая должна выполнить шаг бизнес процесса:

WorkflowEngine.ProcessWorkflowItem(WorkflowItemID);

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

проблемы следующие:
1. WorkflowEngine.ProcessWorkflowItem(WorkflowItemID) не завершает задачу, мы сами скриптом ее завершаем, это еще можно понять.
2. После ProcessWorkflowItem в новом созданном WorkflowItem не заполнено поле WorkflowID, и к тому же из всех предыдущих WorkflowItem созданных в рамках этого процесса зачищаются данные.

Мы попытались дебаггером опеределить в какой момент создается WorflowItem и где зачищается. оказалось
что WorflowItem создается абсолютно нормальным со всеми необходимыми данными, но после AfterExecute элемента БП дебаггер "уходит в никуда", т.е. не показывает что дальше делается ()...когда он снова становится активным, данные уже зачищены.
Мы пробовали вставлять дебаггеры и в afterpost и в beforepost ds_WorkflowItem и в ds_task, однако найти в какой момент выполняются операции по зачищению данных не можем. Какбудто этот процесс выполняется вне скриптов террасофта, а гдето в исполняемых файлах или в хранимых процедурах.

приложу скрипты bp.rar

Для проведения тестирование использовался такой код:

function TestOnClick(Control) { 
  var WorkflowItemID = '{CB3B6EEB-E57C-4E70-A523-D23F5CBC7A5B}';
  var Parameters = CreateSPParameters();
  CreateSPParameter(Parameters, 'ID', pdtGUID, dlData.Dataset('ID'));
  var SQLText = "UPDATE tbl_Task SET StatusID = '{F598ECDB-4EEF-4FA8-9E69-A36B053501E5}', ResultID = '{FC3E0665-C980-4E6E-8941-FAF4294C653F}' WHERE ID = :ID";
  Connector.DBEngine.ExecuteCustomSQL(SQLText, Parameters);
 var WorkflowEngine = GetWorkflowEngine();
        if (Assigned(WorkflowEngine) && (WFGetItemState(WorkflowItemID) != ws_Done)) {
                WorkflowEngine.ProcessWorkflowItem(WorkflowItemID);
        }	
}

В результате процесс пошел дальше и информация о WorkflowItemID и WorkflowID зафиксировалась корректно (рис 1 и рис 2).
Задача (WorkflowItemID = '{CB3B6EEB-E57C-4E70-A523-D23F5CBC7A5B}'), с которой продолжен процесс была в статусе «Не начата».
В Вашем случае нужно проверить, что корректно получаете WorkflowItemID (возможно, получаете не тот идентификатор, который нужен).

С окном все работает
Спасибо Наталия!

Показать все комментарии

Здравствуйте, подскажите, пожалуйста, возможна ли реализация вывода окна выбора действий в бизнес-процессе поверх всех окон?

Нравится

1 комментарий

Константин, о каком окне выбора действий идет речь?
в базовой версии возможность определять отображение окна поверх остальных окон присутствует только у элемента «Вопрос пользователю».
Реализовать подобную функциональность для другого элемента Вы можете по аналогии (см. сервисы wnd_DecisionEdit и wnd_DecisionEditScript).

Показать все комментарии

Здравствуйте!

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

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

Вот скриншот, если задача создается не по процессу, тут все нормально:

В чем может быть проблема?

Нравится

2 комментария

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

А вообще, как-то грустно: задача "сладкая жизнь", состояние - "выполнена", % выполнения - сто процентов.:cry:

ОК, спасибо, до самого не дошло...

Показать все комментарии

Доброго времени суток!
Подскажите, пожалуйста, как можно вывести информационное сообщение с альтернативными вариантами ответов(Да,Нет) и в сообщении должен содержаться параметр.
Пример:
Сообщение: "Запущен процесс по клиенту [Client_Name]. Продолжить дальше?"
-Да - Нет
Воможно ли реализовать это станадртными средствами дизайнера (Окно) вывод параметра или лучше программно?

Нравится

5 комментариев


Добрый день!
Если в начало бизнес процесса добавить блок выбора клиента из соответствующего датасета, то во всех последующих действиях (задачах, окнах и т.д.) можно использовать параметры и выводить любое поле выбранного датасета. Для вывода значения поля (в Вашем случае названия клиента) синтаксис будет следующий "Запущен процесс по клиенту [ContactD__ds_Contact__Name]. Продолжить дальше?"
+

Работает в 3.3.2.260

В принципе пробовал и такой вариант, но он не подставляет значения, а присваивает значение 0.
Где-то в процессе я видел подстановку при помощи процента - %1, попробовал подставить нужное значение не выводит выводится просто %1

Это системная настройка маски.. сам пытался разобраться но в итоге сделал такой вариант, т.к. наименее затратный и ненадо писать никакие коды :) какая у Вас версия?
по поводу присваивания значения 0 - у вас в процессе есть шаг выбора значения ContactID? рисунок выше приводил

Вот пример реализации
primer_sozdaniya_shemy.docx

Добрый день, всем!
Сергей, спасибо за участие!

Алексей, обращайтесь, если нужна будет помощь.

Показать все комментарии

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

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

Terrasoft XRM 3.4.0.130

Как я ее исправил у себя

Изменения вносились в скрипт wa_ReadWriteDataScript.
Выделил комментариями /* added */ изменения/добавления.

function ReadWriteData(Action /* added */, WorkflowItemID /* added */) {
                ...
        if (Source == rwsQuery) {
                ...
        } else if (Source == rwsDataset) {
                ...
                if (Direction == rwdParamsToDataset) {
                        if (WriteMethod == rwdwmUpdate) {
                                ...
                        } else {
                                Dataset.Append();
                                FilterValue = Connector.GenGUID();
                                var IDDataField = Dataset.DataFields.ItemsByName('ID');
                                if (IDDataField) {
                                        IDDataField.Value = FilterValue;
                                }
                                /* added */
                                var WorkflowItemIDDataField = Dataset.DataFields.ItemsByName('WorkflowItemID');
                                if (WorkflowItemIDDataField) {
                                        WorkflowItemIDDataField.Value = WorkflowItemID;
                                }
                                /* added */                            
                        }
                } else {
                ...
        }
        ...
}

function wa_ReadWriteDataOnExecute(WorkflowAction, ActionItem, ItemDataset,
        IsComplete, ResultLinkCodes) {
        var LinkCode = '';
        try {
                var Result = ReadWriteData(ActionItem /* added */, ItemDataset.Values('ID')/* added */);
                ...
        } catch (e) {
                ...
        }
        ...
}

Нравится

3 комментария

Нужно учитывать при этом несколько факторов:

1) что после выполнения этого действия запись из системы уже нельзя будет удалить, так как она связывается с элементом БП;
2) если одна и та же запись участвует в разных БП – возникнет путаница, особенно если эти БП ещё не завершены.

За предложение - спасибо, мы его обсудим.

Сергей, спасибо за комментарии.

"Sergey Karpenko" написал:1) что после выполнения этого действия запись из системы уже нельзя будет удалить, так как она связывается с элементом БП;

В принципе, такая логика изначально была реализована и в более старых версиях Террасофт. И сейчас, например, при использовании элемента "Открытие окна" и пункта "Создать новую запись" с использованием окна редактирования значение WorkflowItemID проставляется у созданной записи.

"Sergey Karpenko" написал:2) если одна и та же запись участвует в разных БП – возникнет путаница, особенно если эти БП ещё не завершены.

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

Информацию передал в отдел разработки для анализа. Спасибо!

Показать все комментарии

Доброе утро.
Как можно открыть права доступа для пользователя, не являющимся администратором, на бизнес-процессы других пользователей в Terrasoft XRM 3.4?

Нравится

1 комментарий

Добрый день, Анастасия.
Для реализации задачи нужно в приложении Terrasoft Administrator открыть сервис Workflow\General\Main Grid\tbl_Workflow и включить для него Администрирование по записям.

Показать все комментарии