Все довольно просто: есть чтение данных с режимом чтения = "Читать коллекцию записей". Имя элемента ReadDataUserTask1. Версия bpm 7.12.4, процесс не компилируемый, соответственно напрямую, как раньше к элементу не обратиться.

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

 Нужно использовать метод T Get(string propertyPath), но возникает 2 проблемки:

1) Чему равен propertyPath? Точно не ResultCompositeObjectList - поскольку он выдаёт результат для режима чтения = "Читать коллекцию записей"

2) какой тип T использовать, Entity? Или какой-то другой? В аналогичной задаче удалось определить как получить массив элементов с колонками. Но там читали коллекцию записей.

var entities = Get("ReadDataUserTask1.ResultCompositeObjectList");

 

В автогенерируемом коде для элемента ReadDataUserTask1 создаётся целый набор параметров, который я пробовал получать в режиме отладки в элементе задание-сценарий:

var x01 = Get("ReadDataUserTask1.DataSourceFilters");

var x02 = Get("ReadDataUserTask1.ResultType");

var x03 = Get("ReadDataUserTask1.ReadSomeTopRecords");

var x04 = Get("ReadDataUserTask1.NumberOfRecords");

var x05 = Get("ReadDataUserTask1.FunctionType");

var x06 = Get("ReadDataUserTask1.AggregationColumnName");

var x07 = Get("ReadDataUserTask1.OrderInfo");

var x08 = Get("ReadDataUserTask1.ResultEntity");

var x09 = Get("ReadDataUserTask1.ResultCount");

var x10 = Get("ReadDataUserTask1.ResultIntegerFunction");

var x11 = Get("ReadDataUserTask1.ResultFloatFunction");

var x12 = Get("ReadDataUserTask1.ResultDateTimeFunction");

var x13 = Get("ReadDataUserTask1.ResultRowsCount");

var x14 = Get("ReadDataUserTask1.CanReadUncommitedData");

var x15 = Get("ReadDataUserTask1.ResultEntityCollection");

var x16 = Get("ReadDataUserTask1.EntityColumnMetaPathes");

var x17 = Get("ReadDataUserTask1.IgnoreDisplayValues");

var x18 = Get("ReadDataUserTask1.ResultCompositeObjectList");

var x19 = Get("ReadDataUserTask1.ConsiderTimeInFilter");

Но ни один из них не наполнен полями объекта и их значениями.

 

 

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

Нравится

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

Добрый день! Не подскажу про элемент процесса "читать коллекцию", но для работы с коллекцией проще всего использовать такой код:

var esq = new EntitySchemaQuery(UserConnection.EntitySchemaManager, "UsrCustom123");
esq.AddColumn("Id");
esq.AddColumn("Name");
 
var Filter1 = esq.CreateFilterWithParameters(FilterComparisonType.Equal, "Name", "zzz");
esq.Filters.Add(Filter1);
 
var EsqCollection = esq.GetEntityCollection(UserConnection);
	if (EsqCollection.Count>0) {
		foreach (var name in EsqCollection) {
          var param1 = name.GetTypedColumnValue<string>("Name");
          var param2 = name.GetTypedColumnValue<Guid>("Id");
         ///ваш код..
        }
    }

 

Добрый день! Не подскажу про элемент процесса "читать коллекцию", но для работы с коллекцией проще всего использовать такой код:

var esq = new EntitySchemaQuery(UserConnection.EntitySchemaManager, "UsrCustom123");
esq.AddColumn("Id");
esq.AddColumn("Name");
 
var Filter1 = esq.CreateFilterWithParameters(FilterComparisonType.Equal, "Name", "zzz");
esq.Filters.Add(Filter1);
 
var EsqCollection = esq.GetEntityCollection(UserConnection);
	if (EsqCollection.Count>0) {
		foreach (var name in EsqCollection) {
          var param1 = name.GetTypedColumnValue<string>("Name");
          var param2 = name.GetTypedColumnValue<Guid>("Id");
         ///ваш код..
        }
    }

 

Получить и обработать коллекцию в интрпритируемом БП можно примерно так:

var entities = Get<ICompositeObjectList<ICompositeObject>>("ReadDataUserTask.ResultCompositeObjectList");
var result = "";
foreach(var entity in entities) 
{
      var cityName = entity.GetTypedColumnValue<string>("Name");
}

 

Константин, я так понял вам нужно считать 1 запись, а не коллекцию?

Тогда можно просто поставить режим чтения "Читать коллекцию записей", "Читать первые 1 записей". Ну и дальше использовать коллекцию ResultCompositeObjectList

var entities = Get<ICompositeObjectList<ICompositeObject>>("ReadDataUserTask1.ResultCompositeObjectList");
var entity = entities.FirstOrDefault();

Так как, к сожалению, ReadDataUserTask1.ResultEntity всегда возвращает null для интерпретируемых процессов

Сидоров Александр В.,

Интересно как вы это поняли?  в начале первая строчка:

"Все довольно просто: есть чтение данных с режимом чтения = "Читать коллекцию записей". "

Добавить комментарий

Григорий Чех, далее в тексте автор говорит про одну запись

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

Версия 7.12.4.

Добавил деталь в р. "Обращения портала"

При инициализации детали получаю ошибку: 

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

После отладки выявлено, что ошибка связана с вызовом не существующего сallback в методе initDetailRunProcessButtonMenu миксина  ProcessEntryPointUtilities.

В результате этой ошибки деталь не отображается в карточке Обращения на портале.



 

 

Нравится

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

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

/**
 * Initializes "Run process" menu items in detail.
 * @param {Function} callback Callback function.
 * @param {Object} scope Execution context.
 * @protected
 */
initDetailRunProcessButtonMenu: function(callback, scope) {
	var processButtonMenu = this.get("RunProcessButtonMenuItems");
	if (!processButtonMenu) {
		processButtonMenu = this.Ext.create("Terrasoft.BaseViewModelCollection");
		this.set("RunProcessButtonMenuItems", processButtonMenu);
	}
	if (Terrasoft.ProcessEntryPointUtilities.getCanRunProcessFromSection()) {
		this._initDetailAvailableProcessList(processButtonMenu, callback, scope);
	} else {
		callback.call(scope);
	}
},

Возможно, для стандартной детали до else и не доходит.

Илья, добрый день.

В том то и дело, что 

Terrasoft.ProcessEntryPointUtilities.getCanRunProcessFromSection() и проверяет, не является ли пользователь пользователем портала, и в интерфейсе сотрудника возвращает true, и как следствие выполняется this._initDetailAvailableProcessList(processButtonMenu, callback, scope);

НО если пользователь является пользователем портала, то выполняется callback.call(scope);, а callback в этот метод не передается и равен undefind

Т.о. при выводе детали для пользователя портала  получаем ошибку

Сравните с другой деталью тоже на портале, как там работает эта функция.

Мотков Илья,

Деталей на портале нет. 

Вопрос в том, почему в initDetailRunProcessButtonMenu не передаётся callback

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

Мотков Илья,

Метод initDetailRunProcessButtonMenu  вызывается в BaseGridDetailV2 в методе initData и не принимает аргументы (см. https://yadi.sk/i/UoJ5M8kHo9s1kw)

Но в условии else вызывается callback.call(scope);, который по определению вернёт ошибку( т.к. initDetailRunProcessButtonMenu  не принимает аргументов)

Сам метод initDetailRunProcessButtonMenu   описан в схеме-миксине ProcessEntryPointUtilities



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



Для себя временной решение я уже нашёл, но хотелось бы получить исправление в коробочной версии.

Либо переделайте initData, чтобы передавала в функцию эти два параметра, либо в самой initDetailRunProcessButtonMenu добавьте проверку на заполненность параметра, либо, если initData — это единственное место в системе, где функцию initDetailRunProcessButtonMenu вызывают и else не сможет отработать в принципе, исключите нижнюю ветвь.

Мотков Илья,

Илья, решение я уже нашёл (заместил 

BaseGridDetailV2 и метод initDetailRunProcessButtonMenu.)

Целью этой публикации на community является обратить внимание поддержки Terrasoft на не корректную реализацию метода initDetailRunProcessButtonMenu и на проблемы, которые, эта реализация вызывает. 

Чтобы это по возможности было исправлено в следующих релизах.

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

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

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