Подскажите, как в Процессе изменить Бизнес-Правило ограничивающее доступ на редактирование поля? Какой элемент процесса нужно использовать?

Нравится

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

имеется в виду бизнес-процесс ?

Севостьянов Илья Сергеевич,

Да.

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

Итоговый результат, ИМХО - это тот кейс, который вы хотите реализовать, насколько я понял.

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

Всем доброго времени суток.
Хотелось бы узнать если ли возможность в элемент бизнес-процесса "Задание-сценарий" вставить запрос к базе данных и если есть, то можно хоть самый простой пример c Select.

Нравится

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

Сергей, такая возможность есть.
Пример можно посмотреть на академии в этой статье.

Спасибо Наталия. Буду разбираться.

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

Версия
7.9.1.3284
Нужно добавить в БП звонок-элемент чтобы его привязать к активностям и другим объектам.

Нравится

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

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

Опишите подробней ожидаемый результат выполнения такого элемента и какие бизнес-задачи вы хотите решить.
Запись можно добавить с помощью элемента [Добавить данные], указать целевой объект и заполнить связи с другими объектами.

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

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

Вы можете настроить процесс:
1. Стартовый сигнал по изменению записи в звонке, где Активность заполнена.
2. Читать данные в активности, где Id = Пункт 1. Активность.
3. Раздать права доступа на активность, где Id = Пункт 2. Id
4. Открыть страницу редактирования активности, где Id = Пункт 2. Id

Хорошо, это сделаю, но как настроить видимость кнопок звонка и эмейла в миникарточке активности, они создаются динамически. (две кнопки ля контакта и две для контрагента)

Добрый день!

Не могли бы Вы прикрепить скриншот Вашей миникарточки и код создания данных кнопок?


Вот карточка, кнопки базовые(есть еще емейл но в контакте его нет и тут его не видно)

Здравствуйте, Виталий!

Логика данной миникарточки находится в UIv2.ActivityMiniPage. Кнопки добавляются при ее создании(методы init и onEntityInitialized). Логика отображения кнопок находится в UIv2.MiniPageEntityConnectionsUtils и NUI.EmailExtendedMenu и работает именно так как Вы описали - при создании миникарточки формируется EntitySchemaQuery запрос в базу данных, и если у данного контака(контрагента) заполнена колонка телефон(e-mail) кнопка будет добавлена. Если таких данных нет - не будет и кнопки.

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

Всем добрый день!

Появилась трудность с реализацией запуска процесса "Блокировка карты" по нажатию на кнопку.
Для страницы "Карты" создал замещающую страницу BankCardPagev2. Добавил в diff создание кнопки "CardBlock", прописал метод ProcCardBlock. Создал процесс UsrCardBlock, в котором создал параметр ProcParamCardId.
Может я что забыл сделать, можете подсказать, плиз.

2) Правильно я понимаю, что для реализации запуска процесса по кнопке, сам процесс достаточно начинать с простого начального события?

P.S. Кнопка на странице появилась, при нажатии на нее выдает ошибку: "ProcessModuleUtilities is not defined"

define('BankCardPageV2', ['BankCardPageV2Resources', 'GeneralDetails'],
function(resources, GeneralDetails) {
        return {
                entitySchemaName: 'BankCard',
                details: /**SCHEMA_DETAILS*/{
        "BankAccountInBankCardDetailV2": {
                "schemaName": "BankAccountInBankCardDetailV2",
                "entitySchemaName": "BankCardBankAccount",
                "filter": {
                        "masterColumn": "Id",
                        "detailColumn": "BankCard"
                }
        }
}/**SCHEMA_DETAILS*/,
                diff: /**SCHEMA_DIFF*/[
        {
                "operation": "merge",
                "name": "StartDate",
                "values": {
                        "layout": {
                                "column": 0,
                                "row": 0,
                                "colSpan": 12,
                                "rowSpan": 1
                        }
                }
        },
        {
                "operation": "merge",
                "name": "EndDate",
                "values": {
                        "layout": {
                                "column": 0,
                                "row": 1,
                                "colSpan": 12,
                                "rowSpan": 1
                        }
                }
        },
        {
                "operation": "merge",
                "name": "BankCardStatus",
                "values": {
                        "layout": {
                                "column": 12,
                                "row": 0,
                                "colSpan": 12,
                                "rowSpan": 1
                        }
                }
        },
        {
                "operation": "insert",
                "name": "UsrBlockType",
                "values": {
                        "layout": {
                                "column": 0,
                                "row": 2,
                                "colSpan": 12,
                                "rowSpan": 1
                        },
                        "bindTo": "UsrBlockType",
                        "caption": {
                                "bindTo": "Resources.Strings.BlockTypeCaption"
                        },
                        "textSize": 0,
                        "contentType": 3,
                        "labelConfig": {
                                "visible": true
                        },
                        "enabled": true
                },
                "parentName": "StatusGroupGridLayout",
                "propertyName": "items",
                "index": 3
        },
        {
                "operation": "insert",
                "name": "UsrBlockReason",
                "values": {
                        "layout": {
                                "column": 12,
                                "row": 2,
                                "colSpan": 12,
                                "rowSpan": 1
                        },
                        "bindTo": "UsrBlockReason",
                        "caption": {
                                "bindTo": "Resources.Strings.BlockReasonCaption"
                        },
                        "textSize": 0,
                        "contentType": 3,
                        "labelConfig": {
                                "visible": true
                        },
                        "enabled": true
                },
                "parentName": "StatusGroupGridLayout",
                "propertyName": "items",
                "index": 4
        },
        {
                "operation": "insert",
                //"parentName": "LeftContainer",
                "name": "NewButton",
                "values": {
                                "itemType": Terrasoft.ViewItemType.BUTTON,
                                "style": Terrasoft.controls.ButtonEnums.style.RED,
                                "caption": "CardBlock",
                                "click": {"bindTo": "ProcCardBlock"}
                }
        }
]/**SCHEMA_DIFF*/,
                attributes: {},
                methods: {
                                ProcCardBlock: function() {
                                        var activeRowId = this.get("ActiveRow");
                                        var args = {
                                                sysProcessName: "UsrCardBlock",
                                                parameters :{
                                                        ProcParamCardID: activeRowId
                                                }
                                        };
                                ProcessModuleUtilities.runProcess(args.sysProcessName, args.parameters, this);
                                }
                        },
                rules: {},
                userCode: {}
        };
});

Нравится

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

Добрый день.
Вам нужно в первых двух строчка :

define('BankCardPageV2', ['BankCardPageV2Resources', 'GeneralDetails'],
function(resources, GeneralDetails) {

дописать ProcessModuleUtilities , это примерно выглядить должно так:

define('BankCardPageV2', ['BankCardPageV2Resources', 'GeneralDetails', 'ProcessModuleUtilities '],
function(resources, GeneralDetails, ProcessModuleUtilities ) {

Роман, спасибо!
Теперь кнопка реагирует на нажатие :)
Но появляется ошибка

"При выполнении запроса возникла ошибка
статус ответа: 404 (Not Found)
url запроса: http://172.26.20.18:81/0/ServiceModel/ProcessEngineService.svc/UsrCardB…
метод: POST
данные запроса: {}"

Исходя из ошибки, предполагаю, что у меня косяк с процессом. Сейчас процесс сделал самый простой : начальное событие простое - открыть страницу редактирования - завершающее событие.
В методе ProcCardBlock объявлен параметр ProcParamCardId, такой же параметр создал в процессе и в странице редактирования передаю ID записи значение этого параметра.
Можете подсказать, что не так или чего не сделал, чтобы верно передать в процесс ID записи и он стартанул.

С уважением,
Дмитрий

В урл видно же что параметр не передался, точнее вместо айди передалось андефайнед:
?ProcParamCardID=undefined

Т.к. вы:
var activeRowId = this.get("ActiveRow");

пытаетесь получить в карточке, в карточке нет атрибута ActiveRow, если вам нужно Id записи карточки, то так и пишите

var activeRowId = this.get("Id");

Всем большое спасибо.

Процесс запустили :)

Коллеги, добрый день.

Возникли трудности с переносом кнопки в блок кнопок "Сохранить", "Отменить", "Действия".

Как я понимаю, выбор контейнера в поле "parentName" зависит от типа страницы (новая или редактируемая).
Если использовать LeftContaner, то кнопка отлично уходит в верхний левый угол на новых записях.
А если использовать CombinedModeActionButtonsCardLeftContainer то кнопка распологается снизу слева на странице как новой так и редактируемой страницы.
Можете подсказать, что нужно изменить в коде, чтобы кнопка появились слева вверху вместе с кнопками "Сохранить", "Отменить", "Действия".

"operation": "insert",
		"parentName": "CombinedModeActionButtonsCardRightContainer",
		"propertyName" :"items",
		"name": "NewButton",
		"values": {
			"itemType": Terrasoft.ViewItemType.BUTTON,
			"style": "red",
			"caption": {"bindTo": "Resources.Strings.CardBlockCapture"},
			"click": {"bindTo": "ProcCardBlock"},
			"layout": {
				"column": 1,
				"row": 6,
				"colSpan": 1
Показать все комментарии

Здравствуйте.
У меня в бизнесс процессе в один элемент входят несколько ветвлений. И если хотя б одна срабатывает, то создается счет. Как мне сделать так чтобы если сработают две или три входящие ветки счет создавался только один. Спасибо.

Нравится

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

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

Используйте для объединения потоков перед созданиям счета элемент "И".

Но я так понимаю "И" ждет выполнения всех веток.
Мне нужно - Если у меня хотя бы одна из них выполнится - мне нужно создать один счет, но не больше.

Ну тогда используйте "Исключающее ИЛИ" - здесь все логично:smile:

Не могу понять никак. Вот У меня два из трех процессов пришли к "Исключающее ИЛИ". И каким условием мне сделать чтобы дальше процес пошел только раз к счету?

Добавьте в процесс два параметра..
1. Требутся сделать счет
2. Счет сделан
И их анализ в начале секции, создающей счет :)

Добавьте в процесс два параметра..
1. Требутся сделать счет
2. Счет сделан
И их анализ в начале секции, создающей счет :)

Добавьте в процесс два параметра..
1. Требутся сделать счет
2. Счет сделан
И их анализ в начале секции, создающей счет :)

ой.. трижды отправилось :cry:
Модератор, почистите пжлста :)

Я думал над этим вариантов, но эти ветки приходят в точку одновременно, поэтому условие проверки их всех пропустит на создание счета...

Тогда параметр "счет сделан" меняем на параметр "Счетов сделано" и смотрим, чтоб значение было меньше 2 :)

Спасибо. Уже разобрался!

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

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

Добрый день!

Для того, чтобы процесс автоматически запускался раз в N минут, необходимо в процесс поместить элемент Сценарий вида:

string schedulerJobGroupName = "MyProcessGroupMyEmail1";//- Любое имя
string jobProcessName = "UsrProcess"; //- Название процесса
string schedulerJobName = "MyJobNameMyEmail1"; //- Любое имя
int startOffset = 3600; // интервал в секундах
AppScheduler.RemoveJob(schedulerJobName, schedulerJobGroupName);
var job = AppScheduler.CreateProcessJob(schedulerJobName, schedulerJobGroupName, jobProcessName, UserConnection.Workspace.Name, UserConnection.CurrentUser.Name);
var trigger = new SimpleTriggerImpl(schedulerJobName + "Trigger", schedulerJobGroupName, DateTime.UtcNow.AddSeconds(startOffset));
AppScheduler.Instance.ScheduleJob(job, trigger);
return true;

Это работает.

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

т.е. как можно здесь применить такую формулу ?
Если 20:00 - текущее время T (интервал запуска) то запуск установить в T+12 часов

Нравится

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

Дарья, добрый день!

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

string schedulerJobGroupName = "ScheduleTest";
string jobProcessName = "UsrScheduleTest";
string schedulerJobName = "ScheduleTestJob";
TimeSpan start = TimeSpan.Parse("11:31");
TimeSpan end = TimeSpan.Parse("11:46");
TimeSpan currentTime = DateTime.Now.TimeOfDay;

if ((currentTime > start) && (currentTime < end))
{
int startOffset = 30;
AppScheduler.RemoveJob(schedulerJobName, schedulerJobGroupName);
var job = AppScheduler.CreateProcessJob(schedulerJobName, schedulerJobGroupName, jobProcessName, UserConnection.Workspace.Name, UserConnection.CurrentUser.Name);
var trigger = new SimpleTriggerImpl(schedulerJobName + "Trigger", schedulerJobGroupName, DateTime.UtcNow.AddSeconds(startOffset));
AppScheduler.Instance.ScheduleJob(job, trigger);
} else {
int startOffset = 12;
AppScheduler.RemoveJob(schedulerJobName, schedulerJobGroupName);
var job = AppScheduler.CreateProcessJob(schedulerJobName, schedulerJobGroupName, jobProcessName, UserConnection.Workspace.Name, UserConnection.CurrentUser.Name);
var trigger = new SimpleTriggerImpl(schedulerJobName + "Trigger", schedulerJobGroupName, DateTime.UtcNow.AddHours(startOffset));
AppScheduler.Instance.ScheduleJob(job, trigger);
}
return true;

Спасибо

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

Дарья, добрый день!

Вы можете проверить существующие тригера выполнив запрос в БД:
select * from QRTZ_TRIGGERS
select * from QRTZ_SIMPLE_TRIGGERS

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

Добрый день.
Столкнулись с таким странным поведением в bpm'online версии 7.2 - есть процесс, который запускается на изменение поля у объекта, потом кое-что меняется и запускается таймер для задержки, и после этого читается измененный объект и проверяем его поля, после чего выходим. И почему-то код отрабатывает только до таймера, а после этого ничего не происходит. Сужу по логам и по тому какой результат ожидаю.
При этом на другом сайте аналогичный процесс отрабатывает корректно.
Можете подсказать в чем может быть дело, куда копать, куда смотреть?
Схема процесса:

Нравится

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

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

Поищите причину в логах сервера. По умолчанию они хранятся в C://Windows/Temp/bpmonline.

Вам необходимы логи Quartz.

Как раз проблема в том, что в логах есть только что-то наподобие нижеуказанного, но про нужный процесс ничего.
Хотя как я понимаю должны быть строчки Execute - ProcessStart и Execute - ProcessFinish. Это есть, но для другого процесса.

2015-09-29 10:53:21,562 [15264] INFO  USER Quartz.Impl.AdoJobStore.JobStoreTX Instantiate - JobStoreTX initialized.
2015-09-29 10:53:21,578 [15264] INFO  USER Quartz.Core.QuartzScheduler Initialize - Scheduler meta-data: Quartz Scheduler (v2.1.2.400) 'BPMonlineQuartzScheduler' with instanceId 'auto'
  Scheduler class: 'Quartz.Core.QuartzScheduler' - running locally.
  NOT STARTED.
  Currently in standby mode.
  Number of jobs executed: 0
  Using thread pool 'Quartz.Simpl.SimpleThreadPool' - with 3 threads.
  Using job-store 'Quartz.Impl.AdoJobStore.JobStoreTX' - which supports persistence. and is clustered.
 
2015-09-29 10:53:21,579 [15264] INFO  USER Quartz.Impl.StdSchedulerFactory Instantiate - Quartz scheduler 'BPMonlineQuartzScheduler' initialized
2015-09-29 10:53:21,579 [15264] INFO  USER Quartz.Impl.StdSchedulerFactory Instantiate - Quartz scheduler version: 2.1.2.400
2015-09-29 11:17:37,676 [8480] DEBUG USER Quartz.Impl.AdoJobStore.StdRowLockSemaphore ObtainLock - Lock 'TRIGGER_ACCESS' is desired by: 
2015-09-29 11:17:37,796 [8480] DEBUG USER Quartz.Impl.AdoJobStore.StdRowLockSemaphore ExecuteSQL - Lock 'TRIGGER_ACCESS' is being obtained: 
2015-09-29 11:17:37,799 [8480] DEBUG USER Quartz.Impl.AdoJobStore.StdRowLockSemaphore ExecuteSQL - Lock 'TRIGGER_ACCESS' is being obtained: 
2015-09-29 11:17:37,800 [8480] DEBUG USER Quartz.Impl.AdoJobStore.StdRowLockSemaphore ObtainLock - Lock 'TRIGGER_ACCESS' given to: 
2015-09-29 11:17:40,027 [8480] DEBUG USER Quartz.Impl.AdoJobStore.StdRowLockSemaphore ReleaseLock - Lock 'TRIGGER_ACCESS' returned by: 
2015-09-29 11:20:00,889 [BPMonlineQuartzScheduler_Worker-1] INFO  USER Terrasoft.Core.Scheduler.RunProcessJob Execute - ProcessStart [processSchemaName:ContactProcess, processElementUId , userName:USER, workspaceName:Default]
2015-09-29 11:21:03,648 [BPMonlineQuartzScheduler_Worker-1] INFO  USER Terrasoft.Core.Scheduler.RunProcessJob Execute - ProcessFinish [processSchemaName:ContactProcess, processElementUId , userName:USER, workspaceName:Default]
2015-09-29 11:21:51,604 [10724] DEBUG USER Quartz.Impl.AdoJobStore.StdRowLockSemaphore ObtainLock - Lock 'TRIGGER_ACCESS' is desired by: 
2015-09-29 11:21:51,606 [10724] DEBUG USER Quartz.Impl.AdoJobStore.StdRowLockSemaphore ExecuteSQL - Lock 'TRIGGER_ACCESS' is being obtained: 

Если про процесс ничего не указано в данной таблице, то необходимо проверить доходит ли процесс до элемента "Таймер".

В том-то и дело, что до таймера стоит блок сценария, в котором пишутся логи. Т.е. процесс запускается, но уже потом я не вижу, что он работает после таймера. Словно процесс и не попадает в очередь к quartz.
Если вы подскажите, в какой таблице можно посмотреть запланированные процессы к выполнению или подскажите где почитать про это, буду весьма признателен. Так как уже голову сломал, что собственно не так. И почему на одном сервере это работает, а на другом тоже самое нет.

Здравствуйте, Александр. Процессы, запускающиеся по расписанию и содержащие таймер, записываются в таблицу qrtz_triggers.

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

2015-09-30 16:40:40,227 [BPMonlineQuartzScheduler_Worker-2] INFO  user Terrasoft.Core.Scheduler.RunProcessJob Execute - ProcessStart [processSchemaName:, processElementUId 743f3d6f-802f-4d9d-9fe5-3064f62a35ed, userName:userName, workspaceName:Default]
2015-09-30 16:40:44,816 [BPMonlineQuartzScheduler_Worker-2] INFO  user Terrasoft.Core.Scheduler.RunProcessJob Execute - ProcessFinish [processSchemaName:, processElementUId 743f3d6f-802f-4d9d-9fe5-3064f62a35ed, userName:userName, workspaceName:Default]

И в списке по запросу  select distinct TRIGGER_NAME from qrtz_triggers если судить из названий, то я не вижу своего процесса. Может быть есть какая-то иная таблица, или проблема в том, что судя по логу не установлено поле processSchemaName, но как его установить? Откуда его берет процесс?

Поставьте журналируемый элемент "Чтение данных" перед таймером. Запустите процесс повторно. Процесс дошел до чтения данных?

Не понял, что имеется ввиду под "журналируемый элемент "Чтение данных""?
Если речь о элементе загрузки объекта, то на мой взгляд это не корректно. Так как за время задержки по таймеру, объект может измениться. Замечу, что без таймера процесс отрабатывает и на сервере, где с тамером не работает. Т.е. вся проблема когда добавляем таймер.
Для проверки наличия джобов, сделал ветку в которой с задержкой по Sleep опрашивалась таблица qrtz_triggers, но своей джобы я там не увидел. Процесс выглядит так:
Что еще можно сделать, для понимая ситуации?

1) Добавьте "Чтение данных" перед таймером. У элемента "Чтение данных" должен быть установлен признак "Журналировать" (в свойствах элемента)
2) Запустите процесс
3) Сделайте скриншот диаграммы процесса в журнале процессов и опубликуйте его здесь, пожалуйста.

Сейчас сделаю, и .. возникла проблема. Журнал процессов не работает. При переходе на закладку в Инструментах - "Журнал процессов", выдается пустая страница с ошибкой "В работе приложения BPMonline возникла ошибка. Приносим извинения за неудобства."
В логах появляется следующая ошибка:

Exception Message: Элемент с идентификатором "0d4daf80-dbef-4fef-9c8d-2e942b0a9965" не найден
Exception Type: Terrasoft.Common.ItemNotFoundException
Exception Source: Terrasoft.Core
 
Exception Stack Trace:
   at Terrasoft.Core.ManagerItemCollection`1.GetByUId(Guid uid)
   at Terrasoft.Core.Manager`2.GetInstanceByUId(Guid uid)
   at Terrasoft.WebApp.MainPageEventsProcess`1.InitScriptTaskExecute(ProcessExecutingContext context)
   at Terrasoft.Core.Process.ProcessFlowElement.Execute(ProcessExecutingContext context)
   at Terrasoft.WebApp.MainPageEventsProcess`1.ProcessQueue(ProcessExecutingContext context)
   at Terrasoft.WebApp.MainPageEventsProcess`1.OnExecuted(Object sender, ProcessActivityAfterEventArgs e)
   at Terrasoft.Core.Process.ProcessFlowElement.OnExecuted(ProcessActivityAfterEventArgs e)
   at Terrasoft.Core.Process.ProcessFlowElement.Execute(ProcessExecutingContext context)
   at Terrasoft.WebApp.MainPageEventsProcess`1.ProcessQueue(ProcessExecutingContext context)
   at Terrasoft.WebApp.MainPageEventsProcess`1.ThrowEvent(ProcessExecutingContext context, String message)
   at Terrasoft.UI.WebControls.PageSchemaUserControl.ThrowEvent(String message)
   at Terrasoft.UI.WebControls.Controls.PageContainer.LoadFromAssembly()
   at Terrasoft.UI.WebControls.Controls.PageContainer.LoadUserControl()
   at Terrasoft.UI.WebControls.Controls.PageContainer.OnInit(EventArgs e)
   at System.Web.UI.Control.InitRecursive(Control namingContainer)
   at System.Web.UI.Control.InitRecursive(Control namingContainer)
   at System.Web.UI.Control.InitRecursive(Control namingContainer)
   at System.Web.UI.Control.InitRecursive(Control namingContainer)
   at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)

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

Александр, смотреть нужно в SysProcessLog. Очень сложно понять в чем проблема. Предлагаю Вам зарегистрировать обращение, оправив письмо по адресу support [at] terrasoft.ru, приложив логи сервера для более детального анализа.

Спасибо за ответы. К сожалению в таблице SysProcessLog никакой ценной информации не обнаружил :'(
И после обсуждения и обдумывания пришлось отказаться от таймера, и реализовать это через потоки с задержкой. По крайней мере, это работает. Жаль только, что приходится столько времени тратить на "борьбу" с bpm.

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

Добрый день.
Помогите с реализацией примера процесса в BpmOnline 7.6 BankSales

1. Необходимо создать новый объект в системе без создания нового раздела.
2. Создать его страницу редактирования.
3. Добавить его как деталь в раздел Физ.Лица.
4. Создать процесс в разделе Физ.Лица. при запуске которого открывается карточка редактирования созданного объекта с заполненным полем выбранного Физ. лица. и после сохранения карточки создается задача на пользователя.

Реализация на текущий момент:
1. Создал объект "Согласование отпуска" с полями Физ.Лицо., Заголовок, Ответственный
2. Создал новую деталь в разделе Физ.Лица с помощью мастера деталей
3. Зарегистрировал созданную мастером страницу редактирования с помощью процедуры
EXEC [dbo].[tsp_RegisterPage]
@ModuleEntityName = N'nfcMatchingAbsent',
@PageName = N'nfcnfcMatchingAbsent1Page',
@TypeColumnUId = NULL,
@TypeValue = NULL,
@AddMenuCaptionRus = NULL,
@AddMenuCaptionEng = NULL,
@CardHeaderCaptionRus = NULL,
@CardHeaderCaptionEng = NULL
4. Создал процесс, и добавил элемент страница редактирования.
5. В поле страница элемента редактирования "Страница редактирования" моя зарегистрированная страница не появилась.
6. Вписал значения страницы и объекта вручную (Id объектов в переменные ObjectSchemaId и PageSchemaId).
7. Установил значение по умолчанию Физ.Лицо
8. Опубликовал процесс.
9. При запуске процесса в консоли возникает ошибка:
В консоли опять ошибка Uncaught TypeError: Cannot read property 'cardSchema' of undefined
:8075/core/e995a30a7af7cc9773586f5211d95c73/Terrasoft/amd/core.js:555 user: Supervisor/7f3b869f-34f3-4f20-ab4d-7480a5fdf647
file: http://ччч.ru:8075/0/configuration/75c5ed49bdf66b4c26da63b1d93b3572/ConfigurationBootstrap.js
line: 6064
message: Uncaught TypeError: Cannot read property 'cardSchema' of undefined

Нравится

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

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

"Илья Т." написал:

Добрый день.

Помогите с реализацией примера процесса в BpmOnline 7.6 BankSales

2. Создал новую деталь в разделе Физ.Лица с помощью мастера раздела

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

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

2) Создайте деталь на основе объекта, созданного в первом пункте. Деталь создается с использованием мастера детали.

3) Выведите созданную деталь в нужный раздел, используя мастер раздела в нужном разделе (прошу прощения за тавтологию).

Итог: у Вас есть страница редактирования и деталь, которые смотрят в один объект.

4) В бизнес процессе выберите страницу редактирования созданного раздела.
При выполнении процесса будет открываться страница редактирования раздела. Данные, внесенные пользователем, будут сохранятся в созданном объекте и будут отображаться на детали.

Второе - создать свою страницу редактирования, используя навыки программирования на Java Script, унаследовав, например, базовую страницу редактирования справочников. После этого, созданную страницу необходимо зарегистрировать в качестве страницы редактирования, используя хранимую процедуру [dbo].[tsp_RegisterPage].

Алексей, ошибся, создал деталь с помощью мастера деталей.

И получается что на каждый новый объект нужно создавать технический раздел?
Это очень неэкономный способ. Так как параллельно создается множество иных объектов. И еще существует ограничение по длине названия создаваемого объекта.
И как быть если я хочу отобразить карточку уже существующего объекта? Например страницу редактирования Адреса?

Илья, для этого есть преднастроенная страница.
Преднастроенная страница хранит Id создаваемой записи. После преднастроенной страницы элементом "Изменить данные" созданная запись привязывается к нужному Контакту/Контрагенту.

Алексей, а можно ли как то передавать значения по умолчанию в элемент "преднастроенная страница" без создания промежуточных страниц?
Как показано здесь http://www.community.terrasoft.ru/img/video/lms/28/story.html это также очень затратный способ.

Либо как на видео, либо указывать параметры, как я написал в предыдущем своем посте.

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

Добрый день!
Есть такой процесс в ITIL - процесс наполнения очередей единого окна,
который запускается автоматически ( когда пользователь в системе) каждые 5 минут ( в соответствии с указанным интервалом-системной настройкой "интервал обновления очередей единого окна")

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

Нравится

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

Здравствуйте, Дарья!

Эта логика прописана в самом процессе - перед завершением он записывает время своего следующего выполнения в планировщик, предварительно "посмотрев" на системную настройку.

Вот такой он бессмертный!

Добрый день, Александр!
Спасибо за секрет бессмертия))
Видела элемент в процессе "актуализировать задание планировщика"
UserConnection userConnection = context.UserConnection;
Terrasoft.Configuration.QueuesUtilities.UpdateQueuesTrigger(userConnection);
return true;

Но не поняла до конца, где находится сам планировщик, что он собой представляет в bpm? - (хотела бы записывать туда время выполнения еще одного процесса)

Здравствуйте, Дарья!
Александр Вам в этом случае не поможет - будет помогать Алексей.:smile:

Добавьте в задание-сценарий код:

string schedulerJobGroupName = "MyProcessGroup";//- Любое имя
string jobProcessName = "ProcessingEmail"; //- Название процесса
string schedulerJobName = "MyJobName"; //- Любое имя
int startOffset = 30; //- Количество секунд до старта
AppScheduler.RemoveJob(schedulerJobName, schedulerJobGroupName);
var job = AppScheduler.CreateProcessJob(schedulerJobName, schedulerJobGroupName, jobProcessName, UserConnection.Workspace.Name, UserConnection.CurrentUser.Name);
var trigger = new SimpleTriggerImpl(schedulerJobName + "Trigger", schedulerJobGroupName, DateTime.UtcNow.AddSeconds(startOffset));
AppScheduler.Instance.ScheduleJob(job, trigger);
return true;

Укажите в Usings Quartz.Impl.Triggers (с пустым псевдонимом), Quartz (с псевдонимом Quartz ), Terrasoft.Core.Scheduler (с пустым псевдонимом).

спасибо, Алексей))

Добрый день!
Попробовала так и сделать..
Процесс состоит из задачи и задания-сценарий, в котором прописан указанный код, перезапускающий данный процесс
Но почему-то перезапуска не происходит, просто процесс завершается

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

спасибо, все получилось)

Добрый день, при использовании следующего кода

string schedulerJobGroupName = "MyProcessGroup";//- Любое имя
string jobProcessName = "ProcessingEmail"; //- Название процесса
string schedulerJobName = "MyJobName"; //- Любое имя
int startOffset = 30; //- Количество секунд до старта
AppScheduler.RemoveJob(schedulerJobName, schedulerJobGroupName);
var job = AppScheduler.CreateProcessJob(schedulerJobName, schedulerJobGroupName, jobProcessName, UserConnection.Workspace.Name, UserConnection.CurrentUser.Name);
var trigger = new SimpleTriggerImpl(schedulerJobName + "Trigger", schedulerJobGroupName, DateTime.UtcNow.AddSeconds(startOffset));
AppScheduler.Instance.ScheduleJob(job, trigger);
return true;

В 7.5 все работает нормально, в 7.7 выдает следующую ошибку
1
В чем может быть ошибка и как ее исправить?

Добрый день!

Пример добавления триггера в планировщик для версии 7.7:
var userConnection = Get("UserConnection");
string schedulerJobGroupName = "MyProcessGroup";//- Любое имя
string jobProcessName = "UsrTestScheduler"; //- Название процесса
string schedulerJobName = "MyJobName"; //- Любое имя
int startOffset = 20; //- Количество секунд до старта
AppScheduler.RemoveJob(schedulerJobName, schedulerJobGroupName);
var job = AppScheduler.CreateProcessJob(schedulerJobName, schedulerJobGroupName, jobProcessName, userConnection.Workspace.Name, userConnection.CurrentUser.Name);
var trigger = new SimpleTriggerImpl(schedulerJobName + "Trigger", schedulerJobGroupName, DateTime.UtcNow.AddSeconds(startOffset));
AppScheduler.Instance.ScheduleJob(job, trigger);
return true;

Добрый день!
При попытке использовать следующий код, который привел Олег

var userConnection = Get("UserConnection");
string schedulerJobGroupName = "MyProcessGroup";//- Любое имя
string jobProcessName = "UsrTestScheduler"; //- Название процесса
string schedulerJobName = "MyJobName"; //- Любое имя
int startOffset = 20; //- Количество секунд до старта
AppScheduler.RemoveJob(schedulerJobName, schedulerJobGroupName);
var job = AppScheduler.CreateProcessJob(schedulerJobName, schedulerJobGroupName, jobProcessName, userConnection.Workspace.Name, userConnection.CurrentUser.Name);
var trigger = new SimpleTriggerImpl(schedulerJobName + "Trigger", schedulerJobGroupName, DateTime.UtcNow.AddSeconds(startOffset));
AppScheduler.Instance.ScheduleJob(job, trigger);
return true;

Выдает следующую ошибку:
1

Олег,

Извиняюсь, глаз замылился;) Текст в треугольных скобках в комментах опускается.

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

"Зарицкий Олег" написал:Пример добавления триггера в планировщик для версии 7.7:

Пора в документацию вставлять

Владимир, скоро появится.

"Зарицкий Олег" написал:

Владимир, скоро появится.

Здравствуйте! Каким образом можно в бизнес-процессе не только создавать триггер в планировщик, но и во всех активностях, где Завершение < DateTime.Now, устанавливать “Просроченная активность” = true?
(чекбокс “Просроченная активность” - пользовательское поле, созданное нами)

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

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

В фильтре укажите "Завершение" <= "Текущий час" и "Завершение" <= "Сегодня".

"Демьяник Алексей" написал:

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

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

В фильтре укажите "Завершение" <= "Текущий час" и "Завершение" <= "Сегодня".

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

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

"Демьяник Алексей" написал:

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

Планировщик на каждые, допустим, 5 минут + описанный вами процесс - единственно возможное решение кейса, Алексей? Или можете подсказать еще какое-то решение?

Здравствуйте!
Не получается в sales team 7.8 реализовать в бизнес-процессе, чтобы активности отмечались просроченными, если Завершение <= Текущие дата и время.

Бизнес-процесс состоит из элемента "Задание-сценарий" (там размещен код планировщика) и из элемента "Изменить данные активности", где Данные какого объекта изменить: Активность, а в фильтре указано, что менять нужно активности, у которых Состояние не равно "Завершена" И Завершение <=Текущие дата и время (Текущие дата и время - это параметр процесса со значением "[#Системная переменная.Текущее значение даты и времени#]").

Проблема: планировщик запускается с нужным интервалом, но меняет все незавершенные активности, игнорируя фильтр по дате завершения в элементе "Изменить данные активности". Что делаю неправильно?
Предложенный Алексеем вариант условия "Завершение" <= "Текущий час" и "Завершение" <= "Сегодня" также не работает.

Также пробовали в элементе "Изменить данные активности" в фильтре указывать условия:

Состояние не равно Завершена
И
Завершение<Текущие дата и время (где Текущие дата и время - параметр процесса со значением "[#Системная переменная.Текущее значение даты и времени#]").

С данными настройками процесс вообще перестал менять активности.

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

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

Планировал процесс следующим образом:

// Задание интервала запуска процесса (в минутах).
        int minutleyInterval = IntervalContentEngine;
        var jobName="sxContentEngineProcessJob";
        var jobGroup="RefreshFromContentEngineProcessGroup";
       
if(!AppScheduler.DoesJobExist(jobName,jobGroup)){

        // Добавление задания по запуску процесса в планировщик.
        AppScheduler.ScheduleMinutelyProcessJob(jobName, jobGroup, "sxContentEngineProcess",
            UserConnection.Workspace.Name, UserConnection.CurrentUser.Name, minutleyInterval);
}

Нравится

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

Здравствуйте, Александр!

Если у Вас on-demand, то следующий абзац можно упустить.
Для того, чтобы процессы постоянно, а главное вовремя, запускались, должны быть выполнены два условия:
1) Пул приложения должен быть запущен
2) Сайт должен работать

Чтобы выполнялось первое условие, установите таймаут простоя IIS равным 0:

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

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

Алексей, вроде бы получилось, спасибо!
Полностью проверить удастся завтра.
Также, если кому-то пригодится, smarterPing нужно устанавливать через имеющийся bat-файл из командной строки,запущенной от имени администратора.

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