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

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

Нравится

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

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

Запуск процесса в определенное время (при смене регулярного выражения можно добиться других периодов, например, каждые N минут):
http://www.community.terrasoft.ru/forum/topic/24817

Запуск процесса периодично (аналогично синхронизации почты):
http://www.community.terrasoft.ru/forum/topic/13945

Периодичность задается параметром minutelyInterval.

Используется .Net-овская Quartz (соответственно можно нагуглить Cron-выражения для периодов)
Мы для удобной установки триггеров создали вспомогательную утилиту:
toolz

Изнутри выглядит это всё как-то так:

public string startSyncScheduler(string name, string group, string process, string cronCode, int hours, int minutes)
{
	try {
		UserConnection userConnection = this.UserConnection;
		if (AppScheduler.DoesJobExist(name, group))
		{
		    AppScheduler.RemoveJob(name, group);
		}
 
		IJobDetail job = AppScheduler.CreateProcessJob(name, group, process, userConnection.Workspace.Name, userConnection.CurrentUser.Name);
		ITrigger trigger = TriggerBuilder.Create()
			.WithIdentity(name, group)
			.WithSchedule(CronScheduleBuilder.CronSchedule(string.Format(cronCode, minutes, hours, DateTime.UtcNow.Day, DateTime.UtcNow.DayOfWeek.ToString().Substring(0, 3).ToUpper() ))
				.WithMisfireHandlingInstructionDoNothing()
				.InTimeZone(TimeZoneInfo.Utc))
			.ForJob(job)
			.Build();
 
		AppScheduler.Instance.ScheduleJob(job, trigger);
 
		return "Job Well Done!";
	}
	catch (Exception ex) {
		return ex.Message;
	}
}

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

Для установки параметров запуска бизнес-процессов по расписанию через пользовательский интерфейс, мы выпустили соответствующее дополнение к bpm'online. Надеюсь, будет полезным:)

Подробнее здесь https://marketplace.terrasoft.ru/app/extended-business-process-scheduler

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

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

Подскажите, пожалуйста, как автоматически установить фильтр в реестр записей по действию в разделе?

Пример: в разделе Юр. лиц у нас добавлено действие для загрузки Юр. лиц из сервиса СПАРК. По завершению действия необходимо автоматически отфильтровать загруженные записи по определенному критерию (например по текстовому полю).

Нравится

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

Здравствуйте, Сергей.

Самым простым способом фильтрации записей в разделе будет замещение метода initQueryFilters в схеме раздела. Данный метод должен возвращать группу фильтров для esq. Фильтры можно хранить в виртуальном атрибуте.

После загрузки Юр. лиц необходимо вызвать метод reloadGridData, который обновит грид. В момент загрузки данных в грид будет вызван метод initQueryFilters.

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

Добрый день сообществу.
Занимаемся поставками оборудования и есть задача вносить в bpmonline 7.10 данные по оборудованию клиентов - наименование, серийный номер, дата продажи.
В карточке КОНТРАГЕНТ через мастер раздела добавлена новая вкладка «Оборудование» в ней деталь «Оборудование клиента».
Вносим данные из каталога ПРОДУКТЫ а так же указываем серийный номер и дату продажи.
В итоге имеем данные в этой вкладке об имеющемся оборудовании.
Но с этими данными хочется качественно работать а для этого надо создавать фильтры с нужными параметрами. Вот с этим и ступор.
Предположим, хотим оповестить всех клиентов имеющих оборудование Leica о специальных ценах на сервис или на обновление прошивок. Настраиваем фильтр что бы отфильтровать тех клиентов у которых есть оборудование марки Leica и ничего не видим, точнее видим ноль таковых, фильтр не работает.
Кто то может подсказать возможна ли такая фильтрация?

Нравится

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

Денис,

А какой фильтр Вы настраиваете (сделайте скриншот)?

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

Алла, добрый день.
Благодарю за участие в вопросе и быстрый отклик.
Вы как раз в правильном направлении подсказываете, 5 минут назад с настройкой фильтра помог Свистунов Александр из Программных Технологий :twisted:

Кстати, я не знаю как тут вставлять изображения... Инструкций не нашел.

По идее это можно сделать, нажав на кнопку [Вставить изображение] (она в списке кнопок над комментарием), но я обычно прикрепляю файл через [Прикрепленные файлы].

На прикрепленном скриншоте выделила, где что находится, для обоих вариантов :-)

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

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

Добрый день, Коллеги!
Возникла потребность в настройке итога для обращений (тип показатель) для вычисления "средней скорости закрытия обращения".

Необходимо для объекта "Жизненный цикл обращения" по колонке "Продолжительность часов" высчитать среднее значение времени, а именно "как быстро обращение перешло из состояния Новое на одну из завершающих стадий (включая время нахождения на промежуточных этапах по отдельности) Закрыто или Отменено".

Вопрос в следующем:
Возможно ли настроить фильтрацию таким образом, что бы захватывать общую, среднюю продолжительность времени для всех обращений, по всем состояниям кроме "Закрыт" (т.к. в базе в колонке EndDate всегда будет NULL для стадии закрыт)?

Аналогичная вопрос о настройке фильтрации возникает с записями в объекте CaseLifecycle для случая, когда Новое обращение было взято "В работу", а затем "Отменено", так как в базе будет существовать три записи, но для конечной стадии Отменено EndDate = NULL.

Как именно в таком случае будет вычисляться среднее значение по нескольким записям CaseLifecycle и Case, если EndDate = NULL? Будет ли прибавляться просто 0 часов и учитываться в количестве записей жизненного цикла при расчёте среднего?

Возможно кто-то уже сталкивался с подобной задачей.
На скриншоте приведена попытка настройки итога.
Заранее спасибо!

Нравится

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

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

Базовыми средствами системы реализовать задачу можно, но нужно немного новых объектов и SQL запросов.

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

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

  1. Обращение (справочное с ссылкой на объект "Обращение") - с названием Case
  2. Суммарное время обработки (целое число) - с названием TotalSolution

В свойствах объекта укажите признак "Представление в БД"
3) Опубликуйте объект
4) Создайте представление в БД запросом:

create view UsrMyVwObject
as
select NEWID() "Id", c.CreatedOn, c.CreatedById, c.ModifiedOn, c.ModifiedById, c.Id "CaseId", sum(StateDurationInMinutes) "TotalSolution"
from "Case" c
join CaseLifecycle
on CaseLifecycle.CaseId = c.Id
group by Id, c.CreatedOn, c.CreatedById, c.ModifiedOn, c.ModifiedById, c.Id

5) Стройте аналитику по созданному объекту - необходимо посчитать среднее значение по полю TotalSolution.
В фильтре аналитики необходимо указать условие, что учитываются только обращения в конечном состоянии, так как незавершенные обращения не должны влиять на построение статистики.

P.S. SQL запрос не проверял - рекомендую самостоятельно проработать его.

Алексей, ещё раз добрый день!
Спасибо огромное за комментарий, попробовали реализовать.
Создали объект UsrAverageCloseSpeed
И две колонки
UsrTotalSolution - дробное число
UsrCase - справочное поле с ссылкой на обращение.
Возникли трудности именно с созданием представления в БД. Попробовали доработать согласно вашим рекомендациям SQL мкрипт, но проверка заканчивается с ошибкой Ambiguous column name "Id"

CREATE VIEW UsrAverageCloseSpeed
AS
SELECT NEWID() Id, c.CreatedOn, c.CreatedById, c.ModifiedOn, c.ModifiedById, c.Id, sum(clc.StateDurationInMinutes)
FROM [ofd_dev].[dbo].[Case] c
JOIN [ofd_dev].[dbo].[CaseLifecycle] clc
ON clc.CaseId = c.Id
GROUP BY Id, c.CreatedOn, c.CreatedById, c.ModifiedOn, c.ModifiedById, c.Id

Просим помочь разобраться или детальнее объяснить структуру SQL создания представления БД.
Заранее спасибо!

UPDATE
Перечитал я что написал с вечера, немного исправлю(кстати, первые два пункта были в изначальном запросе).
1) как правильно указал коллега ниже, нельзя создать 2 колонки с Id, c.Id AS CaseId вполне сработает.
2) нельзя также оставить последнюю колонку без имени, так как это view, нужно сделать примерно так:
SUM(clc.StateDurationInMinutes) AS TotalSolution
3) GROUP BY Id сделать точно не получится, так как GROUP BY еще об этом алиасе ничего не знает, фактически, еще даже newid() в этот момент не отработала, его нужно просто убрать.
Итого:

CREATE VIEW UsrAverageCloseSpeed
AS
SELECT NEWID() AS Id, c.CreatedOn, c.CreatedById, c.ModifiedOn, c.ModifiedById, c.Id AS CaseId, SUM(clc.StateDurationInMinutes) AS TotalSolution
FROM [Case] c
JOIN CaseLifecycle clc
ON clc.CaseId = c.Id
GROUP BY c.CreatedOn, c.CreatedById, c.ModifiedOn, c.ModifiedById, c.Id

Вот такой запрос на моей базе успешно отработал.
P.S. Рекомендую Case взять в квадратны скобки, так это еще и зарезервированное слово в SQL.

"Титаев Александр Николаевич" написал:Просим помочь разобраться или детальнее объяснить структуру SQL создания представления БД.
Заранее спасибо!

Ну логично, вы пытаетесь создать вью с двумя одноименными колонками, что ваша первая Id что c.Id в результирующем запросе будут называтся Id. Так нельзя. Можно вроде этого:

CREATE VIEW UsrAverageCloseSpeed
AS
SELECT NEWID() Id, c.CreatedOn, c.CreatedById, c.ModifiedOn, c.ModifiedById, c.Id as UsrCaseId, sum(clc.StateDurationInMinutes)
FROM [ofd_dev].[dbo].[Case] c
JOIN [ofd_dev].[dbo].[CaseLifecycle] clc
ON clc.CaseId = c.Id
GROUP BY Id, c.CreatedOn, c.CreatedById, c.ModifiedOn, c.ModifiedById, c.Id

Ну и в объекте который вы будете поверх вью в бпм, последнюю колонку так же нужно будет назвать UsrCaseId, ну или как вы захотите, но отлично от Id

upd, так же упустил пункты 2.3. описанные выше Ильей, почитайте их ;)

Коллеги, спасибо большое за оказанную помощь!
Разобрались и дополнили)

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

Как рядом с полем редактирования в карточку редактирования добавить кнопку вызывающая какую-либо логику?

Нравится

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

Похожий вопрос уже рассматривался здесь - http://www.community.terrasoft.ru/forum/topic/13848

Булат, ниже налгдяный пример:

Главное это:

itemType - указать Terrasoft.ViewItemType.BUTTON,
click - указать bindto на метод, который обрабатывается при нажатии
layout - расположение кнопки.

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

Всем привет!

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

С уважением.

Нравится

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

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

Выполните переименования справочников при помощи SQL скрипта. Обновив название в поле [Name] таблицы [Lookup]

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

Здравствуйте. Такая ситуация, поставил локально приложение bpm'online, выгрузил клиентские модули, и выгрузил шарпные файлы, в свою файловую систему. Запустил приложение в Visual Studio, но когда хочешь пробовать что-то писать оказывается библиотек Terrasoft нету, вижуалка их просто не видит. И такой вопрос, как подключить данные библиотеки Terrasoft, может их дополнительно нужно выгружать? я их не нашёл среди выгруженных шарпных файлов
Вот пример класса где показывает, что библиотек не видно.

Нравится

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

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

Никаких дополнительных действий не требуется.
Рекомендуем вам проверить все настройки по инстукции:
https://academy.terrasoft.ru/documents/technic-sdk/7-10/razrabotka-v-fa…

"Мария Ватулина" написал:

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

Никаких дополнительных действий не требуется.

Рекомендуем вам проверить все настройки по инстукции:

https://academy.terrasoft.ru/documents/technic-sdk/7-10/razrabotka-v-fay...


Спасибо, но как мне добраться до папки Pkg, если при запуске проекта Terrasoft.Configuration, там нет ни одной директории. Такие директории как Lib, Autogenerated\Src, Pkg, bin присутствуют физически на диске, но в проекте их нету, и как тогда открывать свои пакеты?

Александр, вам необходимо включить ShowAllFiles.
Для выполнения разработки необходимо в Visual Studio открыть решение Terrasoft.Configuration.sln (см. "Разработка в файловой системе"). Затем в проводнике решения Visual Studio включить отображение всех типов файлов (рис. Разработка в файловой системе, 1), открыть файл UsrGreetingService.cs (рис. Разработка в файловой системе, 2) и добавить нужный исходный код (рис. Разработка в файловой системе, 3).

С данной информацией вы можете ознакомиться по следующей ссылке: https://academy.terrasoft.ru/documents/technic-sdk/7-10/rabota-s-server….

"Мария Ватулина" написал:

Александр, вам необходимо включить ShowAllFiles.

Для выполнения разработки необходимо в Visual Studio открыть решение Terrasoft.Configuration.sln (см. "Разработка в файловой системе"). Затем в проводнике решения Visual Studio включить отображение всех типов файлов (рис. Разработка в файловой системе, 1), открыть файл UsrGreetingService.cs (рис. Разработка в файловой системе, 2) и добавить нужный исходный код (рис. Разработка в файловой системе, 3).

С данной информацией вы можете ознакомиться по следующей ссылке: https://academy.terrasoft.ru/documents/technic-sdk/7-10/rabota-s-servern....

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

razrabotka_v_faylovoy_sisteme.jpg
40.17 кб


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

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

Добрый день.

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

Нравится

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

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

Запустить БП из ScriptTask можно. Для передачи параметров необходимо использовать словарь. Пример:
DateTime someDate = Get("dateTimeParam");
IDictionary parameters = new Dictionary();
parameters["ContactNum"] = Get("ContactNum");
parameters["starttime"] = someDate.ToString();
IProcessExecutor processExecutor = userConnection.ProcessEngine.ProcessExecutor;
processExecutor.Execute("UsrSomeProcessName ", parameters);

"Зарицкий Олег" написал:Здравствуйте!

Запустить БП из ScriptTask можно. Для передачи параметров необходимо использовать словарь. Пример:
DateTime someDate = Get("dateTimeParam");
IDictionary parameters = new Dictionary();
parameters["ContactNum"] = Get("ContactNum");
parameters["starttime"] = someDate.ToString();
IProcessExecutor processExecutor = userConnection.ProcessEngine.ProcessExecutor;
processExecutor.Execute("UsrSomeProcessName ", parameters);

Спасибо. Попробовала сделать как вы сказали. В элементе "Задание-сценарий" прописала:

UserConnection userConnection=context.UserConnection;
IDictionary<string, string> parameters = new Dictionary<string, string>();
parameters["param1"] = idSale.ToString();
IProcessExecutor processExecutor = userConnection.ProcessEngine.ProcessExecutor;
processExecutor.Execute("UsrProcess23", parameters);

При сохранении и публикации процесса возникает ошибка (скриншот прикрепляю).
Не подскажите что я делаю не так?

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

Зачем придумывать велосипед? Есть элемент "Подпроцесс" - можно использовать его. Альтернативный вариант был описан в теме:
http://www.community.terrasoft.ru/forum/topic/25071

"Демьяник Алексей" написал:Зачем придумывать велосипед? Есть элемент "Подпроцесс" - можно использовать его.

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

Можете из скриптаска дернуть веб сервис, вот статья:
https://academy.terrasoft.ru/documents/technic-sdk/7-4-0/zapusk-process…

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

Произведено повсеместное переименование раздела "Лиды" в "Запросы"
В таблице SysSchema - caption всех замещающих объектов
в таблице SysModule - caption раздела в регистрационной записи
в таблице SysLocalizableValue - value всех упоминаний "лида" в "запросы"

В конечном итоге, практически повсеместно раздел переименован.
Но почему-то в меню быстрого доступа ("Модуль верхнего меню" (LeftPanelTopMenuModule)[NUI])
Все равно остается "Лид"
Отладкой удалось определить, что список формируется из конфигурационной настройки платформы

this.Terrasoft.configuration.QuickAddMenu.QuickAddMenu;

которая в свою очередь устанавливается прямо в ViewModule.aspx
что делает дальнейшую отладку с клиентской стороны невозможной.

Откуда формируется этот список ?
можно ли повлиять на его содержимое ?

Нравится

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

Сам спросил, сам ответил
В БД есть таблица "QuickAddMenuItem"
содержащая соответствующие значения.

PS: ИМХО, в списке быстрого доступа к разделам, разумнее содержать UId/Id целевого модуля/раздела и получать его действующий caption из тех мест где описываются свойства модуля, т.к. вся остальная информация и так динамическая - т.е. "собирается".
Странное архитектурное решение.

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

Добрый день, у нас возникли следующие проблемы с активностью при создании активности через БП:
- при выборе “тип сообщения” = исходящее в активности все равно выставляется входящее:

- к активности подсоединяется контакт, но в самом контакте в истории активность не отображается, но сам заголовок активности, связанной с данным контактом отображается в категории email (даже при типе и категории "задача) ":

- в разделе “Туры“ также в истории не отображаются активности, однако отображается вверху в панели “следующие шаги”:

Подскажите, пожалуйста, как можно устранить данные проблемы? :smile:

Нравится

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

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

Попробуйте заполнять не поле "Направление звонка", а поле "Тип сообщения". Внесите исправления в процесс.

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

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