Коллеги, доброго дня!

Может, кто-то сталкивался с подобной задачей, прошу подсказать ньюансы:

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

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

Цель - оставить запущенные экземпляры на старой реализации процесса, а новые с момента обновления запускать на новой реализации. 

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

Какие-либо данные или скрипты привязать к пакету или определённую последовательность действий соблюсти, может какое-то специфичное состояние системы при переносе требуется?

Кто-нибудь сталкивался? как прошло?

Нравится

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

См. статью «Версионность процессов»:

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

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

При сохранении изменений в процессе выполняется проверка:

 

  1. есть ли запущенные экземпляры процесса;

  2. доступен ли для изменений пакет, в котором находится процесс;

  3. выполнялся ли экспорт бизнес-процесса.

Если пакет процесса недоступен для изменений, система предложит сохранить новую версию бизнес-процесса. После подтверждения будет выполнено сохранение новой версии в пакет, указанный в системной настройке [Текущий пакет].

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

Добрый день.



Есть ситуация: две группы разработчиков работают над одним bpm-проектом решая при этом разные задачи.



Подскажите, как можно организовать процесс разработки в этом случае? Получится ли использовать несколько SVN-репозиториев (branches у каждой команды разработки и trunk-ветка)? Какие еще можно использовать подходы и программы для групповой разработки bpm'online?

Нравится

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

1) Если товарищи в одной комнате и работают в разных схемах, то в принципе можно создать 1 ветку и в ней работать. Будут, конечно, ситуации вида "Ваня! Отпусти схему, мне надо метод перенести!". Но в целом для небольшой группы сойдет.

2) По поводу разных веток - да. Делаете trunk, в bpm привязываете trunk-ветку, в ней создаёте пакет. Далее в svn копируете пакет по разным веткам, ведёте разработку, сливаете всё снова в trunk, в bpm обновляете пакет. Ну это в общих словах.

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

1) Если товарищи в одной комнате и работают в разных схемах, то в принципе можно создать 1 ветку и в ней работать. Будут, конечно, ситуации вида "Ваня! Отпусти схему, мне надо метод перенести!". Но в целом для небольшой группы сойдет.

2) По поводу разных веток - да. Делаете trunk, в bpm привязываете trunk-ветку, в ней создаёте пакет. Далее в svn копируете пакет по разным веткам, ведёте разработку, сливаете всё снова в trunk, в bpm обновляете пакет. Ну это в общих словах.

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

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

Хочу из приложения вычитать контакты согласно документации https://academy.terrasoft.ru/documents/technic-sdk/7-11/dataservice-cht…

Делаю запрос  - 10.000 контактов, всё ок, 100.000 - ProtocolError.

Каков максимальный объем данных в записях или байтах для DataService/SelectQuery?

Нравится

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

20000 для любого esq. Указывается в web.config сервера

20000 для любого esq. Указывается в web.config сервера

Варфоломеев Данила,

Спасибо!

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

Коллеги, доброго дня!

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

Каким образом можно настроить аналогичную автоматизацию для пользовательского элемента бизнес-процессов? Либо где посмотреть, как это уже реализовано для элемента "Создать задачу"?

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

Нравится

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

Я не совсем понимаю, что требуется, если честно, но попытаюсь помочь :)

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

Добрый день!



Пример реализации данной логики в элементе "Выполнить задачу" Вы можете посмотреть открыв исходный код элемента "ActivityUserTask".

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

Анна Журавель пишет:

Добрый день!

Пример реализации данной логики в элементе "Выполнить задачу" Вы можете посмотреть открыв исходный код элемента "ActivityUserTask".

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

Заметил такую особенность, что при переносе не-компилируемых БП с C# сценариями через экспорт-импорт не понятно как их скомпилировать.

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

Может я что-то не так делаю?

Нравится

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

Я обычно переношу БП, ПКМ (по схеме бп)-> сгенерировать для выбранных, потом компилирую для изменённых. Вроде срабатывает

Варфоломеев Данила, тут скорее интересно, почему через сохранение не срабатывает компиляция? Неужели система не видит, что процесс ни разу не компилировался?

Алексей-Карягин,

¯\_(ツ)_/¯ Ну тут мои полномочия всё) Надо спрашивать разрабов ядра(?).

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

Всем доброго времени суток. Версия 7.11.

Есть хорошая и простая функция для открытия мини-карточки:

this.openMiniPage({
	recordId: Terrasoft.GUID_EMPTY,
	operation: Terrasoft.ConfigurationEnums.CardOperation.ADD,
	entitySchemaName: "Case",
	valuePairs: defaultValues,
	isFixed: true,
	showDelay: 0,
	miniPageSchemaName: "UsrCaseMiniPage",
});

Всё отлично - и указание на операцию, и на схему объекта и страницы. Особо удобно здесь свойство valuePairs, позволяющее передать значения для презаполненных колонок.

Существуют ли подобные функции для открытия полноценной карточки добавления?

Нашёл openPage в PageUtilities, но не нашёл, чтобы там был аналог valuePairs.

PushHistoryState не подходит - с его помощью можно открыть существующую страницу, а интересует именно страница добавления.

Нравится

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

Смотрите, как сделано в базовой схеме раздела BaseSectionV2. Там в обработчике кнопки добавления если есть миникарточка, вызывается Ваша функция openAddMiniPage, а если нет — openCardInChain:

/**
 * Opens new record page.
 * @protected
 */
addRecord: function(typeColumnValue) {
	if (!typeColumnValue) {
		if (this.checkEditPagesCount()) {
			return false;
		}
		var tag = this.get("AddRecordButtonTag");
		typeColumnValue = tag || Terrasoft.GUID_EMPTY;
	}
	var schemaName = this.getEditPageSchemaName(typeColumnValue);
	if (!schemaName) {
		return;
	}
	if (this.hasAddMiniPage(typeColumnValue)) {
		this.openAddMiniPage({
			entitySchemaName: this.entitySchemaName,
			valuePairs: this.getAddMiniPageDefaultValues(typeColumnValue)
		});
	} else {
		this.openCardInChain({
			schemaName: schemaName,
			operation: ConfigurationEnums.CardStateV2.ADD,
			moduleId: this.getChainCardModuleSandboxId(typeColumnValue),
			instanceConfig: {
useSeparatedPageHeader: this.get("UseSeparatedPageHeader")
			}
		});
	}
},

 

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

Здравствуйте. Подскажите пожалуйста как создать БП который будет отправлять на почту сотрудка сообщение что у него есть просроченные задачи?

Нравится

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

Самое простое что приходит в голову:

старт = добавление активности —> таймер(на, допустим 5 часов) —> считывание активности —> если активность не завершена, то элемент отправить письмо (ответственному по активности) и выход. Если завершена, то выход.

Варфоломеев Данила, это получается, что читается одна активность которую добавили, а хотелось что бы все просроченные активности считывались

Вы имеете ввиду не постановку задачи и контроль ее своевременности решения, а контроль уже существующих задач и считывание их состояния? В своем бизнес-случае я решил следующим образом:

старт-триггер по времени ежедневно в 9:15 -> чтение выборки по обращениям (ну, тут, что вам необходимо) с отбором по состоянию и флагу "просрочен по разрешению"  и ответственному -> если больше 0, то отправка письма ответственному, что у него есть просроченные обращения.

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

Никульшина Алёна,

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

Насчёт считывания активностей: не знаю ни одного адекватного способа работать с циклами в БП с помощью польз. средств.

Единственный вариант — написать скрипттаск с esq запросом, который сделает выборку кол-ва просроченых задач по каждому пользователю, потом отправка письма каждому. Но это программирование логики.

Плотников ДИ пишет:

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

Вот вот. всё упирается в "перебор" =) Эх если бы они это реализовали, а не пилили конструкторы из версии в версию...

Сделайте VIEW, который считает количество просроченных активностей по ответственным. На базе этого VIEW объект. 

И уже его используйте в БП.

Владимир Соколов, проблема в том что я не знаю как правильно его сделать

Я делал через С# сценарий, так проще всего. Пример отправки отчёта по просроченным задачам

DataTable table = GetDataTableOnSql(context, @"
  SELECT Title
	  , COALESCE(Contact.Name, '') AS [Исполнитель]
	  , DATEADD(hour, 3, Activity.CreatedOn) AS [Дата создания задачи]
	  , DATEDIFF(day, Activity.CreatedOn, GETUTCDATE()) AS [Дней в задаче]
  FROM Activity WITH (NOLOCK)
  LEFT JOIN Contact WITH (NOLOCK) ON Activity.OwnerId = Contact.Id
  WHERE Activity... = Как вы считаете, что задача просрочена???
  ORDER BY Title
"
);
 
string prevTitle = "";
StringBuilder html = new StringBuilder(@"<html><head><style>
table {
  border-collapse: collapse;
}
 
th {
	font-weight:bold;
	border: solid 1px #DDDDDD;
}
 
td {
  border: solid 1px #DDDDDD;
}
</style></head><body><strong>" + DateTime.Now.ToShortDateString() + "</strong><br/><br/>");
 
html.Append("<table><tr>");
for (int i = 1; i < table.Columns.Count; i++)
	html.Append("<th>  " + table.Columns[i].Caption + "  </th>");
html.Append("</tr>");
 
foreach (DataRow row in table.Rows)
{
		string title = (string)row[0];
		if (prevTitle != title)
		{
			html.Append("<tr><th style=\"text-align:left;\" colspan=\"" + (table.Columns.Count-1).ToString() + "\">"+title+"</th></tr>");
			prevTitle = title;
		}
		html.Append("<tr>");
		for (int i = 1; i < table.Columns.Count; i++)
			html.Append("<td>" + row[i].ToString() + "</td>");
		html.Append("</tr>");
}
html.Append("</table><br/><br/>С уважением,<br/>Робот ВРМ<br/></body></html>");
 
// Send report

Метод GetDataTableOnSql - просто читает DataTable по запросу

public DataTable GetDataTableOnSql(ProcessExecutingContext context, string sqlScript)
{
	DataTable table = new DataTable();
	CustomQuery customQuery = new CustomQuery(context.UserConnection, sqlScript);
	using (DBExecutor dbExecutor = context.UserConnection.EnsureDBConnection())
	{
		using (IDataReader dr = customQuery.ExecuteReader(dbExecutor))
		{
			table.Load(dr);
		}
	}
 
	return table;
}

 

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

Уважаемые форумчане.

Возникла проблема с обновлением системы Marketing RUS.

У клиента была установлена версия 7.8.3. Удалось успешно обновить до версии 7.11.0.

Но обновив (процесс обновления прошел без ошибок) до версии 7.11.1 возникли следующие проблемы:

1) после авторизации не корректно загружается главная страница:

    - Некоторые иконки разделов не видны;

    - Не отображаются рисунки запуска процесса, Свернуть панель разделов, Меню, Добавить

    - Также не отображаются рисунки на коммуникационной панели(колокольчик, письмо и т.д),

      только одни синие кружки. Но если кликнуть, например, туда где колокольчик, то коммуникационная 

      панель открывается, но на ней ничего нет.

    - нет отображения значков Дизайнер системы, Профиль. Хотя, если кликнуть, то можно попасть в профиль

     и в дизайнер системы

2) Если зайти в запись какого-нибудь раздела, то ни одна картинка не отображается

   Как-будто в браузере отключена ф-я отображения изображений, хотя там всю включено.

В других браузерах тоже самое.

Пробовал обновляться далее. Дошел до версии 7.11.3. Результат тот же. 

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

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

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

Нравится

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

Из очевидного:

1) Вебсокеты. С какой-то версии в конфиге для подключения указывается MicrosoftWSService, а не SuperWSService. Так что есть повод проверить конфиг (что я задолбался делать. Терики, верните 2011 порт!!)

2) Ресурсы. Такая же фигня, только круче. Теперь они хранятся локально в conf-папке, к которой должен быть полный доступ у IIS-юзера. +После обновлений желательно зайти и полность сгенерировать/скомпилировать конфигурацию(чисто на всякий случай)

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

 

ВАЖНО

Начиная с версии 7.11.1 в каталоге .\Terrasoft.WebApp\conf также содержатся изображения.

Для каталога .\Terrasoft.WebApp\conf должны быть установлены права на модификацию (чтение и запись файлов и вложенных каталогов, а также удаление каталога) для пользователя пула IIS, в котором запущено приложение. В противоположном случае приложение bpm'online не сможет сгенерировать статический контент.

Имя пользователя пула IIS устанавливается в свойстве [Identity]. Доступ к этому свойству можно получить через команду меню [Advanced Settings] на вкладке [Application Pools] менеджера IIS.

https://academy.terrasoft.ru/documents/technic-sdk/7-12/staticheskiy-kl…

Проблема была в другом: не подгружались файлы svg. Нужно было просто в Диспетчере служб IIS - Типы MIME добавить это расширение

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

Всем привет.

Ввиду не внятности документации прошу помощи.

Как составить такой запрос используя ESQ на клиенте?

SELECT account.UsrINN,(SELECT TOP(1) ModifiedOn FROM Activity activity WHERE activity.AccountId=account.Id ORDER BY ModifiedOn) AS LastComunicationDate  FROM Account account  WHERE account.UsrINN = '7730616959' 

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

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

 

 

Нравится

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

Последовский Роман,

А так?

var esq = Ext.create("Terrasoft.EntitySchemaQuery", { rootSchemaName: "Account" });
esq.addColumn("UsrINN");
esq.addAggregationSchemaColumn("[Activity:Account].ModifiedOn", 5, "MaxModifiedOn");
esq.filters.addItem(esq.createColumnFilterWithParameter(3, "UsrINN", "7730616959"));
esq.getEntityCollection(function (result) {
	if (result.success && result.collection.getCount() > 0) {
		result.collection.collection.each(function(item) {
			//some logic
		}, this);
	}
}, this);

 

Роман, приветствую,

А у вас проблема в подзапросе или в сортировке?

Есть в сортировке, то возможно вам поможет вот это: https://community.terrasoft.ru/questions/entityschemaquery-order

Если в подзапросе, то можно

1. Сделать один запрос, а в его колбэке (или в цикле foreach, если это C# сделать еще один запрос).

2. Судя по всему подзапрос можно заменить обычным джойном.

На клиенте? Тогда как-то так:

var esq = Ext.create("Terrasoft.EntitySchemaQuery", { rootSchemaName: "Activity" });
 
esq.addColumn("Account.UsrINN", "AccountINN");
var column = esq.addColumn("ModifiedOn");
column.orderDirection = Terrasoft.OrderDirection.ASC; //asc по modifiedOn
 
esq.rowCount=1; //top1
 
esq.filters.addItem(esq.createColumnFilterWithParameter(3, "Account.UsrINN", "7730616959")); //фильтр по INN
 
esq.getEntityCollection(function (result) {
	if (result.success && result.collection.getCount() > 0) {
		var item = result.collection.getByIndex(0);
		var INN = item.get("AccountINN");
		var modOn = item.get("ModifiedOn");
	}
}, this);

 

Мне кажется, тут сам SQL-запрос надо вывернуть наизнанку:

SELECT max(ModifiedOn) FROM Activity activity
left join Account account on activity.AccountId=account.Id 
WHERE account.UsrINN = '7730616959'

То есть получим запрос с одной колонкой и одним фильтром по прямой связи. Заодно вместо TOP 1 можно просто максимум при помощи addAggregationSchemaColumn. А затем фильтруем, применив createColumnFilterWithParameter к колонке «Account.UsrINN».

 

Спасибо большое, вариант Данилы работает, но

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

 

 

 

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

Это часть системы поиска дублей.

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

ИНН:123

10 контрагентов, но у 5ти из них есть активности.

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

В самом начале я указал именно тот SQL запрос, который нужно изобразить с помощью ESQ.

Конечно можно это сделать двумя циклами, но хочется понять можно ли это сделать одним запросом

 

Такое есть смысл делать на сервере. В классе Select можно делать почти то же, что в SQL-запросах, плюс дубли могут быть недоступны через ESQ из-за прав доступа текущего пользователя, а Select работает в обход них.

Последовский Роман,

А так?

var esq = Ext.create("Terrasoft.EntitySchemaQuery", { rootSchemaName: "Account" });
esq.addColumn("UsrINN");
esq.addAggregationSchemaColumn("[Activity:Account].ModifiedOn", 5, "MaxModifiedOn");
esq.filters.addItem(esq.createColumnFilterWithParameter(3, "UsrINN", "7730616959"));
esq.getEntityCollection(function (result) {
	if (result.success && result.collection.getCount() > 0) {
		result.collection.collection.each(function(item) {
			//some logic
		}, this);
	}
}, this);

 

Варфоломеев Данила,

Памятник поставить мало! Спасибо)

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

Всем доброго времени суток. Версия 7.11.

Задача в общем такая: есть несколько страниц редактирования раздела (к примеру, обращения Case). То, какую страницу показывать зависит от значения специальной справочной колонки "Тип страницы редактирования", здесь всё стандартно.

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

Сервис 1 - Тип страницы 1
Сервис 2 - Тип страницы 1
Сервис 3 - Тип страницы 2

Соответственно, привязать вид страницы редактирования напрямую к сервису не получается, из-за чего и вводится та самая дополнительная колонка "Тип страницы".

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

На практике такую конструкцию реализовали при помощи бизнес-процесса и преднастроенной страницы вместо мини-карточки. Вариант с мини-карточкой конечно смотрелся бы намного изящнее.

Нравится

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

Я так понимаю, у вас уже для раздела несколько страниц редактирования?

Тогда в теории: достаточно в onSaved методе министраницы делать вызов нужной страницы (в зависимости от типа) на редактирование.

Варфоломеев Данила,

да.

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

Инструкция на академии не помогла: https://academy.terrasoft.ru/documents/technic-sdk/7-12/kak-sozdat-mini…

Смородинов Денис пишет:

без выпадающего меню с типом страницы.

Вот тут даже интересно. У вас стоит галочка в мастере "использовать миникарточку на добавление"? Если да, то он открывает одну и ту же миникарточку, но только после выбора какого-либо типа из выпадающего меню?

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

Варфоломеев Данила,

это 7.11. Там ещё нет галочки и мастера дизайна миникарточки((

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

Варфоломеев Данила пишет:

перегрузить initEditPages

Не подскажете, где он определяется? В BaseSectionV2 уже следует вызов в init.

Смородинов Денис,

BaseSchemaViewModel. 

Кстати, вы можете остановись дебагером, навести на функцию, вам хром выдаст её определение, щёлкаете на него, попадаете в функцию(и соответственно в модуль где она определена)

Ясно, спасибо.

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