Помогите разобраться с синтаксисе Get и Set для задания-сценария

Коллеги, всем здоровья. Не могу разобраться в синтаксисе методов Get и Set для элемента процесса "задание-сценарий". Прошу помощи.

 

Кейс следующий.

В бизнес-процессе есть шаг "читаем данные", в результате которого получается коллекция значений. Задача: преобразовать коллекцию в строку и записать её в параметр бизнес-процесса, чтобы потом передавать как строку в веб-сервис (потому что внешнему приложению нужна именно строка, а не массив, и на внешней стороне этого не поправить).

 

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

 

Судя по странице документации для получения/передачи параметров нужно использовать методы Set и Get вот с таким синтаксисом:



Get(string path)

Set(string path, T value)

 

При этом: 

T — тип значения параметра;

path — строка, определяющая путь к параметру или свойству. Путь формируется согласно правилам:

имя параметра”,

“имя свойства”,

“имя элемента.имя параметра”,

“имя элемента.имя свойства”.

 

В Creatio Community я нагуглил вот такой пример Get метода для получения коллекции:



Get>("ReadDataUserTask1.ResultCompositeObjectList");



А path сформировал исходя из того, что элемент (шаг) чтения данных называется ReadDataUserTask6, а параметр, который мне нужен - ResultCompositeObjectList.



В результате в сценарии получился вот такой код:



string[] products = Get>("ReadDataUserTask6.ResultCompositeObjectList");



string productstring = "";

String seperator = ", ";

productstring += String.Join(seperator, products);



Set("ProcessSchemaParameter2", string productstring);



return true;

 

При компиляции шага получаю вот это:



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

 

Открываю исходный код бизнес-процесса, смотрю на 40 строчку и не понимаю, что не так:

 

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

 

(а) синтаксис в точности такой же, как указано в документации:

Set(string path, T value)



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



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



Если это не "String", то что? И вообще, как определить эти значения, которые нужно подставлять вместо буковки Т? Ведь автор примера в community их откуда-то взял :) Поделитесь знаниями? :)



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

 

Нравится

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

Добрый вечер.

 

Вот таким образом можно получить значение параметра:

DateTime collectionDate = Get<DateTime>("CollectionDate");

 

А вот так присвоить:

Set<DateTime>("StorageDate", storageDate);

 

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

 

Добрый вечер.

 

Вот таким образом можно получить значение параметра:

DateTime collectionDate = Get&lt;DateTime&gt;("CollectionDate");

 

А вот так присвоить:

Set<DateTime>("StorageDate", storageDate);

 

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

 

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

 на сколько я помню то Set ставится без указания типа

Set(" StorageDate ", storageDate);

В вашем случае Вы указали все верно, только не нужно было указывать тип для передаваемого параметра - Set("ProcessSchemaParameter2", productstring);

Александр Тыра пишет:

на сколько я помню то Set ставится без указания типа Set(" StorageDate ", storageDate);

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

 

Странно то, что установка параметра процесса работает и в синтаксисе, который приведен мной с указанием типа данных в скобочках.

 

На досуге попробую разобраться с этим, если будет что-то интересное, то поделюсь здесь.

Коллеги, всем спасибо за ответы. Действительно, указание типа данных в синтаксисе для метода "Set" работает. Это оказалось очень полезным для отладки. Чтобы убедиться в работоспособности метода я попробовал передать статичную строку "Hello" и вывести её на автогенерируемую страницу. Сработало только с указанием типа данных.



При этом синтаксис для метода Set, указанный Аллой отличается от синтаксиса, указанного в официальной документации. 

У Аллы (то, что сработало): 

Set<DateTime>("StorageDate", storageDate);

 

То есть, в терминологии документации это

Set<Т>(string path, value)

 

Сравните с тем, что написано в статье документации:

Set(string path, T value)

 

Это меня и смутило.

 

И ещё - всё-таки, как "простому смертному" понять, что при работе с коллекцией нужно декларировать тип данных как <ICompositeObjectList<ICompositeObject>> ? Я не нашёл этого в описании, а это ведь важное знание, без него функционалом метода пользоваться не получится. 



Коллеги из Террасофт - если вы нас читаете, поправьте, пожалуйста сигнатуру метода Set в указанной статье документации и добавьте сопоставление значения параметра T в методе для *каждого* типа данных в бизнес-процессе. Вот скриншот дропдауна с вариантами типа данных в параметре процесса. Смотрите, сколько их там:

 

Не знаю как другим, а мне как разработчику это просто категорически важно. ОК, для коллекции значений я нагуглил <ICompositeObjectList<ICompositeObject>> . А вот как понять, какой тип данных у коллекции значений с атрибутами? А у коллекции объектов (EntityCollection)?

 

А ещё ведь возникают вопросы вроде "у вас 5 вариантов дробных чисел, для всех вариантов прописывать <float>?"

 

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

Евгений, поискал по содержимому cs-файлов конфигурации, вариант Set без типа в угловых скобках не раз встречается в «коробке». Например, в FileImportProcess для логического:

Set("IsUsePersistentFileImportEnabled", UserConnection.GetIsFeatureEnabled("UsePersistentFileImport"));

А со скобками встречается только в доработанном коде. Вероятно, по аналогии с Get.

 

В чём преимущество с типом, что хотите его внести в документацию? Как именно не работает на автогенерируемой странице со строкой? А если строку-константу явно привести к string, то нормально? 

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

Да, именно если для строки-константы явно указать string, то работает. Согласен, что по всей видимости код доработан по аналогии с Get. Речь о внесении в документацию идет не из-за преимуществ с типом/без типа, а из-за того, что если указывать тип так, как это написано в документации, компилятор выдаёт ошибки. Т.е. то, что сейчас написано в документации, не соответствует тому, как фактически нужно делать. 



А до файлов конфигурации мне физически не добраться, т.к. у нас облако. 

По последнему, я искал не в файлах, а через базу в SysSchemaSource. В облаке тоже можно, если ставить дополнение для SQL-запросов.

 

По отсутствию примера Set, недокументированному параметризируемому Set<> и списку типов, согласен, написал им. Обратите внимание, в академии внизу есть форма для обратной связи.

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

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

Спасибо за полезную информацию

Друзья, нид хелп) 

Задача ровно такая же, как у Евгения.

Скрипт вот такой:

string[] placeId = Get<ICompositeObjectList<ICompositeObject>>("WebService1.AxCandidatesPlaceid");

string placeidstring = "";

string seperator = ", ";

placeidstring += String.Join(seperator, placeId);

Set("ParsedPlaceId", placeidstring);

return true;

где AxCandidatesPlaceid - текстовый параметр из коллекции входящих параметров 

 

При компиляции получаю ошибку: 

Cannot implicitly convert type 'Terrasoft.Common.ICompositeObjectList<Terrasoft.Common.ICompositeObject>' to 'string[]'

 

Подскажите, как можно исправить? Куда смотреть? 

Сергей, Вы считали объект типа ICompositeObjectList<Terrasoft.Common.ICompositeObject> и пытались автоматически преобразовать в массив строк. Если такое не предусмотрено, нужно самостоятельнообрабатывать, например, перебирая элементы коллекции и считывая значения поля, где хранится интересующий текст.

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