Помогите разобраться с синтаксисе 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 их откуда-то взял :) Поделитесь знаниями? :)
Заранее спасибо.
Нравится
Добрый вечер.
Вот таким образом можно получить значение параметра:
DateTime collectionDate = Get<DateTime>("CollectionDate");
А вот так присвоить:
Set<DateTime>("StorageDate", storageDate);
Вам в Set в скобочках нужно для данных, которые Вы устанавливаете, указать тип.
Добрый вечер.
Вот таким образом можно получить значение параметра:
DateTime collectionDate = Get<DateTime>("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> и пытались автоматически преобразовать в массив строк. Если такое не предусмотрено, нужно самостоятельнообрабатывать, например, перебирая элементы коллекции и считывая значения поля, где хранится интересующий текст.