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

//delete previous job
Scheduler.AppScheduler.RemoveJob(
        "StartSxScheduledMeetingJob",
        "SxScheduledMeetingGroup"
);

//set new job
int minutelyInterval = 10080; //7 days (minutes)
Scheduler.AppScheduler.ScheduleMinutelyProcessJob(
        "StartSxScheduledMeetingJob",
        "SxScheduledMeetingGroup",
        "SxScheduledMeeting",
    "Default",
        "Supervisor",
        minutelyInterval);

После чего выполняются остальные элементы БП.
Проблема в том, что БП начал запускаться не через 7 дней (эквивалент 10080 минут), а каждую секунду.
При анализе содержимого Таблиц с префиксом QRTZ выявлено, что запись была добавлена в следующие таблицы
QRTZ_FIRED_TRIGGERS
QRTZ_JOB_DETAILS
QRTZ_TRIGGERS
QRTZ_SIMPROP_TRIGGERS
Чем вызвано подобное поведение планировщика?
И как корректно реализовать такую задачу?

Нравится

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

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

Попробуйте сделать следующим образом:

string schedulerJobGroupName = "StartSxScheduledMeetingJob"
string jobProcessName = "SxScheduledMeeting";
string schedulerJobName = "StartSxScheduledMeetingGroup";
int startOffset = 648000;
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;

"Демьяник Алексей Олегович" написал:int startOffset = 648000;

Вы здесь укаываете интервал в секундах?
Если да то там ошибка
7 дней = 604800 сек.

Прошу прощения за опечатку.

Верно,
Если необходимо установить интервал в 7 дней - следует указать значение 604800.

А из-за чего происходит указанная мной ошибка при использовании ScheduleMinutelyProcessJob , когда БП перезапускается каждую секунду вместо раза в 7 дней?

Добрый день!

Вероятно, проблема связана с тем, что в коде не указано return true;

Указан. Я его не указал в обращении, т.к. он не относится к вопросу. Могу предоставить md-файл на анализ

Добрый день!

Предоставьте, пожалуйста. Укажите также версию приложения.

Версия:
7.5.0.1422_SalesOmnichannel_Marketing_CustomerEngagementCenter_Softkey_MSSQL_RUS

Игорь, скажите, пожалуйста, мое решение подошло для решения Вашей задачи?

Странно, но указанная ошибка не повторяется на другом экземпляре этой базы.

Просьба указать наиболее корректный вариант решения данной задачи, предложенный выше Демьяник Алексеем (Комментарий #1) или мой.

Добрый день!

Оба варианта корректные, Алексей предложил практический вариант применения планировщика.

"Демьяник Алексей Олегович" написал:

Игорь, скажите, пожалуйста, мое решение подошло для решения Вашей задачи?

Ругается на класс SimpleTriggerImpl.
Какое пространство имён мне нужно добавить в Using?
И не лучше ли в моём случае использовать CronTriggerImpl (только вот в каком пространстве имёт тоже не нашёл)
Также не нашёл описания указанных классов

Так же интересует логика работы при выполнении указанных методов, а именно при выполнении методов .ScheduleMinutelyProcessJob() или .ScheduleJob() происходит ли первичный запуск нужного БП или только добавляется в расписание?

Добрый день!

1. В простанство имен Usings следует добавить:
- Quartz.Impl
- Quartz
- Quartz.Impl.Triggers
- Terrasoft.Core.Scheduler
2. При выполнении методов БП добавляется в расписание.

Здравствуйте.
Т.е. немедленного запуска перед добавлением в расписание не происходит?

При каких условиях при выполнении метода ScheduleMinutelyProcessJob() задача добавляется в таблицу QRTZ_FIRED_TRIGGERS? т.е. происходит немедленный запуск(описание проблемы в топике)?

Добрый день!

Необходимо запустить Ваш процесс (может быть запущен вручную или по событию). БП доходит до элемента “Задание сценарий”. Добавляется job в планировщик. В результате процесс будет запущен в следующий раз согласно указанного времени в параметре startOffset.

Здравствуйте. А что делать если выдает такую ошибку?

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

UserConnection userConnection =  Get<UserConnection>("UserConnection");
//:запуск через 24 часа
//Добавляем в назначенное задание
 
string processName = "ProcessName";
string jobName = processName + "Job";
string jobGroupName = jobName + "Group";
 
int startOffset = 86400; //  (одни сутки)
AppScheduler.RemoveJob(jobName, jobGroupName);
var job = AppScheduler.CreateProcessJob(jobName, jobGroupName, processName, userConnection.Workspace.Name, "Supervisor");
var trigger = new SimpleTriggerImpl(jobName + "Trigger", jobGroupName, DateTime.UtcNow.AddSeconds(startOffset));
AppScheduler.Instance.ScheduleJob(job, trigger);
 
return true;

Job появляется в [QRTZ_TRIGGERS], но поле TRIGGER_STATE = BLOCKED.
и в указанное время БП не запускается.
Идентичный код в другом БП добавляет job с TRIGGER_STATE = WAITING и БП прекрасно запускается.

Чем вызвана установка TRIGGER_STATE = BLOCKED?

Выявлено, что назначенное задание не отрабатывает только, когда пользователь авторизован в системе. Но как только он выходит, назначенное задание сразу отрабатывает.
А когда пользователь не авторизован, то невозможно использовать UserConnection, что необходимо для получения значения системных настроек и выполнения ESQ-запросов.
С чем связано такое поведение? и как решить проблему с UserConnection?

Версия 7.8.1681

"Коновалов Игорь" написал:

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

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

С чем связано такое поведение? и как решить проблему с UserConnection?

Версия 7.8.1681


На дворе май 2017-го, но обозначенная Игорем проблема актуальна и для версии 7.10, т.е. процесс запускается планировщиком только после выхода пользователя из системы. Есть ли workaround?

"Давыдов Андрей Дмитриевич" написал:
Коновалов Игорь пишет:

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

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

С чем связано такое поведение? и как решить проблему с UserConnection?

Версия 7.8.1681

На дворе май 2017-го, но обозначенная Игорем проблема актуальна и для версии 7.10, т.е. процесс запускается планировщиком только после выхода пользователя из системы. Есть ли workaround?


Опытным путем выяснил, что планировщик сбоит при отладке процесса w3wp в VisualStudio. Если отладчик не подключать, то планировщик работает нормально.

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

Добрый день!

Посоветуйте, как в bpm'online service реализовать следующую функциональность:

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

Нравится

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

Владимир, пользователи портала, существенно ограничены в правах, для них нельзя добавлять группы пользователь. Лично я вижу два выхода
1. Создать бизнес-процесс, которые будет добавлять права кроме создателя еще и его супервизору, но если супервизор измениться, то придется менять процесс, либо как-то организовываться в плане справочника.
2. Либо раздавать права скриптом, создать триггер, чтоб он проверял новосозданные обращения, и добавлял права супервизору, тогда при изменениях придется модифицировать триггер.

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

Всем привет!

При запуске

Terrasoft.Tools.WorkspaceConsole.exe -operation=PrevalidateInstallFromRepository -workspaceName=Default -sourcePath=C:\inetpub\bpm76\Packages -destinationPath=C:\inetpub\bpm76\Temp\ -logPath=C:\inetpub\bpm76\Log\ -cultureName=ru-RU -updateSystemDBStructure=true -autoUpdateConfigurationVersion=true

получаю сообщение об ошибке:
Unable to load one or more of the requested types. Retrieve the LoaderExceptions property for more information.

Подскажите? в какую сторону копать?

Нравится

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

Здравствуйте, Николай!

Причина: нет необходимых dll -библиотек в каталоге с исполняемым файлом(Terrasoft.Tools.WorkspaceConsole.exe).

Решение: в каталог с исполняемым файлом(Terrasoft.Tools.WorkspaceConsole.exe) скопировать:
- все содержимое каталога ..\Terrasoft.WebApp\bin\ (именно содержимое, а не сам каталог)
- все содержимое каталога ..\Terrasoft.WebApp\DesktopBin\WorkspaceConsole\x64\

Спасибо, помогло

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

Добрый день.

Среда: bpmOnline 7.2

Запускаю бизнес-процесс по нажатию на кнопку с помощью:

args={
sysProcessName: 'SomeProcess',
parameters: {
inParam1: 'paramValue'
}
}
ProcessModuleUtilities.executeProcess(args)

В бизнес-процессе определен исходящий параметр outResult, его значение определяется внутри бизнес-процесса.

Как мне получить значение исходящего параметра после вызова ProcessModuleUtilities.executeProcess(args)?

Заранее благодарен за помощь.

Нравится

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

Здравствуйте, Артем!

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

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

Что нужно сделать с результатом:
1) Отобразить пользователю
2) Обновить запись
3) Использовать в другом процессе?

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

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

  1. Updated (обновлено)
  2. Created (создано)

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

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

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

Как вариант, Вы можете создавать уведомление, в котором отобразите количество созданных/обновленных записей.

Спасибо!

А не подскажете решение такой проблемы: пытаюсь выполнить запрос Insert в своем сервисе

using Terrasoft.Core.DB;
using Terrasoft.Core;
// some code ...
var insert = new Insert(UserConnection).Into("SomeObject")
        .Set("ColumnName1", Column.Const("String1"))
        .Set("ColumnName2", Column.Const("String2"));
insert.Execute();

И получаю ошибку The name 'UserConnection' does not exists in active context. Однако все примеры указывают на использование именно UserConnection.

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

Видимо UserConnection пишется немного в другом регистре - userConnection

Спасибо за помощь

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

Добрый день!

1.Каким образом можно реализовать фильтр справочника "Контакты" по сотрудникам нашей организации. Версия 7.3
2. Каким образом сделать связь пользовательских полей на странице Лиды и например Контрагенты, чтобы при квалификации Лида данные присутствовали на странице Контрагенты в соответствующих полях.

Нравится

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

Добрый день, по первому вопросу необходимо создать бизнесс правило, подробно о том как создать правило и посмотреть пример можно например здесь:
http://academy.terrasoft.ru/documents/docs/technic/SDK/7.6.0/AddFiltrat…
Второй вопрос сложнее, насколько я понимаю, Вы хотите чтобы у Вас на странице контрагентов отображались Лиды квалифицированные по этому контрагенту. Способ который вижу я, это добавить деталь на страницу контрагентов в которой связать Id контрагента и QualifiedAccountId, ну и вывести необходимые колонки из Лида

Добрый вечер!.

Не совсем. У меня на странице Контрагенты есть поле, например Описание деятельности. Это пользовательское поле, созданное мной.
На странице Лиды я создаю аналогичное поле. Нужно, чтобы при "Квалификации" Лида и создания нового Контрагента на основании Лида, поле Описание деятельности Контрагента заполнялось данными со страницы соответствующего поля Лида.

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

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

запуск процесса:
http://academy.terrasoft.ru/documents/docs/technic/BPMS/7.7.0/BPMonline…

чтение данных записи:
http://academy.terrasoft.ru/documents/docs/technic/BPMS/7.7.0/BPMonline…

добавление/изменение данных:
http://academy.terrasoft.ru/documents/docs/technic/BPMS/7.7.0/BPMonline…

Александр. Не могли бы вы указать на мою ошибку.
Я создаю процесс.

В качестве сигнала запуска устанавливаю Квалификацию Лида.

Далее делаю чтение данных. В качестве поля для чтения указываю значение поля справочника и ставлю фильтр по id Лида и Процесса.

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

Сохраняю и публикую процесс.
При квалификации Лида результата нет.
В журнале процессов процесс находится в процессе выполнения.

Спасибо.

Добрый день!

Бизнес-процесс (условно UsrChangeAccount) будет выглядеть следующим образом:
1. Стартовый сигнал. Изменение в объекте Лид. Должна быть изменена колонка “Контрагент”.
2. Читать данные лида. Id = Пункт 1.Id
3. Изменить данные. Объект Контрагент. Id = Пункт 2.Контрагент. Установить значение полей. Например, Описание деятельности = Пункт 2.Описание деятельности.

Следует отметить, что задача не тривиальная. Создание контрагента во время квалификации лида – это базовый процесс. Изменить его не получится. Соответственно пользовательский процесс необходимо запускать после того как контрагент создан, и ссылка на него добавлена в лид. Также следует учитывать, что открыть страницу редактирования контрагента сразу после создания не выйдет. Так как процесс UsrChangeAccount запущен другим (базовым процессом), а не текущим пользователем.

Добрый день!
Вопрос.

1. В данном случае процесс запуститься после сохранения Лида с заполненным полем Контрагент? Если да, то каким образом процесс внесет изменения в Контрагенте, которого еще нет т.к. он появляется после Квалификации.
2. В третьем пункте в фильтр не могу добавить Id = Пункт 2.Контрагент. Контрагента среди "Чтения данных" в п.2 нет.
3. Каким образом запустить пользовательский процесс после Квалификации Лида и создания контрагента, если он запускается при изменении значения Контрагент в Лиде?

Добрый день!

1. Процесс будет запущен после квалификации лида. После того, как лид квалифицирован, - новый контрагент создан и ссылка на него автоматически передана в лид, - запустится пользовательский БП.
2. Id = Пункт 2.Контрагент. В элементе изменение данных выбрать объект – Контрагент. Указать условие – Id = Id контрагента, который был добавлен в запись лида (получаем во время чтения данных из лида).

3. В объекте Лиды есть поле которое ссылается на контрагента. Принцип следующий – создан лид, после этапа квалификации создан новый контрагент, ссылка на этот контрагента передана в лид (т.е. установлено значение в Лид. Контрагент), запустился пользовательский БП.

Илья, не могли вы указать на мою ошибку.
У меня нет поля Контрагент в выборке на чтение.
Чтение:

Изменение:

Добрый день!

1. Первый элемент стартовый сигнал.
2. Второй элемент “Чтение данных” из объекта Лид.
3. Третий элемент “Изменение данных” в объекте Контрагент.

Вы сделали все верно. Во втором элементе необходимо указать условие Id = StartSignal.Id. На этом этапе станут доступны все значение полей в лиде.
Уже при изменении данных в контрагенте необходимо указать условие Id = Чтение данных лида.Контрагент.
По условию задачи необходимо передавать значение из поля в лиде в поле контрагента. Для этого необходимо получить идентификатор лида (получим в стартовом сигнале) и идентификатор созданного контрагента (получим в чтении данных из лида).

Прошу не судить строго, но при выборе фильтра по ID у меня в выборе есть только справочники и нет Контрагента.
При выборе, например "Названия контрагента" есть.

В журнале процессов нет отображения запускаемого процесса при установке сигнала запуска по изменения поля Контрагент Лида.

Как по мне, то данные колонки из объекта "Контрагент". Вам необходимо читать из объекта "Лид".

Чтение происходит из объекта Лид.
В объекте контрагент ведь нет полей "Квалифицорован как контрагент и контракт".


Выберите поле "Квалифицирован как контрагент". Название полей на странице может отличаться от их названий в объекте.

Добрый день!

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

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

Проверьте, пожалуйста, свойства процесса "Тег" и "Активен". В поле "Тег" должно быть указано Business Process, в поле "Активен" - true.

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

Добрый день!
Хочу сделать обязательным поле, если соблюдается несколько условий
то есть
поле обязательно, если условие 1 И условие 2

Если применить такую конструкцию

то будет условие 1 ИЛИ условие 2.

Скажите, пожалуйста, как сделать условие 1 И условие 2?

Нравится

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

Добрый день,

Загляните в эти ветки. Тут рассмотрены варианты решения подобной задачи.
http://www.community.terrasoft.ru/forum/topic/11997
http://www.community.terrasoft.ru/forum/topic/11983#comment-51919

Спасибо

Татаровская Дарья,

Добрый день! Подскажите как вы решили эту задачу?

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

Добрый день
При открытии Задачи авт-ки отправляется уведомление (е-мейл) ответственному по этой Задаче. Можно ли сделать так, чтобы этот е-мейл делал запись в календаре в Outlook или чтобы была пометка зафиксировать это в календаре в Outlook ?

Нравится

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

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

Нравится

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

Чтобы сделать возм-сть просмотра расписания, можно посм. как это сделано в разд. активностей.
См. схему «ActivitiesShedulerPage» и то, как там использ. контрол «ScheduleEdit». Также см., как эта страница встраивается в раздел «ActivitiesModulePage».

Правильно ли я понимаю, что мне нужно создать новые "Группу" и "Элемент в Группе" ?

Группы и расписание вроде бы никак не связаны. Как хотите.

Делаю страницу расписания нового раздела, сохранила/опубликовала. Почему расписания нет в нужном разделе?

Думаю, расписания нет, поскольку Вы его добавили неправильно.
Может, стоит заказать разработку этого раздела у Terrasoft или компаний-партнёров?

Нет, не стоит.

Date: 04.12.2015 9:45:55 Date (UTC): 04.12.2015 6:45:55 Exception Message: В типе "ZapShedulerPageEventsProcess" отсутствует свойство "IsModuleProcessesTuningMode" Exception Type: Terrasoft.Common.InvalidObjectStateException Exception Source: Terrasoft.Common

подскажите, пожалуйста, что это за ошибка?

Добрый день!
Скорее всего у Вас есть несоответствие с параметрами процесса. Где-то в коде он используется, но отсутствует среди параметров

Добрый день
Если проводить аналогию с расписанием Активности - этот же параметр где можно найти?

"TatianaM" написал:

Date: 04.12.2015 9:45:55 Date (UTC): 04.12.2015 6:45:55 Exception Message: В типе "ZapShedulerPageEventsProcess" отсутствует свойство "IsModuleProcessesTuningMode" Exception Type: Terrasoft.Common.InvalidObjectStateException Exception Source: Terrasoft.Common

подскажите, пожалуйста, что это за ошибка?

- эта ошибка исчезла.

Теперь при переходе в Расписание почему-то не отображаются записи. Что может быть причиной?

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

P.S. Да и идет ли запрос вообще

Подскажите, а где должен идти запрос?

В профайлере SQL Server'а

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

Здравствуйте.
Мастером деталей создал деталь на основе существующего объекта. По окончанию работы мастера в пакете Custom были созданы деталь и страница для редактирования детали. Добавил эту деталь на вкладку на странице, на которой деталь должна присутствовать. При визуализации страницы деталь отображается, но при нажатии на кнопку "Добавить" в детали вместо окна её редактирования появляется индикатор, состоящий из строки "Загрузка" и вращающегося колёсика слева от строки и эта картинка может присутствовать на экране сколько угодно долго. И деталь и окно её редактирования находятся в пакете Custom. Скажите, пожалуйста, из-за чего не срабатывает вывод окна редактирования детали при нажатии на "Добавить"?
Деталь построена на основе террасофтовского объекта ContactCareer.
В файле прикрепляю сообщение об ошибке, которое выводится в консоли отладчика браузера.

Нравится

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

Добрый день, Евгений.
Предоставьте, пожалуйста, оба кода: [Схемы детали] и [Карточки редактирования детали].

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

Добрый день!
7.6
В карточке редактирования Базы знаний есть такое поле Решение ( с HTML-тегами)
Можно ли увеличить его размер? - высоту увеличить

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

Нравится

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

Дарья, оно конфигурируется в карточке, надо искать где и пробовать мержить...

Александр, вот это поле в карточке

{
"operation": "insert",
"parentName": "KnowledgeBasePageGeneralBlock",
"propertyName": "items",
"name": "Notes",
"values": {
"contentType": Terrasoft.ContentType.RICH_TEXT,
"layout": {"column": 0, "row": 0, "colSpan": 24},
"labelConfig": {
"visible": false
},
"controlConfig": {
"imageLoaded": {
"bindTo": "insertImagesToKnowledgeBase"
},
"plainTextValue": {
"bindTo": "NotHtmlNote"
},
"images": {
"bindTo": "knowBaseImagesCollection"
},
"plainTextMode": {
"bindTo": "plainTextMode"
}
}
}
}

Как можнно увеличить его размер?

Вероятно как-то так:
сontentType": Terrasoft.ContentType.RICH_TEXT,
"layout": {"column": 0, "row": 0, "colSpan": 24},
"height": "600px",

Спасибо

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