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

Подскажите, где происходит сакральный Set("UserConnection", UserConnection) для БП?

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

 

Нравится

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

Где то внутри Terrasoft.Core.ProcessEngine.... без исходников или дизасма и не видно :)

Где то внутри Terrasoft.Core.ProcessEngine.... без исходников или дизасма и не видно :)

При запуске процесса из конфигурации, интерпретируемого или компилируемого, UserConnection передаётся извне, как видно из примеров, которые приводил Григорий.

А при запуске через ProcessEngineService там в начале функции ExecuteProcess считывается то самое HttpContext.Current.Session["UserConnection"].

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

Приветствую, коллеги!

Запускается макрос по такой схеме:

  1. БП по таймеру
  2. Подпроцесс
  3. ScriptTask
  4. ReportService
  5. GenerateMSWordReport
  6. Макрос : IExpressionConverter

В макросе надо esq запрос выполнить, пытаюсь получить UserConnection:

 

  • HttpContext.Current.Session["UserConnection"] не работает ибо HttpContext.Current == null
  • Get("UserConnection") - нет метода Get
  • context.UserConnection - нет context в объявленных
  • UserConnection - не переменная, а тип

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

 

Нравится

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

См. последний ответ тут.

Зверев Александр,

перед тем, как я посмотрел тот последний ответ, все заканчивалось как раз на пункте 4

Зверев Александр,

а теперь до пункта 7 добирается и в методе Evaluate на строке с получением UserConnection ломает процесс

Как вариант, использовать SystemUserConnection.

Зверев Александр,

Теперь надо создать топик "Как получить SystemUserConnection в макросе?"

Попробуйте (HttpContext.Current.Application["AppConnection"] as AppConnection).SystemUserConnection.

Зверев Александр,

не работает, ибо 

HttpContext.Current равно null

в каком месте можно глянуть, как инициализируется UserConnection, который берется из Get<UserConnection>(“UserConnection”) или context.UserConnecrion для БП?

В примере макроса вообще есть получение UserConnection и HttpContext.Current там не null:

_userConnection = (UserConnection)HttpContext.Current.Session["UserConnection"];

 

Зверев Александр,

ну я же схему объяснил, печатная форма делается в БП, запускаемом по таймеру

A HttpContext.Current.Session[“UserConnection”] работает только при запуске через сервис

Если иначе никак, можно работать через OData, как во стороннем приложении.

Капец как сложно, мне всего то надо если ИПешник, ИНН без КПП выводить и запятой лишней не было :)

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

Решил - переписал:

1) ExpressionConverterHelper, что бы конструктор принимал параметр типа  UserConnection и присваивал его аналогичного типа свойству и в методе GetValue

var expressionConverter = (IExpressionConverter)Activator.CreateInstance(expressionConverterClass);
if (expressionConverter != null) {
    macrosValue.Data = expressionConverter.Evaluate(value, macrosElement.Argument);
}

поменял на

dynamic expressionConverter = Activator.CreateInstance(expressionConverterClass);
if (expressionConverter != null) {
	PropertyInfo propertyInfo = expressionConverter.GetType().GetProperty("UserConnection");
	if (propertyInfo != null) {
		propertyInfo.SetValue(expressionConverter, UserConnection, null);
	}
	macrosValue.Data = expressionConverter.Evaluate(value, macrosElement.Argument);
}

2) в классе ReportService меняем строку

var expressionConverterHelper = new ExpressionConverterHelper();

на 

var expressionConverterHelper = new ZLExpressionConverterHelper(UserConnection);

3) в макросе в начале пишем:

private UserConnection _userConnection;
public UserConnection UserConnection {
    get {
	    if (_userConnection == null) {
		    _userConnection = (UserConnection)HttpContext.Current?.Session["UserConnection"];
	    };
	    return _userConnection;
	}
    set =&gt; _userConnection = value;
}

потом пользуем UserConnection

 

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

Добрый день.

Возник вопрос, как обозначать обращения в зависимости от их категории.

Сейчас существует по умолчанию 2 категории - Инцидент и Запрос на обслуживание.

Сам вопрос - как настроить нумерацию вида SD000** / IM000**** / C000**** в зависимости от их выбранной категории?

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

 

P.S. Еще один вопрос как создать отдельную сущность Инцидент, по типу Обращения?

Возможно ли скопировать базовый пакет Case и дальше уже его редактировать?

 

Нравится

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

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

По поводу создания отдельной сущности - я бы пошла по классическому варианту: создала бы свой пакет с нужными зависимостями, реализовала бы в нём новый раздел через мастер разделов, а потом бы уже дорабатывала в нём нужную логику.

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

По поводу создания отдельной сущности - я бы пошла по классическому варианту: создала бы свой пакет с нужными зависимостями, реализовала бы в нём новый раздел через мастер разделов, а потом бы уже дорабатывала в нём нужную логику.

Посмотрите это приложение, там реализована похожая задача

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

Всем добрый день. Версия 7.12.

Небольшой эксперимент с деталями. Пытаюсь понять, можно ли добавлять на деталь свои данные, не относящиеся к объектам системы.

Переопределил в схеме детали (схема обычная, наследуется от BaseGridDetailV2) стандартный onGridDataLoaded следующим образом:

onGridDataLoaded: function(response) {
				var newCollection = Ext.create("Terrasoft.Collection");
 
				var startItem = response.collection.collection.items[0];
				startItem.values.Address = "zzzz";
				newCollection.add("zzz", startItem);
 
				var nextItem = startItem;
				nextItem.values.Address = "yyy";
				newCollection.add("yyy", nextItem);
 
				var preloadRowKeys = this.get("PreloadedGridDataRecords") || [];
				var gridData = this.getGridData();
				var preloadGridData = gridData.filter(function(item, key) {
					return preloadRowKeys.indexOf(key) >= 0;
				});
				var isClearGridData = this.get("IsClearGridData");
				if (isClearGridData) {
					if (!gridData.isEmpty() && (response.success || preloadGridData.isEmpty())) {
						gridData.clear();
					}
					this.set("IsClearGridData", false);
				}
				var performanceManagerLabel = this.sandbox.id + "_onGridDataLoaded";
				performanceManager.start(performanceManagerLabel);
				this.afterLoadGridData();
				const isContinueExecution = this.Terrasoft.findValueByPath(response, "errorInfo.response.timedout") &&
						this.getIsFeatureEnabled("UseQueryOptimize") && this.isNotEmpty(this.$CurrentFolder);
				if (!response.success && !isContinueExecution) {
					performanceManager.stop(performanceManagerLabel);
					return;
				}
 
				this.initCanLoadMoreData(newCollection);
				this.prepareResponseCollection(newCollection);
				this.initIsGridEmpty(newCollection);
 
				newCollection = this.clearLoadedRecords(newCollection);
				newCollection.eachKey(function(key, item) {
					gridData.insert(0, key, item);
				});
 
				this.addItemsToGridData(newCollection);
				this.addSelectedRecords(newCollection);
				this._setRecordsCount(newCollection);
				if (!preloadGridData.isEmpty()) {
					this.addItemsToGridData(preloadGridData, this.getAddRowsOptions());
					this.addSelectedRecords(preloadGridData);
				}
				this.onDataChanged();
				performanceManager.stop(performanceManagerLabel);
			},

 

Т.е. создаю собственную коллекцию, в которую два раза подряд добавляю первый элемент возвращаемой по запросу к объекту ContactAddress коллекции response.collection.collection.items[0], в котором также меняю значение колонки Address. В итоге на детали отображается две записи с одинаковым id, при выводе коллекции в консоль тоже всё верно, но на самой детали Address остался без изменений.

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

Как правильно изменить элемента коллекции? Либо, второй вариант - как добавить в Terrasoft.Collection свой новый элемент (не переопределять результаты запроса, а создать собственный)?

Нравится

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

Пример добавления в Terrasoft.Collection  элементов

var results = this.Ext.create("Terrasoft.Collection");
this.Terrasoft.each(decodedAllowedResults, function(result) {
	var itemId = result.resultId;
	results.add(itemId, {
		id: itemId,
		value: itemId,
		displayValue: result.caption,
	});
}, this);

 

Пример добавления в Terrasoft.Collection  элементов

var results = this.Ext.create("Terrasoft.Collection");
this.Terrasoft.each(decodedAllowedResults, function(result) {
	var itemId = result.resultId;
	results.add(itemId, {
		id: itemId,
		value: itemId,
		displayValue: result.caption,
	});
}, this);

 

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

Проблемы с отправкой запроса. 

Как убрать из заголовка запроса Expect: 100-continue? 

Вызываем веб-сервис из бизнес процесса. 

Нравится

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

1) В блоке скриптаск самому реализовать на c# работу с вэб сервисом

2) Изменить параметр Максимальное число повторений в свойствах БП ниже названия и пакета (нужно проверить) 

1) В блоке скриптаск самому реализовать на c# работу с вэб сервисом

2) Изменить параметр Максимальное число повторений в свойствах БП ниже названия и пакета (нужно проверить) 

Григорий Чех пишет:

1) В блоке скриптаск самому реализовать на c# работу с вэб сервисом

2) Изменить параметр Максимальное число повторений в свойствах БП ниже названия и пакета (нужно проверить) 

Григорий Чех,

сейчас стоит 5000

Стандартное значение равно 100. Видимо, с какой-то целью увеличивали.

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

Добрый день!

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

Нравится

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

Руслан Хасанов,

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

Только убрать префикс в системной настройке "Префикс названия объекта", что делать не рекомендую

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

Руслан Хасанов,

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

Хорошо, спасибо, Григорий, за разъяснение.

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

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

После обновлении( https://academy.terrasoft.ru/documents/instrukciya-po-obnovleniyu-bpmonline-7-12-4?document=enterprise#HT_user_upgrade_instruction_backup) новой версий приложения, вошёл в систему все нормально, но когда я нажал компилировать все, до конца не дошёл, появляется несколько ошибок.

Это системные файлы, изменить нельзя.

Можете подсказать решение для такой ситуаций??

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

Нравится

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

Добрый день. Вы уверены что при обновлении использовали бинарники для того же продукта что и у вас? (т.е. если у вас SalesEnterprice, бинарники от SalesCommerce не подойдут). Также обновляться можно только на одну версию (на версию 7.12.4 можно обновляться только с 7.12.3).

Добрый день. Вы уверены что при обновлении использовали бинарники для того же продукта что и у вас? (т.е. если у вас SalesEnterprice, бинарники от SalesCommerce не подойдут). Также обновляться можно только на одну версию (на версию 7.12.4 можно обновляться только с 7.12.3).

Дмитрий А.,

Добрый день Дмитрий

Вот здесь название бинарных файлов, версия 7.12.3.980_SalesEnterprise_Marketing_ServiceEnterprise_Demo_MSSQL_ENU и 7.12.4.924_SalesEnterprise_Marketing_ServiceEnterprise_Softkey_MSSQL_ENU, из название видно что старое версия идет с демо-наполнением, а новая Softkey, может быть в этом причина ??

Не могу ответить,наверно лучше обратиться в саппорт.

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

Добрый день! 

При работе с деталью "Продукт" раздела "Продажи" у некоторых продаж происходит так, что при сохранении детали страница переключается на первую закладку "Данные о продаже". К тому же, деталь "Продукт" оказывается на этой же закладке ("Данные о продаже") в режиме редактирования записи строки, которую добавляли или редактировали в детали на закладке "Продукты". После переключения на закладку "Продукты" и обратно, в закладке "Данные о продаже" детали уже не видно. Ошибок в консоли нет. С чем это может быть связано?

Нравится

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

actionDashboardModule Используется для показа следующих шагов в том числе и уведомлений из БП, автогенерируемых страниц, активностей и тд

Уточните, речь идет о базовой конфигурации или у Вас доработанная версия со своей логикой?

Доработанная.

Руслан Хасанов,

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

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

Спасибо, Алла, за поддержку. Постараюсь понять где проблема.

Продолжительные поиски привели к такому выводу: происходит обновление страницы продажи в ответ на коробочное сообщение по следующей подписке - 

this.sandbox.subscribe("ReloadCard", this.onReloadCard, this, [actionDashboardModuleId]);

, в результате чего происходит инициализация закладок и текущей устанавливается первая закладка. С этого момента понять пока не получилось почему модуль actionDashboardModuleId посылает данное сообщение. Единственное что я произвожу это обновление детали командой: this.updateDetail({reloadAll: true});, которую перегрузил, добавив в нее код устанавливающий атрибуты детали, которые я сам же добавил. Какое отношение ко всему этому имеет actionDashboardModuleId модуль, кто нибудь может объяснить?

actionDashboardModule Используется для показа следующих шагов в том числе и уведомлений из БП, автогенерируемых страниц, активностей и тд

Спасибо, Григорий, за разъяснение. В моем случае по продаже не запущены БП, лента шагов так же не затронута, автогенерируемые страницы так же отображаются, активностей тоже нет. По какой то причине сообщение ReloadCard публикуется при обновлении детали.

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

Добрый день. Можно ли как-то вызвать из C# кода установку данных, зная id или название требуемого элемента?

Нравится

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

Добрый день!

Получаете Uid данных и вызываете код:

var utilities = new Terrasoft.Core.Packages.PackageInstallUtilities(userConnection);
utilities.InstallSortedData(uids, true);

 

Что вы подразумеваете под установкой данных? В моем понимании это всего лишь записи в БЛ с определенной структурой, и на c# вы можете их добавлять через esq или insert запросы или выполнять пользовательские sql запросы через CustomQuery

 

Григорий Чех,

Я имею в виду данные пакета. 

Добрый день!

Получаете Uid данных и вызываете код:

var utilities = new Terrasoft.Core.Packages.PackageInstallUtilities(userConnection);
utilities.InstallSortedData(uids, true);

 

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

Добрый день,

у меня версия 7.12.3, и хочу обновить до версии 7.12.4, и согласно инструкциям(https://academy.terrasoft.ru/documents/instrukciya-po-obnovleniyu-bpmonline?utm_source=newsletter&utm_medium=email&utm_campaign=regular_updates_v7133_partners_ru&bulk_email_rid=8931&bpmtrackid=4&bpmreplica=0&contactId=3ab32569-7f5a-4cc8-a6f6-fd19fcac2ec5&bulkEmailRecipientId=99611cd5-0227-450f-a60d-9ba30890d353), сначала надо выполнить действия Сгенерировать исходный код для всех элементов, и когда я это делаю, появляться ошибка.  В логах  такая ошибка: 

Ошибка генерации исходного кода схемы "PredictCaseFieldValuesProcess" из пакета "MLCaseClassification". UId ce078417-ab31-44be-9c43-9199d72e8a92: Unable to cast object of type 'Terrasoft.Core.Process.ProcessSchemaStartSignalEvent' to type 'Terrasoft.Core.Process.ProcessSchemaActivity'.

2019-04-22 16:27:18,176 System.InvalidCastException: Unable to cast object of type 'Terrasoft.Core.Process.ProcessSchemaStartSignalEvent' to type 'Terrasoft.Core.Process.ProcessSchemaActivity'.

   at Terrasoft.Core.Process.BaseFlowSchemaGenerator`1.AddParameterMapInfo(Dictionary`2 processParameters, String match)

   at Terrasoft.Core.Process.BaseFlowSchemaGenerator`1.AnalyzeParameterScriptCode(Dictionary`2 processParameters, ProcessSchemaParameter schemaParameter)

   at Terrasoft.Core.Process.BaseFlowSchemaGenerator`1.FillProcessParameterInfo(Dictionary`2 processParameters, ProcessSchemaParameter schemaParameter, String keyPrefix)

   at Terrasoft.Core.Process.BaseFlowSchemaGenerator`1.FillProcessParameterMappings(Dictionary`2 parametersMapInfo, IEnumerable`1 schemaParameters, Guid schemaElementUId)

   at Terrasoft.Core.Process.BaseFlowSchemaGenerator`1.GenerateProcessParameterMappings()

   at Terrasoft.Core.Process.FlowSchemaGenerator.Generate()

   at Terrasoft.Core.Process.BaseProcessSchema.GenerateFlowSchema(IProcessComponentSetStateService stateService)

   at Terrasoft.Core.Process.ProcessSchemaManager.SaveFlowSchema(ProcessSchema schema, UserConnection connection)

   at Terrasoft.Core.Process.BaseProcessSchemaManager`1.ActualizeSchemaInfo(TBaseProcessSchema schema, Guid schemaId, UserConnection connection)

   at Terrasoft.Core.Process.BaseProcessSchemaManager`1.GetSchemaSources(TBaseProcessSchema schema, Guid schemaId, UserConnection connection)

   at Terrasoft.Core.SchemaManager`1.GenerateSchemaSources(TSchemaManagerSchema schema, Guid schemaId, UserConnection userConnection)

   at Terrasoft.Core.SchemaManager`1.GenerateSchemaSources(Guid sysSchemaId, ISchemaManagerItem schemaManagerItem, UserConnection userConnection)

   at Terrasoft.Core.Packages.PackageInstallUtilities.InternalInstallSchemasAssociatedData(Guid schemaId, SchemaDescriptor schemaDescriptor, Boolean continueIfError)

2019-04-22 16:27:18,184 Ошибка выполнения операции на элементе "PredictCaseFieldValuesProcess", UId = ce078417-ab31-44be-9c43-9199d72e8a92.

2019-04-22 16:27:18,184 System.InvalidCastException: Unable to cast object of type 'Terrasoft.Core.Process.ProcessSchemaStartSignalEvent' to type 'Terrasoft.Core.Process.ProcessSchemaActivity'.

   at Terrasoft.Core.Process.BaseFlowSchemaGenerator`1.AddParameterMapInfo(Dictionary`2 processParameters, String match)

   at Terrasoft.Core.Process.BaseFlowSchemaGenerator`1.AnalyzeParameterScriptCode(Dictionary`2 processParameters, ProcessSchemaParameter schemaParameter)

   at Terrasoft.Core.Process.BaseFlowSchemaGenerator`1.FillProcessParameterInfo(Dictionary`2 processParameters, ProcessSchemaParameter schemaParameter, String keyPrefix)

   at Terrasoft.Core.Process.BaseFlowSchemaGenerator`1.FillProcessParameterMappings(Dictionary`2 parametersMapInfo, IEnumerable`1 schemaParameters, Guid schemaElementUId)

   at Terrasoft.Core.Process.BaseFlowSchemaGenerator`1.GenerateProcessParameterMappings()

   at Terrasoft.Core.Process.FlowSchemaGenerator.Generate()

   at Terrasoft.Core.Process.BaseProcessSchema.GenerateFlowSchema(IProcessComponentSetStateService stateService)

   at Terrasoft.Core.Process.ProcessSchemaManager.SaveFlowSchema(ProcessSchema schema, UserConnection connection)

   at Terrasoft.Core.Process.BaseProcessSchemaManager`1.ActualizeSchemaInfo(TBaseProcessSchema schema, Guid schemaId, UserConnection connection)

   at Terrasoft.Core.Process.BaseProcessSchemaManager`1.GetSchemaSources(TBaseProcessSchema schema, Guid schemaId, UserConnection connection)

   at Terrasoft.Core.SchemaManager`1.GenerateSchemaSources(TSchemaManagerSchema schema, Guid schemaId, UserConnection userConnection)

   at Terrasoft.Core.SchemaManager`1.GenerateSchemaSources(Guid sysSchemaId, ISchemaManagerItem schemaManagerItem, UserConnection userConnection)

   at Terrasoft.Core.Packages.PackageInstallUtilities.InternalInstallSchemasAssociatedData(Guid schemaId, SchemaDescriptor schemaDescriptor, Boolean continueIfError)

Подскажите что нужно сделать что бы ее исправить?

Конфигурация успешно компилируется. Сайт работает.

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

Нравится

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

Для решения необходимо добавить запись <add key="Feature-UseCodeAnalyzer" value="false" /> (или если она есть модифицировать значением false), в конфиге приложения  и WorkspaceConsole (Terrasoft.WebApp\Web.config и Terrasoft.Tools.WorkspaceConsole.exe.config). Затем выполнить команду "Сгенерировать для требующих генерации" и команду "Компилировать все".

Мотков Илья,

Спасибо, внес изменения в Web.config и Terrasoft.Tools.WorkspaceConsole.exe.config и заработало.

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