Обновил систему до 7.14.0, помимо решаемых проблем появилась одна нерешаемая, ТП морозится уже 1.5 недели, поэтому пытаюсь задать вопрос коммьюнити.

Итак, проблема с запуском БП, которые должны стартовать по таймеру.  Если запускать их вручную, они тупо не запускаются. В журнале появляется в статусе "Выполняется", но реально ничего не выполняется и просто "висит". Это баг, или фича новой версии?

В логах приложения ошибок нет. По таймеру запускаются и работают.

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

Кто-нибудь сталкивался? Куда можно поковырять?

Нравится

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

У нас возникало из-за переполнения очереди заданий в Quartz. Оказывается, что таймер в БП не приостанавливает процесс, а ставит его в очередь выполнения в определенное время. И если эта очередь переполнена, то и процесс по таймеру дальше не идет. Скорее всего у вас та же проблема. Если есть доступ к журналу Quartz - посмотрите там. 
Как вариант - вместо таймера поставьте скрипт-таск с Thread.Sleep.

Ксензов Егор,

а это какая таблица?

Алексей-Карягин,

Добрый день! Вот скрипт на выборку данных из таблицы Quartz

SELECT [SCHED_NAME],
[TRIGGER_NAME]
,[TRIGGER_GROUP]
,[JOB_NAME]
,[JOB_GROUP]
,[DESCRIPTION]
,[dbo].[fn_QuartzTimeToDateTime]([NEXT_FIRE_TIME]) [NEXT_FIRE_TIME]
,[dbo].[fn_QuartzTimeToDateTime]([PREV_FIRE_TIME]) [PREV_FIRE_TIME]
,[PRIORITY]
,[TRIGGER_STATE]
,[TRIGGER_TYPE]
,[dbo].[fn_QuartzTimeToDateTime]([START_TIME]) [START_TIME]
,[dbo].[fn_QuartzTimeToDateTime]([END_TIME]) [END_TIME]
,[CALENDAR_NAME]
,[MISFIRE_INSTR]
,[JOB_DATA]
FROM [QRTZ_TRIGGERS]

 

Нигрескул Алексей,

у меня 27 записей. Не похоже, чтобы было какое-то переполнение.

А какие сигналы старты у процесса? Обычно ставят 2 - таймер и ручной запуск

Просто таймер. На 7.11 это прекрасно работало.

С версии  7.12.3 менялся движок процессов, они стали интерпретируемыми. Соответственно, не всё, что работало в 7.11, полностью совместимо с нынешним, нужно тестировать. Возможно, решение от Владимира как раз поможет.

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

Добрый день!

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

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

БП просто валится в ошибку по тайм ауту. Пробовали установить признак выполнения процесса в фоновом режиме, но это только все сломало.

Может у кого есть опыт как можно увеличить тайм аут выполнения БП? Базовых методов не нашли.

Благодарю!

 

Нравится

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

Добрый день!
Скорее всего вы запускаете БП через стандартное действие "Запуск процесса". Если это так, то там вызывается метод _runProcess утилиты ProcessModuleUtilities, который наверняка вызывает метод _runProcessOld. В этом методе вызывается сервис ProcessEngineService.svc с передачей параметров. Но таймаут не передается.
Что можно сделать: реализовать отдельное действие запуска вашего БП (кнопку в каком-нибудь разделе, дизайнере), в котором будет вызываться сервис ProcessEngineService.svc с передачей таймаута.

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

Это не только уберёт зависание, но и ослабит нагрузку на сервер приложений и базу данных.

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

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

Сидоров Александр В.,

Александр, ваша идея нам очень очень помогла! Спасибо! будем еще тестировать).

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

При сохранении правок существующего бизнес-процесса возникает ошибка:

 

Суть корректировок - нужно сделать так чтобы после прохождения 1-го уровня эскалации в обращении перед переходом на 2-ой уровень эскалации происходила проверка не находится ли обращение в состоянии паузы (OnHold), проще говоря нужно приостанавливать эскалацию в случае OnHold'а:


 

Нравится

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

Видимо, речь о том, что из элемента «Исключающее “ИЛИ” по событиям» (жёлтый ромб слева сверху) нельзя непосредственно вызывать другие элементы, помимо получения событий (различных сообщенийсигналов либо таймеров), а Вы добавили ветку вниз, начинающуюся со чтения. Также нижний жёлтый ромб «Исключающее “ИЛИ”» с одним входом и одним выходом выглядит странно и непонятно его предназначение.

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

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

В настройках профиля есть возможность отключения уведомлений во всплывающих окнах. Где программно настраиваются данные уведомления? Возможно ли отключить выборочно уведомления о старте конкретных служебных процессов?

Нравится

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

Этот механизм реализован в схеме DesktopPopupNotification, функция из которой вместе с параметрами сообщения вызывается в том месте системы, где хотим что-то сообщить. Например, в SectionMergeHelper:

/**
 * Show popup message with the merge info.
 * @param {Number} mergeRecordsCount Count of records to merge.
 */
showMergePopup: function(mergeRecordsCount) {
	var config = this.getMergePopupConfig(mergeRecordsCount);
	DesktopPopupNotification.showNotification(config);
},
 
/**
 * Returns the config of the popup notification.
 * @param {Number} mergeRecordsCount Count of records to merge.
 * @return {Object} Config of the popup notification.
 */
getMergePopupConfig: function(mergeRecordsCount) {
	var bodyTemplate = this.getMergePopupBodyTemplate();
	return {
		id: this.Terrasoft.generateGUID(),
		title: resources.localizableStrings.MergeNotificationTitleTemplate,
		body: this.Ext.String.format(bodyTemplate, mergeRecordsCount),
		icon: this.getMergePopupIconUrl(),
		onShow: this.onShowPopup,
		ignorePageVisibility: true
	};
},

Соответственно, если хотите, чтобы в одних разделах что-то показывалось, а в других — нет, нужно в ненужных переопределить логику, закомментировав вызов showNotification.

Александр, спасибо за развёрнутый ответ! В частности интересуют уведомления об успешном запуске процессов, например при опубликовании обращения или очистки кэша Redis, в схемах процессов вызов данной функции не обнаружил

Похоже на функцию _showSuccessfullyRunProcessPopup в схеме ProcessModuleUtilities.

Зверев Александр,

 Большое спасибо за помощь :3

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

Был создан БП с блоком отправки почты. В тело письма передается HTML-текст через параметр процесса. Всё работает корректно.

Но при повторном открытии и сохранении БП, параметр в графе "Тело Письма" сбрасывается, даже если не щелкать на блок отправки почты. Приходится при каждом изменении БП заново указывать параметр в тело письма. Иначе в письме содержится именно текст [#IsOwner....

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

 

 

Нравится

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

Обратитесь в тех поддрежку Terrasoft (Creatio) не забыв указать номер версии используемой  у вас BpmOnline.

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

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

Подскажите как можно из Бизнес процесса обратится к C# методу?

Нравится

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

Добрый день! Здесь -  http://prntscr.com/qr8kpl подключаем нам нужное пространство имен, затем объявляем экземпляр класса и вызываем метод - http://prntscr.com/qr8lqh 

Благодарю

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

Необходимо асинхронно запустить из одного БП другой. Использую элемент скрипт

var manager			= context.UserConnection.ProcessSchemaManager;
var processSchema	= manager.GetInstanceByName("ProcessDealerClaim");
var process			= processSchema.CreateProcess(context.UserConnection);
process.SetPropertyValue("FlipId", Get<Guid>("FlipId"));
process.Execute(context.UserConnection);

И всё бы было хорошо, если бы не версионность, а именно, у БП ProcessDealerClaim есть более новая версия ProcessDealerClaimNewBusiness1. Можно, конечно, вписать ее, но что будет, когда появится ProcessDealerClaimNewBusiness2 ? Переделывать?

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

Нравится

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

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

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

Алла Савельева пишет: Где именно посмотреть? ДЛЛ декомпилировать?

Зачем dll, посмотрите в коде схем, где запускают процессы.

Например, в LeftPanelTopMenuModule фильтруют список процессов по IsMaxVersion:

openProcessPage: function() {
	var vwSysProcessFilters = Terrasoft.createFilterGroup();
	vwSysProcessFilters.name = "vwSysProcessFiler";
	var sysWorkspaceFilter = Terrasoft.createColumnFilterWithParameter(
		Terrasoft.ComparisonType.EQUAL, "SysWorkspace",
		Terrasoft.SysValue.CURRENT_WORKSPACE.value);
	vwSysProcessFilters.addItem(sysWorkspaceFilter);
	var businessProcessTagFilter = Terrasoft.createColumnFilterWithParameter(
		Terrasoft.ComparisonType.EQUAL, "TagProperty",
		ConfigurationConstants.SysProcess.BusinessProcessTag);
	vwSysProcessFilters.addItem(businessProcessTagFilter);
	var isMaxVersionFilter = Terrasoft.createColumnFilterWithParameter(
		Terrasoft.ComparisonType.EQUAL, "IsMaxVersion", true);
	vwSysProcessFilters.addItem(isMaxVersionFilter);
	var config = {
		entitySchemaName: "VwSysProcess",
		isRunProcessPage: true,
		captionLookup: resources.localizableStrings.processLookupCaption,
		multiSelect: false,
		columnName: "Caption",
		filters: vwSysProcessFilters,
		hideActions: true
	};
	var handler = function(args) {
		var activeItems = args.selectedRows.getItems();
		if (!this.Ext.isEmpty(activeItems)) {
			Terrasoft.ProcessModuleUtilities.executeProcess({
	sysProcessId: activeItems[0].Id
});
		}
	};
	LookupUtilities.Open(this.sandbox, config, handler, this, null, false, false);
},

Плюс есть сообщение ActiveProcessSchemaVersionChanged, на которое в некоторых схемах подписываются, например, в VwProcessLibSection.

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

Добрый день!

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

Нравится

1 комментарий
Лучший ответ

Меня процесс прослушивания событий визы.
И там уже добавить If колонки не заполнены и т.д.

Меня процесс прослушивания событий визы.
И там уже добавить If колонки не заполнены и т.д.

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

Подскажите как можно в C# сделать Serialize в json объект класса

public class ImportCreatioServiceCaseColumns
{
	[JsonPropertyName("idNumber")]
	public string IdNumber { get; set; }
	[JsonPropertyName("typeCase1Name")]
	public string TypeCase0Name { get; set; }
}
public class ImportCreatioProcessCaseColumnsOut
{
	[JsonPropertyName("schemaName")]
	public string BusinessProcessName { get; set; }
	[JsonPropertyName("parameterValues")]
	public ImportCreatioServiceCaseColumns ImportCreatioServiceCaseColumns { get; set; }

}

и привести его к виду 

{
	"schemaName":"KtImportCaseTransferTableInBPMTest",
	"parameterValues":
	[
		{"name":"idNumber","value":"80001019"},
		{"name":"typeCase1Name","value":"Алматы"}
	]
}

?

Это нужно что бы передать body в микровервис для запуска бизнес-процесса с параметрами POST методом.

Нравится

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

Можно подключитье  Json.NET он уже включен в коробке. Подробнее об использовании смотрите https://www.newtonsoft.com/json

 

Как то так

 

sing System;
using Newtonsoft.Json;
 
namespace JsonPrettyPrint
{
    internal class Program
    {
        private static void Main(string[] args)
        {
            Product product = new Product
                {
                    Name = "Apple",
                    Expiry = new DateTime(2008, 12, 28),
                    Price = 3.99M,
                    Sizes = new[] { "Small", "Medium", "Large" }
                };
 
            string json = JsonConvert.SerializeObject(product, Formatting.Indented);
            Console.WriteLine(json);
 
            Product deserializedProduct = JsonConvert.DeserializeObject<Product>(json);
        }
    }
 
    internal class Product
    {
        public String[] Sizes { get; set; }
        public decimal Price { get; set; }
        public DateTime Expiry { get; set; }
        public string Name { get; set; }
    }
}

 

Не работает так как нужен именно такой формат, уже пробовал как Вы советуете 

Григорий Чех пишет:
{"name":"idNumber","value":"80001019"},

Похожий формат обсуждают тут.

 

Зверев Александр пишет:

Похожий формат обсуждают тут.

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

Александр, см. тут.

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

Как можно определить, как создана Активность - вручную пользователем или автоматически системой?
Посмотрел параметр Process Item, но он не у всех процессных активностей заполнен

Нравится

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

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

Кстати, была такая идея от Вас же, только речь шла о правах, а не активностях.

И ещё похожая идея, только для определения записей, заведенных по OData.

Зверев Александр,

Да, в некоторых проектах делали заполнение названием процесса, но в стандартном элементе "Выполнить задачу" так просто поля не добавить. 
А ещё есть задачи, созданные при элементах "Открыть страницу редактирования", созданные в DCM...

Думал, вдруг есть что-то встроенное уже

Есть стандартный элемент БП «Привязать процесс к объекту», можно брать после создания брать Id задачи и вызывать его.

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