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

Есть два поля "Страны" и "Города" оба поля лукапы. Как при выборе Страны фильтровать значения в поле "Города"?

 

Нравится

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

Евгений, здравствуйте!

Настройка бизнес-правил для преднастроенных страниц реализована в версии 7.12.0. Вы можете настроить бизнес - правила для добавления фильтрации по аналогии с настройкой в мастере раздела.

Для Вашей задачи правило будет выглядеть примерно следующим образом: Если - то.

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

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

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

Эти процессы спокойно перенеслись через SVN на другие дев стенды и на QAS - и там начали работать по расписанию.

Но, когда перенесли наш пакет с помощью WorkspacecConsole, то на целевой среде они не запускаются по расписанию. Стартовые сигналы в таблице SysStartTimerInProcess появились, но триггеров в QRTZ_TRIGGERS нет.  Запускал вручную - они отлично отрабатывают, но далее по расписнию все равно не работают (триггеров по-прежнему нет).

В процессе установлена галка Повторять при пропуске.

Еще такой момент: на целевой среде, куда переносим пакет с помощью WsC - SalsesEnterprise, а на девах и QAS какая-то более сложна сборка с маркетингом и  сервисом. Версия везде 7.11.3.1175

 

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

Прикрепленные файлы

Нравится

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

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

При установке пакета через WorkspaceConsole необходимо перезапустить пул приложения и очистить Redis, для того что бы подтянулись изменения. 

В других механизмах установки пакетов эти изменения прописаны и выполняются автоматически. 

Tsopa,

Добрый день. Что сделал:

  1. Выключил пул приложений
  2. Установил пакет с помощью WorkspaceConsole
  3. Почистил redis
  4. Включил пул 
  5. Убедился, что в QRTZ_TRIGGERS триггеров нет
  6. Залогинился и сделал Генерировать исходные коды для всех
  7. Сделал компилировать все
  8. После этого в QRTZ_TRIGGERS появились нужные трриггеры
Показать все комментарии

В БП-ах есть компонент привязки объекта к БП. Как им грамотно воспользоваться?

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

Как мне организовать эту деталь? Что будет masterColumn, а что detailColumn?

Нравится

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

Алексей, добрый день!

При привязке к процессу выполняется добавление записи в объект "Объект в процессе" (SysProcessEntity). При необходимости вывести связанные процессы для раздела нужно

- Создать деталь, указав в качестве объекта Объект в процессе

- Вывести данную деталь на страницу редактирования записи, указав связь Колонка детали.Объект = Колонка объекта.id

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

Коллеги, добрый день. Подскажите пожалуйста как решить задачку.

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

Пробовал и через переменные и через изменить данные и через добавить данные.

Нравится

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

В какое поле вы пытаетесь поместить ID родителя?

Калушка Д.,

Добрый день. ID родителя пытаюсь поместить в лукап.

вообще процесс ведет себя очень странно.

Расскажу более подробно на обезличенном примере.

Есть раздел "Меню" в нем есть детали "Стоп лист" "Меню в наличии" "Планируемое меню"

Все детали имеют один и тот же вид. Сначала добавляю первую запись с ID 1 потом добавляются дети, делаю это для того что бы можно было сворачивать/разворачивать данную строчку в детали. Далее другой процесс передает данные из детали "Планируемое меню" в деталь "Меню в наличии" и все предается как надо. А вот в деталь "Стоп лист" id родителя не предается.

 

Евгений.,

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

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

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

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

Коллеги, здравствуйте.

Возник вопрос:

Как при помощи БП или есть ли какие-то другие возможности реализации, после перевода объекта лид на стадию дисквалифицирован (дис)квалификации ЛИДа, сделать карточку объекта ЛИДА нередактируемой.

Заранее спасибо!

Нравится

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

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

Роман, здравствуйте!

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

Логвин Андрей Витальевич,

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

Коллеги, спасибо! Но тогда таким образом я заберу права у пользователей и в дальнейшем у них не будет возможности работать с обьектом ЛИДов. 



Хотелось бы реализовать такую возможность, чтобы права были, но после определённой стадии работа с лидами блокировалась.

Роман, по этому поводу есть статья на SDK - https://academy.terrasoft.ru/documents/technic-sdk/7-11/kak-polnostyu-z…

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

Есть БП, внутри которого в Сценарии на C# вычисляется большая таблица данных. Её нужно один-в-один положить в БД. Все поля известны.

Как с наименьшими затратами это лучше сделать? БП будет вызываться часто, поэтому сохранять надо быстро с минимальным временем блокировки таблицы.

Нравится

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

Добрый день

Конечно не очень хорошо в памяти держать большую таблицу :), но раз так, то подумаем логически что нам нужно сделать:

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

Лучше всего использовать хранимую процедуру, которая может иметь также 2 варианта:

  1. Передаются данные параметром (все записи вместе)
  2. Хранимая процедура берет данные из файла (который уже положен на диск, если есть такая возможность)

Оптимальный вариант №1. Но какой параметр. Варианта опять 2:

  1. Зарегистрировать свой тип на уровне БД 
  2. Передать все в виде xml

Оба варианта не понятны будут для приложения bpmonline, но, тип xml хорошо преобразовуется в nvarchar(max) и обратно.

Поэтому финальный вариант я вижу такой:

  1. На сервере в С# коде готовим XML с данными
  2. На уровне БД пишем хранимую процедуру с входящим параметром nvarchar(max)
  3. Внутри процедуры преобразовуем в xml и начинаем работать с xml на уровне SQL (https://docs.microsoft.com/ru-ru/sql/t-sql/xml/nodes-method-xml-data-type

 

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

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

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

Нравится

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

Добрый день!

Для решения задачи нужно в сам процесс добавить элемент [Привязать процесс к объекту]. Описание можно найти в документации.

После этого связь между экземпляром процесса и записью можно будет увидеть в Журнале процессов в конкретном экземпляре.

Или в таблице SysProcessEntity. Тут есть ссылка на экземпляр БП (в SysProcessLog), UId схемы объекта к которому привязан экземпляр (в SysSchema) и Id конкретной записи (из объекта к которому выполнена привязка)

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

Добрый день!



Посоветуйте, как добавить параметры в активность, которая создается автоматически при шаге процесса Edit page?

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

Изображение удалено.

Нравится

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

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

 

В расширенных настройках элемента [Открыть страницу редактирования] отображаются связи активности и служебные параметры. Самый простой способ добавить связь активности с другим разделом – включить в этом разделе кейс менеджмент. Добавить дополнительные параметры колонки активности (текстовые/булевые …) в элемент не получится, в таком случае нужно создавать новый элемент.

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

Зарицкий Олег пишет:

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

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



 

А как можно поменять права доступа на эту служебную активность (с помощью БП), чтобы она не была видна тем, кому нельзя?

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

 

Id служебной активности хранится в параметре элемента “Уникальный идентификатор активности”.

Если процесс компилируемый можно обработать запись в параллельной ветке (с небольшой задержкой).

Можно привязать эту активность к какой-нибудь сущности (через расширенные настройки) и в реестре отфильтровать все записи по этой сущности. Это связь будет условным признаком по которому можно выполнить фильтрацию.

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

Добрый день.

Столкнулись со следующей проблемой:

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

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

 Изображение удалено.



После того как скачали текст ошибки и изучил исходники - выяснилось, что портальному пользователю не хватает прав на объект ActivityParticipantRole. После того как были выданы права на этот объект, появилась ошибка, что прав не хватает уже на объект "ActivityParticipant". Дальше права не стали выдавать (т.к. есть опасения что придется выдавать очень много).

Пока мы видим 3 решения этой проблемы: 

а) Последовательно выдавать пользователям портала права на все необходимые объекты - видится что это не самый правильный вариант решения проблемы, но рабочий.

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

в) Всегда запускать процесс от конкретного пользователя (если такое возможно).





Собственно вопросы:

1) Есть ли еще какие нибудь варианты решения и как "правильно" решить данную проблему?

2) Можно ли запускать процесс от конкретного пользователя?

 

Нравится

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

По пунктам:

а) Действительно рабочий, но куча проблем оттестировать этот момент.

б) Я бы переделал весь процесс и выборки/изменения/удаления делал через C# скрипт, пользуясь UserConnection.AppConnection.SystemUserConnection

в) скорее всего запускать так нельзя, только выполнять отдельные элементы под "видом" супервизора (см. пункт б)

Добрый день. Вот тоже столкнулся с проблемой. Что за пункт 6? 

Что то сайт совсем поломался, процитировать не могу.



По поводу "Я бы переделал весь процесс и выборки/изменения/удаления делал через C# скрипт, пользуясь UserConnection.AppConnection.SystemUserConnection" - наш процесс не маленький, по этому такая переделка будет очень трудоемкой, возможно даже более трудоемкой чем выдача прав.



Придумали еще 1 вариант, это запускать процессы по новым заявкам по таймеру (например раз в 1, 5 или 10 минут получать все заявки по которым еще не запущен процесс и запускать)

Габбазов Искандер Рустемович,

А как вы считываете, что по данному обращению был запущен именно тот процесс который активность создаёт? 

Евгений. В журнале процессов это все можно увидеть

Габбазов Искандер Рустемович,

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

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

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

Коллеги, требуется помощь!

Программирую регулярное выполнение бизнес-процесса через планировщик таким образом:

первый элемент бизнес-процесса проверяет наличие триггера, и в случае отсутствия - создаёт триггер в БД. Т.е. при первом ручном запуске БП - он формирует себе "расписание" последующих запусков.

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

В чём может быть причина?

Доп. инфоормация:

Версия BPM 7.7 Bank Customer Journey. БД Oracle.

Триггеры находятся в состоянии WAITNG.

Пользователь для выполнения системных операций (SystemUser) Supervisor.

IIS перезапускал. Application Pool находится в режиме Универсальный.

Способы, которые я пробовал использовать:

CronTriggerImpl:

var cronExp = "0 0/5 * ? * * *";
 
if (!AppScheduler.DoesJobExist(jobName, jobGroup))
{
	var job = AppScheduler.CreateProcessJob(jobName, jobGroup, procName, userConnection.Workspace.Name, userConnection.CurrentUser.Name);
	var trigger = new CronTriggerImpl(jobName + "Trigger", jobGroup, cronExp);
	AppScheduler.Instance.ScheduleJob(job, trigger);
}

 

CronTriggerImpl:

var cronExp = "0 0/5 * ? * * *";
 
if (!AppScheduler.DoesJobExist(jobName, jobGroup))
{
	var job = AppScheduler.CreateProcessJob(jobName, jobGroup, procName, userConnection.Workspace.Name, userConnection.CurrentUser.Name);
	var trigger = new CronTriggerImpl(jobName + "Trigger", jobGroup, cronExp);
 
	trigger.MisfireInstruction = MisfireInstruction.CronTrigger.FireOnceNow;
	trigger.TimeZone = TimeZoneInfo.Utc;
 
	AppScheduler.Instance.ScheduleJob(job, trigger);
}

 

ScheduleMinutelyProcessJob:

int periodInMinutes = 3;
 
if (!AppScheduler.DoesJobExist(jobName, jobGroup))
{
	AppScheduler.ScheduleMinutelyProcessJob(jobName, jobGroup, procName,
		userConnection.Workspace.Name, userConnection.CurrentUser.Name, periodInMinutes);
}

 

SimpleTriggerImpl:

int startOffset = 4;
 
if (AppScheduler.DoesJobExist(jobName, jobGroup))
{
   AppScheduler.RemoveJob(jobName, jobGroup);
}
 
var job = AppScheduler.CreateProcessJob(jobName, jobGroup, procName, userConnection.Workspace.Name, userConnection.CurrentUser.Name);
var trigger = new SimpleTriggerImpl(jobName + "Trigger", jobGroup, DateTime.UtcNow.AddMinutes(startOffset));
AppScheduler.Instance.ScheduleJob(job, trigger);

 

SimpleTriggerImpl от системного пользователя:

int startOffset = 4;
 
if (AppScheduler.DoesJobExist(jobName, jobGroup))
{
   AppScheduler.RemoveJob(jobName, jobGroup);
}
 
var job = AppScheduler.CreateProcessJob(jobName, jobGroup, procName, userConnection.Workspace.Name, userConnection.CurrentUser.Name, null, true);
var trigger = new SimpleTriggerImpl(jobName + "Trigger", jobGroup, DateTime.UtcNow.AddMinutes(startOffset));
AppScheduler.Instance.ScheduleJob(job, trigger);

 

При использовании всех вариантов - триггеры создаются в БД, но повторно не срабатывают. Куда копать?

Нравится

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

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

Сайт пингуется. Так же есть уже заведённые (не мной, до меня) Job'ы c триггерами, которые регулярно запускаются с периодичностью в 2 минуты. Мои же триггеры не запускаются

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

Для контроля запускал такой скрипт (БД Oracle) -



SELECT sched_name,

       trigger_group,

       job_name,

       job_group,

       trigger_state,

         TO_DATE ('03-jan-0001', 'dd-mon-yyyy')

       + next_fire_time / (10000000 * 60 * 60 * 24)

           AS next_fire_time,

       TO_DATE ('03-jan-0001', 'dd-mon-yyyy')

       + prev_fire_time / (10000000 * 60 * 60 * 24)

           AS prev_fire_time

  FROM qrtz_triggers

он показывает что у моих триггеров prev_fire_time - пустое, а next_fire_time, к примеру, "28.11.2017 8:41:49".  У работающих же триггеров - оба значения заполнены, и примерно например, prev_fire_time: "28.11.2017 8:40:48"

 

 

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

Если не поможет напишите в тех. поддержку.

Олег, спасибо)

Вроде перепроверил заголовки. Уже !!! параллельно написал в поддержку платную. Давайте вместе найдём в чём затык!

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