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

Нравится

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

С привязкой не получалось сделать, а вот как просто запустить процесс из кода можно в этой теме глянуть https://community.terrasoft.ru/questions/mnogokratnyi-zapusk-bp-s-razny…

 

Пример, где SxRecalcPotentialInOppNeed название запускаемого процесса, в Dictionary параметры передаваемые процессы :

UserConnection.ProcessEngine.ProcessExecutor.Execute("SxRecalcPotentialInOppNeed", 
new Dictionary<string, string> {
 
	{ "OpportunityId", opportunityId.ToString() }
 
});

 

Трефилов Павел Сергеевич,

Это я знаю. Мне нужно именно с привязкой к основному это сделать. 

Можно открыть код какого-нибудь компилируемого БП, где есть элемент ProcessSchemaSubProcess и посмотреть, как с ним работают в автогенерируемом коде. Например, в ContactAgeActualizationRunnerProcess подпроцесс определяется так:

ProcessSchemaSubProcess actualizecontactagesubprocess = CreateActualizeContactAgeSubprocessSubProcess();
FlowElements.Add(actualizecontactagesubprocess);
...
protected virtual ProcessSchemaSubProcess CreateActualizeContactAgeSubprocessSubProcess() {
	ProcessSchemaSubProcess schemaActualizeContactAgeSubprocess = new ProcessSchemaSubProcess(this) {
		UId = new Guid("845629d7-6a9f-47ae-8c06-0703688e57ce"),
		ContainerItemIndex = 0,
		ContainerUId = new Guid("d0f0790b-45ea-4f02-b60d-7200272e0e16"),
		CreatedInOwnerSchemaUId = new Guid("bb4d6607-026b-4b27-b640-8f5c77c1e89d"),
		CreatedInPackageId = new Guid("524f976c-dc16-4613-afcd-8360daff9aa0"),
		CreatedInSchemaUId = new Guid("db59d752-4f9e-4fcf-b854-d2eaa0b1f259"),
		EntitySchemaUId = Guid.Empty,
		IsForCompensation = false,
		IsLogging = true,
		ManagerItemUId = new Guid("49eafdbb-a89e-4bdf-a29d-7f17b1670a45"),
		ModifiedInSchemaUId = new Guid("db59d752-4f9e-4fcf-b854-d2eaa0b1f259"),
		Name = @"ActualizeContactAgeSubprocess",
		Position = new Point(505, 166),
		SchemaUId = new Guid("51734939-e406-46f0-b832-0b87c66b860b"),
		SerializeToDB = true,
		Size = new Size(69, 55),
		TriggeredByEvent = false,
		UseBackgroundMode = false,
		UseLastSchemaVersion = false
	};
	InitializeActualizeContactAgeSubprocessParameters(schemaActualizeContactAgeSubprocess);
	return schemaActualizeContactAgeSubprocess;
}

Там же есть функция создания его параметров. Но с использованием этого всего вручную нужно быть осторожным, ничего не пропустить.

 

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

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

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

Для этого необходимо:
1) в Using добавить

global::Common.Logging

2) в коде использовать

var _log = LogManager.GetLogger("BusinessProcess");
var processName = "MyProcess"; //Название процесса для простого поиска логов
_log.DebugFormat(@"{0}: Process was started", processName); //Уровень логирования Debug
_log.InfoFormat(@"{0}: Process was started", processName); //Уровень логирования Info
_log.WarnFormat(@"{0}: Process was started", processName); //Уровень логирования Warn
_log.ErrorFormat(@"{0}: Process was started", processName); //Уровень логирования Error

Если сайт развернут в облаке (cloud), то логи можно получить обратившись в техническую поддержку.
Если же сайт размещен на своих серверах (on-site), то логи необходимо искать по пути C:\Windows\TEMP\Creatio\SiteName\0\Log (этот путь может быть изменен в файле nlog.targets.config, параметр LogDir).

Для уровня логирования Debug и Info логи запишутся в файл Common.log, а для уровня Error - в файл Error.log
По умолчанию минимальный уровень логирования в on-site для логера "Common" указан Info. Изменить его можно в файле ..\Terrasoft.WebApp\nlog.config

<logger name="*" writeTo="commonAppender" minlevel="Info" maxlevel="Warn" />

 

Нравится

Поделиться

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

Добрый день!

Подскажите, есть ли порядок в котором стартуют Бизнес-процессы в следующей ситуации (пример): 

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

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

Оба запустятся одновременно или сначала отрабатывают БП на кейсе?

Нравится

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

Оба запустится одновременно.

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

Коллеги, такой вопрос. При запуске кейса в Лидах он стартует со второй стадии, хотя на среде разработки работает корректно, значения по умоланию для стадии в объекте верное, другие процессы не запускаются.

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

Нравится

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

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

А как создаются данные лиды? Если приходят из Landing page, то ещё в конфигурации Landing page могут указываться значения по умолчанию, в том числе для стадий

Alex Zaslavsky,

Нет, замещенного процесса нет. Процессы посторонние не запускаются, даже все базовые не активны (по лид-менеджменту)

Владимир Соколов,

Нет, создаются по процессу

Вообще, кейс не «стартует», на полосе просто отображается текущее значение справочного поля «стадия», плюс логика при изменении и условия допустимости переходов. Следовательно, нужно понять, кто и когда задаёт значение в поле.

Это может быть значение поля по умолчанию в дизайнере объекта «Лид» в одном из пакетов, в них же логика во встроенных БП на объекте «Лид», отдельные БП на событии создания или изменения лида, логика в событийном слое, триггер или значение по умолчанию в БД или, наконец, JS-логика на стороне карточки. Если создать тестовую запись на уровне ESQ (не сработает логика карточки) и на уровне Insert-запроса (сработает только логика БД), можно подтвердить или отсеять два последних варианта. Остальные нужно проверять, изучая все места вручную.

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

Было бы очень прекрасно (и в том числе с т.з. производительности БП) дать возможность выбирать поля связанных объектов в выборку стандартного элемента БП "Читать данные".

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

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

Здравствуйте, Игорь!

Передали данное пожелание команде разработки для анализа возможности внедрения такой возможности в будущих версиях продукта.

Пока есть обходной вариант получения информации двумя чтениями.

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

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

Теперь задача вызвать этот же процесс, если сменилась группа ответственных. Вроде бы все просто - сделал еще одно стартовое событие и смотрю на изменение поля. Но вот беда. Процесс вызывает себя же после того как стартовал по первому событию.

Прихожу к выводу, что при изменении группы ответственных надо знать еще и предыдущее значение группу. Если оно было пустое, то процесс не вызывать. Только вот как реализовать?

Нравится

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

Добрый день.

Если хотите сравнивать значения до и после, то есть 2 варианта.

1. Запускать процесс не по сигналу, а из клиентских скриптов, например, из карточки редактирования обращения.

2. Реализовать данную логику через событийные процессы схемы таблицы на серверной стороне.

И в одном, и в другом случае есть возможность сравнить значение до изменения и после.

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

Добрый день.

Если хотите сравнивать значения до и после, то есть 2 варианта.

1. Запускать процесс не по сигналу, а из клиентских скриптов, например, из карточки редактирования обращения.

2. Реализовать данную логику через событийные процессы схемы таблицы на серверной стороне.

И в одном, и в другом случае есть возможность сравнить значение до изменения и после.

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

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

Всем доброго времени суток! Столкнулся со следующей проблемой. Есть БП который запускается после изменения записи, в нем есть скрипт-таск в котором определяется заголовок Origin - System.Web.HttpContext.Current.Request.Headers["Origin"], если изменение производились через карточку записи то заголовок присутствовал и процесс шел по одной ветке, если же изменение произошло кодом через интеграцию, то заголовок был пустой. Это работало до недавнего времени, сейчас же System.Web.HttpContext.Current == null.

Кто нибудь с таким сталкивался?

Нравится

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

Разобрался, в настройке начального сигнала стояло выполнять след. эл-ты в фоне. Из-за этого не читалось.

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

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

Добрый день, форумчане)

Всегда был интересен вопрос след. характера:

В чём отличие типа данных у параметра БП таких как Уникальный идентификатор и Справочник?

Может в Справочник можно как-то внутрь заглянуть и вытянуть displayValue, избегая запрос к root таблице?

Сталкивался кто с подобным, интересен опыт Ваш.

Нравится

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

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

_processSchemaParameter1 = () => { return (Guid)(new Guid("b06f1e0e-f46b-1410-7190-00155d043204")); };
_processSchemaParameter2 = () => { return (Guid)(new Guid("b06f1e0e-f46b-1410-7190-00155d043204")); };
...
private Func<Guid> _processSchemaParameter1;
public virtual Guid ProcessSchemaParameter1 {
	get {
return (_processSchemaParameter1 ?? (_processSchemaParameter1 = () => Guid.Empty)).Invoke();
	}
	set {
_processSchemaParameter1 = () => { return value; };
	}
}
 
private Func<Guid> _processSchemaParameter2;
public virtual Guid ProcessSchemaParameter2 {
	get {
return (_processSchemaParameter2 ?? (_processSchemaParameter2 = () => Guid.Empty)).Invoke();
	}
	set {
_processSchemaParameter2 = () => { return value; };
	}
}
...
private void WritePropertyValues(DataWriter writer, bool useAllValueSources) {
	if (!HasMapping("ProcessSchemaParameter1")) {
writer.WriteValue("ProcessSchemaParameter1", ProcessSchemaParameter1, Guid.Empty);
	}
	if (!HasMapping("ProcessSchemaParameter2")) {
writer.WriteValue("ProcessSchemaParameter2", ProcessSchemaParameter2, Guid.Empty);
	}
}
 
...
protected override void InitializeMetaPathParameterValues() {
	base.InitializeMetaPathParameterValues();
	MetaPathParameterValues.Add("e0873088-8334-4b85-96a4-fa3e5ecb7374", () => ProcessSchemaParameter1);
	MetaPathParameterValues.Add("246467c7-071b-4cb0-8073-30c4f72be120", () => ProcessSchemaParameter2);
...	
protected override void ApplyPropertiesDataValues(DataReader reader) {
	base.ApplyPropertiesDataValues(reader);
	bool hasValueToRead = reader.HasValue();
	switch (reader.CurrentName) {
case "ProcessSchemaParameter1":
	if (!hasValueToRead) break;
	ProcessSchemaParameter1 = reader.GetValue<System.Guid>();
break;
case "ProcessSchemaParameter2":
	if (!hasValueToRead) break;
	ProcessSchemaParameter2 = reader.GetValue<System.Guid>();
break;
	}
}
...

А в метаданных:

      "Parameters": [
        {
          "TypeName": "Terrasoft.Core.Process.ProcessSchemaParameter",
          "UId": "e0873088-8334-4b85-96a4-fa3e5ecb7374",
          "Name": "ProcessSchemaParameter1",
          "CreatedInSchemaUId": "f4c123c0-d628-4d9f-867c-6c0b78c86395",
          "ModifiedInSchemaUId": "f4c123c0-d628-4d9f-867c-6c0b78c86395",
          "DataValueType": "b295071f-7ea9-4e62-8d1a-919bf3732ff2",
          "SourceValue": {
            "Source": 3,
            "Value": "[#Lookup.c449d832-a4cc-4b01-b9d5-8a12c42a9f89.b06f1e0e-f46b-1410-7190-00155d043204#]",
            "ModifiedInSchemaUId": "f4c123c0-d628-4d9f-867c-6c0b78c86395"
          },
          "ReferenceSchemaUId": "c449d832-a4cc-4b01-b9d5-8a12c42a9f89"
        },
        {
          "TypeName": "Terrasoft.Core.Process.ProcessSchemaParameter",
          "UId": "246467c7-071b-4cb0-8073-30c4f72be120",
          "Name": "ProcessSchemaParameter2",
          "CreatedInSchemaUId": "f4c123c0-d628-4d9f-867c-6c0b78c86395",
          "ModifiedInSchemaUId": "f4c123c0-d628-4d9f-867c-6c0b78c86395",
          "DataValueType": "23018567-a13c-4320-8687-fd6f9e3699bd",
          "SourceValue": {
            "Source": 3,
            "Value": "[#Lookup.c449d832-a4cc-4b01-b9d5-8a12c42a9f89.b06f1e0e-f46b-1410-7190-00155d043204#]",
            "ModifiedInSchemaUId": "f4c123c0-d628-4d9f-867c-6c0b78c86395"
          }
        }
      ],

То есть разницы практически нет, хотя внешний вид и интерфейс выбора значения разные.

Также на значения параметров в выполняющемся процессе можно посмотреть запросом в базу:

select top 10 *, cast(PropertiesData as varchar(max)) from SysProcessData

Там для параметров видно тоже только Id.

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

Добрый день господа.

Существует раздел задания в котором есть поле ответственный и (дата)крайний срок, необходимо чтобы за (N) дней ответственному приходило уведомление о приближении срока заявки с ссылкой соответственно.

Пробовал создавать БП , хоть и опыта нет.

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

Нравится

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

Здравствуйте, Кирилл! В активности есть параметр напомнить ответственному(чек-бокс) + дата напоминания - http://prntscr.com/orgt25, можете рассчитывать необходимую дату и время напоминания при формировании активности и заполнять.

Здравствуйте, Кирилл! В активности есть параметр напомнить ответственному(чек-бокс) + дата напоминания - http://prntscr.com/orgt25, можете рассчитывать необходимую дату и время напоминания при формировании активности и заполнять.

Нигрескул Алексей,  отлично я создал БП в котором один элемент "Добавить данные"  и с помощью которого успешно  добавляются данные в активность обрабатывая объект "задание", все замечательно но вот когда уведомление приходит юзеру в заголовке просто текст c ссылкой на активность , можно ли эту ссылку на свою запись "Задание" перебить?

А зачем Вы пишете курсивом?

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

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

Всем привет.

Версия 7.11.0.3122

Товарищи возникла проблема.

Пеезжаем на другой сервер, crm систему перенесли,базу тоже. В систему пускает, данные показывает.

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

Компиляция, перегенерация  нифига не помогают.

Помогите пжлста

Нравится

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

Похоже, на новом сервере не настроили веб-сокеты.

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