Вопрос

Хочу из приложения вычитать контакты согласно документации 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 сервера

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

Спасибо!

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

devexpress подключение библиотеки для использования в отчете.

Подскажите как подключить?

Пробовал в Дизайнере отчетов bpm в свойстве подключаемые модули указать название свое dll и добавить ее в папку BIN в системе и потом вызвать в коде скрипта. Но библиотеку дизайнер отчетов не видит.

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

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

Тоже сталкивался с подобной проблемой, и не удалось решить, скорее всего, что никак. Пришлось создавать свой велосипед на костылях в скрипте Dev Express, а потом и вовсе пришлось выбросить его на помойку и запилить свой недошаблонизатор, т.к. клиент захотел редактируемый документ, а Dev Express оказался не способен выдать что-то пригодное для редактирования.

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

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

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

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

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

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

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>&nbsp;&nbsp;" + table.Columns[i].Caption + "&nbsp;&nbsp;</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. 

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

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

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

Работает ли в BPM удаленная отладка в VS?

https://academy.terrasoft.ru/documents/technic-sdk/7-11/otladka-servern…

Удаленная отладка с помощью msvsmon.exe

делаю все согласно статье, файлы выгружаются на удаленный сервер.Я открываю нужный исходник уже локально, но к процессу не подключается. 

Я и в процессе компиляции подключался, и после, но к процессу удаленного сервера не подключается. Удаленная отладка работает?

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

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

msvsmon.exe надо запускать с правами администратора (Run As Administrator) иначе он к IIS не подключиться.

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

Да, с правами админа. у вас получается так подлючается? у меня выгруженные файлы находятся на другом сервере по сравнению с VS.

Евгений В.,

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

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

Мне как раз надо подключаться к процессу с другого сервера, процесс vs определяет верно. Точка останова не определяется. Исходник в VS открываю по пути //сервер/с$/ПУть_Src/

Выходит так не получится?

Евгений В.,

проект и исходники должны быть на вашем ПК. На сервере должна быть pdb со всей отладочной информацией. Это общие правила удаленной отладки, которые всегда работали. Возможно у вас релизная сборка с оптимизацией и вашей строчки кода как бы и нет?

Также attach надо делать к Managed code. Если у вас там случайно что-то другое, то ничего не получится.

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