Вопрос

Привет,

Столкнулся с проблемой:

Версия: 7.13.4.638_SalesEnterprise_Marketing

Действие: Отладка бизнес процесса

Описание:

Версия Visual Studio - 2017 Pro

В процессе отладки серверного кода бизнес процесса столкнулся с проблемой, уже ранее описанной в теме https://community.terrasoft.ua/taxonomy/term/7738. Хотелось бы понять, для версии 7.13 возможно ли каким либо образом решить проблему просмотра переменных в режиме дебага без ошибки Cannot obtain value of the local variable or argument because it is not available at this instruction pointer, possibly because it has been optimized away, либо это невозможно. Дело в том, что невозможность посмотреть значение переменных замедляет разработку.

Так же не везде удается установить breakpoints. Возможно эти проблемы связаны между собой.

Что не помогло:

1. Заново выполнить Attach to Process.

2. Установка Suppress JIT optimization on module load в настройках дебага.

3. В Build проекта снята галка Optimize code и Debugging information = Full

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

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

Привет,

Столкнулся с проблемой:

Версия: 7.13.4.638_SalesEnterprise_Marketing

Действие: Отладки бизнес процесса

Описание:

Создал бизнес процесс. В нем определил задание-сценарий. Мне нужно его отладить. Для этих целей выполнил все шаги, описанные в инструкции https://academy.terrasoft.ua/documents/technic-sdk/7-13/otladka-servernogo-koda

Столкнулся с проблемой, - все установленные мной точки останова неактивны The breakpoint will not currently be hit. 
No symbols have been loaded for this document.

Выполнил шаги по устранению этой проблемы, описанные в инструкции, однако проблема осталась актуальной.

Так же:

Версия IDE - vs2017 pro.

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

Для старта БП отправляю POST запрос при помощи postman. Запрос вида:

http://{адрес}/0/ServiceModel/ProcessEngineService.svc/RunProcess

JSON:

{
  "parameterValues": 
  [
      {"name": "IdString", "value": "A9CF364A-CE81-453E-B85D-001F788A41ED"},
      {"name": "TypeString", "value": "68E23EAE-62A2-43FE-AE33-8F41376AFBED"},
      {"name": "ID_Boss", "value": "123"}, 
      {"name": "ID_Navision", "value": "88706"},
      {"name": "DeliveryAddress", "value": "TEST"},
      {"name": "SearchName", "value": "6"},
      {"name": "name", "value": "улица, 6"},
      {"name": "OwnerId", "value": "center"}
  ],
  "schemaUId": "e18ae725-4f32-44c1-ba33-3ae749c40ed0",
  "schemaName": "UsrImportOrUpdateAccount"
}

Подключаюсь для отладки к правильному w3wp.exe. В пуле 1 поток, пул запускается из под моей учетки.

pdb файлы находятся в той же папке, где и *.cs файлы.

UPD1: при открытии в IDE .cs файла бизнес процесса подсказчик IDE указывает на то, что многие классы не определены, к примеру, почеркивается ProcessSchemaManager, using Terrasoft.Core.Entities; и тд, но, как я понял, при данном виде отладки это ок и мне не нужно делать build проекта с прикрепленными к нему файлами, которые нужно отладить.

Проект использует .NET Framework 4.7

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

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

Для решения проблемы попробуйте в Visual Studio изменить следующие настройки:

1) в Options->Debugging->General: Enable Just My Code - выключить

2) Suppress JIT optimization - включить

Алла Савельева,

Большое спасибо!

Мне помог пункт 1. Пункт 2 был выполнен по документации ранее.

AlexMatveev,

Рада была помочь!

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

Как заместить функцию initconfig модуля UserCasesListModule.

Для изменения фильтрации нужно изменить данную функцию у этого модуля.

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

Пробывал сделать вот так результатов не дало

define("ITUserCasesListModule", ["terrasoft", "UserCasesListModule","ext-base", "UserCasesListModuleResources",
"PortalClientConstants",
		"BaseNestedModule", "GridUtilitiesV2", "ContainerListGenerator", "ContainerList", "DashboardGridModule",
		"css!PortalModulesCSS"],
	function(Terrasoft, Ext, resources, PortalClientConstants) {
 
		Ext.define("Terrasoft.configuration.ITUserCasesListModule", {
			extend: "Terrasoft.UserCasesListModule",
			alternateClassName: "Terrasoft.ITUserCasesListModule",
 
			Ext: null,
			sandbox: null,
			Terrasoft: null,
			showMask: null,
 
			/**
			 * ### ###### ###### ############# ### ########## ######.
			 * @type {String}
			 */
			viewModelClassName: "Terrasoft.UserCasesListViewModel",
 
			/**
			 * ### ##### ########## ############ ############# ########## ######.
			 * @type {String}
			 */
			viewConfigClassName: "Terrasoft.UserCasesListViewConfig",
 
			/**
			 * ### ##### ########## #############.
			 * @type {String}
			 */
			viewGeneratorClass: "Terrasoft.ViewGenerator",
 
			/**
			 * ############## ###### ############ ######.
			 * @protected
			 * @overridden
			 */
			initConfig: function() {
				this.moduleConfig =	{
					"caption": "",
					"sectionId": PortalClientConstants.SysModule.PortalMainPageSectionId,
					"entitySchemaName": "Case",
					"filterData": "{\"className\":\"Terrasoft.FilterGroup\",\"items\":{},\"logicalOperation\":0," +
						"\"isEnabled\":true,\"filterType\":6,\"rootSchemaName\":\"Case\",\"key\":\"\"}",
					"style": "widget-green",
					"orderDirection": 2,
					"orderColumn": "RegisteredOn",
					"rowCount": 10,
					"gridConfig": {
						"items": [
							{
								"bindTo": "Number",
								"type": "text",
								"position": {
									"column": 0,
									"colSpan": 6,
									"row": 1
								},
								"aggregationType": "",
								"metaPath": "Number",
								"path": "Number"
							},
 
							{
								"bindTo": "RegisteredOn",
								"type": "title",
								"position": {
									"column": 50,
									"colSpan": 0,
									"row": 1
								},
								"orderDirection": 2,
								"orderPosition": 1,
								"dataValueType": 7,
								"aggregationType": "",
								"metaPath": "RegisteredOn",
								"path": "RegisteredOn"
							}
						]
					}
				};
			}
 
		});
 
		return Terrasoft.ITUserCasesListModule;
	}
);

 

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

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

Выходит во такая ошибка

Казанцев Андрей Юрьевич,

Обратите внимание, что, начиная с версии 7.13, замещение клиентских модулей запрещено. Подробнее посмотрите пост с обсуждением.

Теперь по Вашему вопросу - ошибка в заголовке функции. Должно быть вот так:

define("ITUserCasesListModule", ["terrasoft", "ext-base", "UserCasesListModuleResources",
"PortalClientConstants",
		"BaseNestedModule", "GridUtilitiesV2", "ContainerListGenerator", "ContainerList", "DashboardGridModule",
		"css!PortalModulesCSS", "UserCasesListModule"],
	function(Terrasoft, Ext, resources, PortalClientConstants) {

 

Алла Савельева пишет:

Казанцев Андрей Юрьевич,

Обратите внимание, что, начиная с версии 7.13, замещение клиентских модулей запрещено. Подробнее посмотрите пост с обсуждением.

Теперь по Вашему вопросу - ошибка в заголовке функции. Должно быть вот так:


 
define("ITUserCasesListModule", ["terrasoft", "ext-base", "UserCasesListModuleResources",
"PortalClientConstants",
		"BaseNestedModule", "GridUtilitiesV2", "ContainerListGenerator", "ContainerList", "DashboardGridModule",
		"css!PortalModulesCSS", "UserCasesListModule"],
	function(Terrasoft, Ext, resources, PortalClientConstants) {

Как это можно обойти?

 

Обратите внимание, у Аллы приведен другой порядок в define.

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

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

 

Подскажите, пожалуйста, как  изменить цвет фона и шрифтов сообщений и комментариев во вкладке "обработка" в обращениях? 

 

 

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

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

Посмотрите эту тему и эту статью. Для деталей тоже должно работать

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

Добрый день.

Подскажите как реализовать фильтрацию по колонке Status по определенным статусам обращений(не отображались закрытые и отмененные обращения)?

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

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

См. аналогичное добавление фильтра здесь.

Зверев Александр пишет:

См. аналогичное добавление фильтра здесь.

Этот вариант не рабочий. Потому что при добавлении функции она не вызывается. Нашел другое решение, все работает. 

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

Добрый день!

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

actionMenuItems.addItem(this.getButtonMenuItem({
                    "Caption": {"bindTo": "Resources.Strings.EditRightsCaption"},
                    "Tag": "editRights",
                    "Visible": {"bindTo": "getSchemaAdministratedByRecords"}
                }));

метод же найти не могу.

Нужно для назначения прав на страницу контрагента в БП без использования Terrasoft.Core.DB

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

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

По нажатию на кнопку действия 'Настроить права доступа' вызывается окно для редактирования прав, в котором пользователь вручную раздает права доступа, и его вызов реализован в методе editRights (указан в свойстве 'Tag').

В БП в элементе 'Задание-сценарий' можно реализовать произвольный запрос, в котором выполнять добавление/изменение/удаление данных напрямую в базу данных без использования Terrasoft.Core.DB:

var customQuery = new CustomQuery(context.UserConnection);
customQuery.SqlText = @"insert into Cases (Id) values (newid())";
using (DBExecutor dbExecutor = context.UserConnection.EnsureDBConnection())
{
	var datareader = customQuery.ExecuteReader(dbExecutor);
}
return true;

Вот ещё другой пример:

var userConnection = context.UserConnection;
var dr = new CustomQuery(userConnection, String.Format(
"update case set SolutionProvidedOn = null where Id = 974ca9fc-c066-4a7a-ac65-7ec91a44a067")).ExecuteReader(dbExecutor);
return true;

 

Спасибо, Алла.

В БП этот код вызывает ошибку компиляции "The name dbExecutor does not exist in the current context"

Либо "The type or namespace name 'IDataReader' coul not be found" в первом варианте.

То есть это работает только для неинтерпетируемого процесса? 

Естественно, использование в БП блоков скриптов на C# требует компиляции процесса.

Виталий Егоров,

Если Вы используете второй вариант, попробуйте вместо UserConnection написать context.UserConnection.

 

Если первый вариант, то приблизительно такой код:

var userConnection = context.UserConnection;
var customQuery = new CustomQuery(userConnection);
customQuery.SqlText = @"insert into Cases (Id) values (newid())"; 
using (DBExecutor dbExecutor = userConnection.EnsureDBConnection())
{
	var reader = customQuery.ExecuteReader(dbExecutor);
}
return true;

 

Виталий Егоров пишет:
В БП этот код вызывает ошибку компиляции "The name dbExecutor does not exist in the current context"

Нужно обернуть в using, как и в первом фрагменте. 

 Либо "The type or namespace name 'IDataReader' coul not be found" в первом варианте.

А тут нужно включить нужную библиотеку System.Data в Usings (в дизайнере БП справа на вкладке «Методы»).

Спасибо, Алла, все работает.

Александр, спасибо, попробую добавить DataReader.

Добавил в этот же БП еще один сценарий с кодом:

foreach (string accountId in accountIdList){
    try {
        var update = new Update(UserConnection, "Account")
               .Set("OwnerId", Column.Parameter(newOwner))
               .Where ("Id").IsEqual(Column.Parameter(accountId));
        update.Execute();
    }
    catch (SqlException ex){
        errorsList.Add(ex.Message);
    }
    finally {
        var sel = new Select(UserConnection)
            .Column("Name")
            .From("Account")
            .Where ("Id").IsEqual(Column.Parameter(accountId));
             using (DBExecutor dbExecutor = context.UserConnection.EnsureDBConnection()) {
            using (IDataReader dataReader = sel.ExecuteReader(dbExecutor)){
                       accountName = CreateJson(dataReader);
            }
        }
        accountNameList.Add(accountName);
    }
}

На выходе получаю ошибку:

'Query' does not contain a definition for 'ExecuteReader' and no extension method 'ExecuteReader' accepting a first argument of type 'Query' could be found (are you missing a using directive or an assembly reference?)

 

 

Может, дело в забытом «as Select» в конце объявления sel? Как тут:

Select select = 
	new Select(UserConnection)
		.Column("Id")
		.From("ActivityStatus")
		.Where("Finish").IsEqual(Column.Parameter(true))
		as Select;
using (var dbExecutor = UserConnection.EnsureDBConnection()) {
	using (IDataReader dr = select.ExecuteReader(dbExecutor)) {
		while (dr.Read()) {
			finishActivityStatuses.Add(UserConnection.DBTypeConverter.DBValueToGuid(dr[0]));
		}
	}
}

 

Спасибо, добрый человек! :)

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

Привет,

Есть вопрос

Версия: 7.13.4.638_SalesEnterprise_Marketing

Место: LDAP интеграция

Описание: Пишу интеграцию со сторонней системой.

Система передает набор данных в бизнес процесс. Среди данных есть SID формата S-1-5-21-1507001333-1204550764-1011284298-1003. В BPM настроена интеграция LDAP. В свойствах интеграции идентификатор пользователя задан как objectSid. Однако в БД в [LDAPElement].[LDAPEntryId] записана строка, по формату отличающаяся от SID. Я предполагаю, что в данное поле пишется SID, но перед этим он проходит обработку.

Вопрос: Есть ли в backend api Terrasoft метод/класс, позволяющий получить корректный SID пользователя? И если нет, то каким образом я могу выполнить преобразование из значения LDAPElement].[LDAPEntryId] в SID?

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

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

Логика работы с LDAP реализована в БП SyncWithLDAPProcess, схемах LDAPSysSettingsService, SyncWithLDAPProcessHelper, LDAPUtility, LDAPUtilities. В последней встречается функция, вызывающая подозрение, что обработка заключается в банальном взятии хэша MD5:

private string GetEntryIdentityAttribute(SearchResultEntry entry, string attributeName) {
	object attributeValue = entry.Attributes[attributeName][0];
	if (!(attributeValue is byte[])) {
		return Convert.ChangeType(attributeValue, typeof(string)).ToString();
	}
	var hasher = MD5.Create();
	byte[] data = hasher.ComputeHash(attributeValue as byte[]);
	var sb = new StringBuilder(512);
	for (int i = 0; i < data.Length; i++) {
		sb.Append(data[i].ToString("x2"));
	}
	return sb.ToString();
}

Соответственно, получить обратно objectSid в описанном формате по нему не получится.

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

Спасибо!

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

Добрый день, 
Добавили в объект Product поле PriceVAT тип FLOAT. Также было добавлено аналогичное поле в объект ProductPrice. В базовой логике, при изменении поля Price объекта Product делается update/insert поля Price объекта ProductPrice и наоборот. Подскажите, в каких схемах и/или событиях вызывается этот метод? Мне нужно для своего поля PriceVAT добавить такой же механизм синхронизации. Спасибо

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

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

Доброе утро!

Данная логика реализована в методе synchronizePrice в схеме ProductPageV2 пакета ProductCatalogue.

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

Добрый день.

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

Подскажите где генерируются данные кнопки?

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

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

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

Все намного проще, обычно определяется (меняется в diff)

{
        "operation": "merge",
        "name": "DataGrid",
        "values": {
                "activeRowAction": {"bindTo": "onActiveRowAction"},
                "activeRowActions": [
                        {
                                "className": "Terrasoft.Button",
                                "style":this.Terrasoft.controls.ButtonEnums.style.BLUE,
                                "markerValue": "myButtonAction",
                                "tag": "myAction",
                                "caption": "MyButton"
                        }
                ]
        }
}

Подробнее тут

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

Григорий Чех у меня нет цели засорять код дифтами.

У меня будет 100 секций в которой будет такая же задача и я буду в каждой дифт делать? 

Мне проще заместить схему и внести свою логику.

Казанцев, 

см в ConfigurationGrid метод renderRowActions

Но его нет при генерации секции

Этот метод перебирает значения из массива activeRowActions:

  renderRowActions: function(renderTo, id) {
   var rowActions = Ext.clone(this.activeRowActions);
   var self = this;
   var isGridEnabled = this.model.get("IsEnabled");
 
   function actionHandler() {
    self.onActionItemClick(this.tag, id);
   }
 
   for (var i = 0, c = rowActions.length; i < c; i += 1) {
    var action = rowActions[i];
    if (isGridEnabled === false && action.tag !== "card") {
     continue;
    }
    action = Ext.apply({}, action, {
     renderTo: renderTo,
     handler: actionHandler,
     classes: {
      wrapperClass: ["configuration-grid-action-button"]
     }
    });
    var actionItem = Ext.create(action.className, action);
    var selectedViewModel = this.getActiveRowViewModel(id);
    actionItem.bind(selectedViewModel);
    actionItem.setEnabled(this.enabled);
    this.actionItems.push(actionItem);
   }
  },

Соответственно, в схемах с дополнительными кнопками в него добавляются элементы. Например, в схеме ContactOpenCasesDetail:

{
	"operation": "merge",
	"name": "DataGrid",
	"values": {
		"activeRowAction": {"bindTo": "onActiveRowAction"},
		"activeRowActions": []
	}
},
{
	"operation": "insert",
	"name": "OpenRecordButton",
	"parentName": "DataGrid",
	"propertyName": "activeRowActions",
	"values": {
		"className": "Terrasoft.Button",
		"style": Terrasoft.controls.ButtonEnums.style.BLUE,
		//TODO localizablestring
		"caption": "Open",//{ "bindTo": "Resources.Strings.OpenButtonCaption"},
		"tag": "open"
	}
},
{
	"operation": "insert",
	"name": "MergeRecordButton",
	"parentName": "DataGrid",
	"propertyName": "activeRowActions",
	"values": {
		"className": "Terrasoft.Button",
		"style": Terrasoft.controls.ButtonEnums.style.GREY,
		//TODO localizablestring
		"caption": "Merge doubles",//{ "bindTo": "Resources.Strings.MergeCaption"},
		"tag": "merge"
	}
}

 

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

Добрый день!

Столкнулся со следующей ошибкой во время билда/ребилда через WorkSpaceConsole, настроенный в VS.

Error: Dependency 'TripUsefulConfigurationService' of package 'Business_Trip_Objects' was not found.

Нашел статью, параметры в консоли и WebConfig значение флага CompileByManagerDependencies совпадает и равняется true.

Нашел обходное решение: выполнение Update Solution, после которого билд и ребилд работают. К сожалению, после очередной выгрузки пакетов в файловую систему ошибка вновь повторяется, операцию апдейта приходится повторять, теряется много времени.

Заранее спасибо!

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

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

Добрый день! Дело в том, что не сгенерировался файл указанный в ошибке. У меня были подобные случаи, помогало компилирование всего приложения из интерфейса конфигурации. При компиляции должны сгенерироваться недостающие файлы.

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