Вопрос

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

На разных средах разные ошибки:

System.NullReferenceException: Object reference not set to an instance of an object.
   at Terrasoft.Mail.MailSynchronizer.SyncImapMail()
   at Terrasoft.Core.Process.SyncImapMail.ScriptTask1Execute(ProcessExecutingContext context)
   at Terrasoft.Core.Process.ProcessFlowElement.Execute(ProcessExecutingContext context)
System.ArgumentException: user does not have mail account
   в Terrasoft.Core.Process.SyncImapMail.ScriptTask1Execute(ProcessExecutingContext context)
   в Terrasoft.Core.Process.ProcessFlowElement.Execute(ProcessExecutingContext context)

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

У меня такой же вопрос

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

Гм в вашем сообщении все же ясно написано

ArgumentException: user does not have mail account

 

Настройте почту у пользователя!

Григорий Чех,

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

См решение тут

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

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

Использую библиотеку Quartz для запуска БП по расписанию:
 

public virtual void CreateJob(string jobName, string jobGroup, string triggerName, string process, DateTime start, Dictionary<string,object> parameters)
        {
            var workspace = UserConnection.Workspace.Name;
            var userName = UserConnection.CurrentUser.Name;
            IJobDetail job = AppScheduler.CreateProcessJob(jobName, jobGroup, process, workspace, userName, parameters);
 
            var trigger = TriggerBuilder.Create().WithIdentity(triggerName, jobGroup).StartAt(start)
                .WithSimpleSchedule(i => i.WithIntervalInHours(24).RepeatForever()).Build();
            var task = AppScheduler.Instance.ScheduleJob(job, trigger);
        }

В таблице триггеров записи создаются, но процесс почему то не запускается:
http://prntscr.com/mgde38
 

Подскажите в чем может быть проблема.

Сайт развернут локально. 

У меня такой же вопрос

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

Очевидно где то ошибся может некоректно указал расписание, название процесса и тд.

Так же посмотрите рекомендации по разрешению проблем с шедулером тут

А чем тебе стандартный элемент БП запуск по таймеру не устраивает? Там же можно выбрать расписание запуска БП, если конечно ты работаешь с более менее новой версией bpmonline!

Очевидно где то ошибся может некоректно указал расписание, название процесса и тд.

Так же посмотрите рекомендации по разрешению проблем с шедулером тут

А чем тебе стандартный элемент БП запуск по таймеру не устраивает? Там же можно выбрать расписание запуска БП, если конечно ты работаешь с более менее новой версией bpmonline!

Григорий Чех,

Стандартный элемент не решает поставленной задачи

Причину неработоспособности нужно ещё смотреть по другим таблицам, названия которых начинаются на QRTZ, а также в текстовом файле Scheduler.log за нужную дату на сервере IIS. По ссылке, которую дал Григорий, есть различные советы по устранению.

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

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

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

Реальный, частый кейс:

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

Очень хотелось бы иметь возможность в конструкторе бп установить признак для процесса "Запускать поверх других процессов". В данном случае у пользователя запускался процесс создание счета и договора.

У меня такой же вопрос

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

А если и у второго процесса галка стоит, что делать? Ещё одну настройку добавлять, «Запускать поверх вообще всех процессов»?

В таких случаях будет лучше переработать логику процессов: либо отключить стандартные и интегрировать их логику в свой процесс, либо разбить свой на несколько отдельных частей, которые завершаются поочерёдно.

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

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

П.С. Я не говорю про вариант подвязывания скрипта для кнопки создания продажи или счета.

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

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

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

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

Простейший кейс: У вас в бп 2 задачи, всего 2 задачи. Выполнятся бп начал при изменении статуса продажи, соответственно перед Вами открылась карточка задачи. В задаче написано: "Александр, дорогой, пожалуйста, создай счет к заказу, который связан с продажей". В задаче, естественно, есть связь с заказом.
Внимание, Александр, вопрос: как так переделать и оптимизировать наш с вами бп из двух задач, чтобы мы могли перейти сразу из этой задачи в заказ и нажать кнопку "Создать счет", чтобы у нас открылась картчочка счета и перенеслись туда продукты ? Вы там про автогенерируемые и преднастроенные страницы говорили, как там они перед нами появятся, если можно скриншотик.

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

Добрый день, Д. В таком случае попробуйте прямо в этом БП сделать не 2 блока, а 6, при этом вторые 2 будут связаны с заказом, а третьи 2 — со счётом. Если пользователь будет идти по процессу, ему не нужно будет ни вручную создавать счёт, ни нажимать дополнительные кнопки в карточках, а карточка нового счёта  с уже заполненными полями связи с продажей и заказом автоматически появится при сохранении заказа в соответствии с логикой процесса. Дополнительную информацию пользователю, что от него хочет в этот момент система, можно показывать как раз в автогенерируемых страницах.

Коллеги, если есть возможность создать такой признак (стартовать бп поверх запущенного), это будет супер.
Спасибо.

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

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

Коллеги, подскажите возможно ли запускать БП и передавать в него параметры из серверного кода? Если да, просьба скинуть примеры.

Заранее благодарен.

У меня такой же вопрос

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

Как то так 

using Terrasoft.Core;
using Terrasoft.Core.Process;
using Terrasoft.Core.Process.Configuration;
 
ProcessSchema schema = UserConnection.ProcessSchemaManager.GetInstanceByName("LeadManagement");
//schema = UserConnection.ProcessSchemaManager.GetInstanceByUId(leadManagementProcessUId);
 
//Разные движки для интерпритируемых и компилироуемых БП
bool canUseFlowEngine = ProcessSchemaManager.GetCanUseFlowEngine(UserConnection, schema);
if(canUseFlowEngine) {
	var flowEngine = new FlowEngine(UserConnection);
	var param = new Dictionary<string, string>();
	param["LeadId"] = Entity.Id.ToString();
	flowEngine.RunProcess(schema, param);
} else {
	Process process = schema.CreateProcess(UserConnection);
	process.SetPropertyValue("LeadId", Entity.Id);
	process.Execute(UserConnection);
}		

 

Как то так 

using Terrasoft.Core;
using Terrasoft.Core.Process;
using Terrasoft.Core.Process.Configuration;
 
ProcessSchema schema = UserConnection.ProcessSchemaManager.GetInstanceByName("LeadManagement");
//schema = UserConnection.ProcessSchemaManager.GetInstanceByUId(leadManagementProcessUId);
 
//Разные движки для интерпритируемых и компилироуемых БП
bool canUseFlowEngine = ProcessSchemaManager.GetCanUseFlowEngine(UserConnection, schema);
if(canUseFlowEngine) {
	var flowEngine = new FlowEngine(UserConnection);
	var param = new Dictionary<string, string>();
	param["LeadId"] = Entity.Id.ToString();
	flowEngine.RunProcess(schema, param);
} else {
	Process process = schema.CreateProcess(UserConnection);
	process.SetPropertyValue("LeadId", Entity.Id);
	process.Execute(UserConnection);
}		

 

Григорий Чех,

благодарю

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

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

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

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

Если запускать этот БП вручную, он успешно отрабатывает. При вызове из задания (QuartzScheduler) - падает на шаге генерации ПФ.

ПФ генерируется в ScriptTask с помощью вызова ReportService:

var reportData = reportService.GenerateMSWordReport(templateId, recordId, convertInPDF);

Шаг падает со следующим Exception:

System.NullReferenceException: Object reference not set to an instance of an object.
   at Terrasoft.Configuration.ReportService.ReportService..ctor()
   at Terrasoft.Core.Process.UsrOutdatedTSActNotif.ScriptTask2Execute(ProcessExecutingContext context)
   at Terrasoft.Core.Process.ProcessFlowElement.Execute(ProcessExecutingContext context)

У меня такой же вопрос

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

Здравствуйте, вероятно при работе планировщика нет userconnection-а, попробуйте из стороннего c# кода вызвать свой бп с формированием отчета:
https://academy.terrasoft.ru/documents/technic-sdk/7-7-0/zapusk-process…
если получится, то сделайте бп который будет работать по планировщику, и вызывать таким же образом образом другой бп с формированием отчета.
Такой вызов должен эмулировать нормальный заход пользователя на сайт (авторизация) и запуск процесса как бы в ручном режиме.

Илья,
большое спасибо, помогло.

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

Возможно есть какой-то более простой способ получить UserConnection в БП, запускаемом из Quartz?

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

В создании дополнительно пользователя нет необходимости.
Будет подтягиваться userconnection пользователя, которого вы укажите при создании job’а.
Условно:

string userName = userConnection.CurrentUser.Name;
AppScheduler.ScheduleMinutelyProcessJob(schedulerJobName, schedulerJobGroupName, jobProcessName, solutionName, userName, minutleyInterval, isSystemUser : true);

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

Добрый день!
Подскажите пожалуйста, как в BPMOnline программно запустить БП и передать ему параметры?
Буду благодарен за пример.

У меня такой же вопрос

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

1)приведите пожалуйста пример
2) укажите продукт и версию продукта (5.4.0.195 - пример)

"Sergey Karpenko" написал:

1)приведите пожалуйста пример
2) укажите продукт и версию продукта (5.4.0.195 - пример)


1) Необходимо запустить БП из карточки лида (по факту квалификации). Использовать задачу "подпроцесс" не могу из-за проблем описанных в Как вызвать БП из процесса карточки (по событию). Хотел использовать программный запуск как обходной вариант.
2) BPMOnline CRM OnDemand Версия 5.4.0.195

Валерий, программно конечно можно запустить БП, но можно ведь обойтись и без кода, настроив БП на автоматический запуск по сигналу (добавлен новый контрагент + еще один сигнал добавлен новый контакт), вторым шагом в процессе установить проверку: если у контакта\контрагента записи на детали "Лиды" существуют (Account.LeadId != null, Contact.LeadId !+ null), значит он был создан в рамках квалификации, значит продолжаем выполнения БП, в противном случае - "конец".

Дмитрий, спасибо за ответ.
Да, действительно, такой вариант можно использовать, но мне кажется программный подход здесь будет более элегантным.
И если есть открытый API для вызова БП, то хотелось бы о нем знать. Хотя бы для общего развития :)

попробую уточнить у разработки, сообщу по результатам.

Валерий,

Программно запустить бизнес-процесс BPMonline можно через веб-сервис. Более подробно об этом изложено в статье SDK http://www.terrasoft.ua/bpmonlinesdk/WorkWithBpmByWebServices.html

Коллеги посоветовали :)

var manager = UserConnection.ProcessSchemaManager;
var processSchema = manager.GetInstanceByName("MyProcess");
var process = processSchema.CreateProcess(UserConnection);
if (processSchema.Parameters.ExistsByName("MyParameter")) {
process.SetPropertyValue(“MyParameter”, “value”);
}
process.Execute(Page.UserConnection);

приятно работы :)

Коллеги, огромное спасибо за помощь! Все работает.

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

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

В случае необходимости иметь возможность запустить БП путем перехода по гиперссылке, например в формате: terrasoft://WFStart/Workflow/%7b8C91E8A4-942C-4F39-BCB3-0C7D5D9C5779}/AccountID|%7b04B25C6A-9336-42DD-838F-E686D83B882C%7d (ссылка),

где
8C91E8A4-942C-4F39-BCB3-0C7D5D9C5779 – идентификатор диаграммы БП,
AccountID|%7b04B25C6A-9336-42DD-838F-E686D83B882C%7d – параметр/значение, передаваемое в БП (Все параметры в ссылке разделяются символом «/»), проделайте следующие изменения в конфигурации:

1. Внесите следующие изменения в функцию RunHyperlink() скрипта scr_HyperlinkUtils:

function RunHyperlink(Action, Params) {
    Action = Action.toLowerCase();
    switch (Action) {
        case 'goto':
                HyperlinkGotoWorkspace(Params);
                break;
        case 'open':
                return HyperlinkOpenCard(Params);
        break;
                //Вставить
        case 'wfstart':
                return HyperlinkStartWorkflow(Params);
                break;
    }
}

2. Добавьте функцию запуска БП HyperlinkStartWorkflow() в скрипт scr_HyperlinkUtils.

function HyperlinkStartWorkflow(Params) {
         if (Params.length 2) {
                   return;
         }
         var Module = Params[0];
         var IDValue = Params[1].replace(/%7b/g, '{').replace(/%7d/, '}'); //Diagram ID
         var ParameterHash = Params.slice(2, Params.length);
         var ParamNames = new Array();
         var ParamValues = new Array();
         for (var i = 0, iLength = ParameterHash.length; i iLength; i++) {
                   var tmp = new String(ParameterHash[i]).split('|');
                   if (('length' in tmp) && (tmp.length > 1)) {
                            ParamNames.push(tmp[0]);
                            ParamValues.push(tmp[1]);
                   }
         }
         WFStartByID(IDValue, ParamNames, ParamValues);
}

Приятной работы, с запуском БП! :smile:

У меня такой же вопрос

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