Элемент процесса [Задание-сценарий]

PDF
Продукты
Все продукты

Элемент процесса Задание-сценарий является системным действием, которое выполняет программный код С# сценария и обеспечивает его взаимодействие с другими элементами и данными бизнес-процесса. При помощи элемента реализуется расширенная логика, не предусмотренная базовыми элементами Creatio, например:

  • выполнение сложных математических расчетов;

  • выполнение массовой обработки записей;

  • выполнение циклов;

  • выполнение задач, которые затруднительно реализовать с помощью других элементов системы;

  • замена нескольких последовательных элементов Формула.

Работая с элементом Задание-сценарий, придерживайтесь следующих рекомендаций.

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

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

  • При использовании сторонних схем указывайте точные названия таких схем. Руководствуйтесь данными рекомендациями при написании сторонних схем.

  • Избегайте временных решений, поскольку нестандартный код ухудшает возможности поддержки кода. При выявлении ошибок в процессах контролируйте корректное исправление ошибок.

Чтобы редактировать код сценария, дважды щелкните по элементу на диаграмме. На панели настройки элемента откроется окно для ввода и редактирования программного кода (Рис. 1).

Рис. 1 — Вкладка для редактирования кода задания-сценария
chapter_process_designer_script_task_code.png

 

btn_script_task_bigger_window.png — развернуть окно для ввода программного кода.

btn_script_task_window_small.png — свернуть окно для ввода программного кода.

btn_com_show_hide_outline.png — поиск в тексте программного кода.

btn_com_show_hide_hidden_characters.png — отображение скрытых символов (например, пробелов, табуляции) в тексте кода.

На заметку. Платформа Creatio позволяет выполнять процессы без необходимости их публикации. Однако использование методов и элементов Задание-сценарий требует публикации схемы. Подробнее о вызове методов процесса читайте в статье “Методы веб-сервиса”.

Методы Get и Set 

Все создаваемые бизнес-процессы в Creatio являются интерпретируемыми. Для обращения к значениям параметра процесса следует использовать методы Get и Set (Рис. 2).

Метод Get возвращает значение параметра элемента или процесса.

Сигнатура метода:

Get<T>(string path)

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

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

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

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

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

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

Метод Set указывает значение параметру элемента или процесса.

Сигнатура метода:

Set(string path, T value)

value — указываемое значение,

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

"T" — универсальный параметр, который принимает значение типа соответствующего параметра в терминах C#. Соответствие типов параметров для Creatio и C# приведено в таблице ниже.

Соответствие типов параметров Creatio и C#

Тип параметра Creatio Тип параметра C#
Целое число int
Дробное число (0.00000001) decimal
Дробное число (0.0001)
Дробное число (0.001)
Дробное число (0.01)
Дробное число (0.1)
Деньги
Дата/Время DateTime
Дата
Время
Уникальный идентификатор Guid
Справочник
Логическое bool
Строка (50 символов) string
Строка (250 символов)
Строка (500 символов)
Строка неограниченной длины
Не локализуемая строка
Коллекция значений IObjectList и любые классы, которые реализуют эти интерфейсы 
Коллекция записей ICompositeObjectList<ICompositeObject> и любые классы, которые реализуют эти интерфейсы

Примеры работы с различными типами параметров

Параметр типа "Целое число"
int integerValue = Get<int>("IntegerParameter");
integerValue += 5;
Set<int>("IntegerParameter", integerValue);
Параметры типа "Деньги" и "Дробное число" любой точности
decimal decimalValue = Get<decimal>("DecimalParameter");
decimalValue += 5.5m;
Set<decimal>("DecimalParameter", decimalValue);
Параметр типа "Уникальный идентификатор"
Guid uniqueIdentifierValue = Get<Guid>("UniqueIdentifierParameter");
if (uniqueIdentifierValue != Guid.Empty) {
    uniqueIdentifierValue = Guid.Empty;
    Set<Guid>("UniqueIdentifierParameter", uniqueIdentifierValue);
}
Параметры типов "Дата", "Время" и "Дата/Время"
DateTime dateTimeValue = Get<DateTime>("DateTimeParameter");
dateTimeValue = dateTimeValue.AddDays(1);
Set<DateTime>("DateTimeParameter", dateTimeValue);
Параметр типа "Справочник"
Guid lookupValue = Get<Guid>("LookupParameter");
if (lookupValue.IsEmpty()) {
    lookupValue = (Guid)UserConnection.SystemValueManager.GetValue(UserConnection, "CurrentUserContact");
    Set<Guid>("LookupParameter", lookupValue);
}
Параметры типа "Не локализуемая строка" и "Строка" любой длины
string textValue = Get<string>("TextParameter");
textValue += " and something else";
Set<string>("TextParameter", textValue);
Параметры для локализуемых строк
LocalizableString localizableStringValue = Get<LocalizableString>("LocalizableStringParameter");
CultureInfo cultureRu = CultureInfo.GetCultureInfo("ru-RU");
CultureInfo cultureEn = CultureInfo.GetCultureInfo("en-US");
localizableStringValue.SetCultureValue(cultureRu, "Здравствуйте!");
localizableStringValue.SetCultureValue(cultureEn, "Hello!");
Set<LocalizableString>("LocalizableStringParameter", localizableStringValue);
Параметр типа "Логический"
bool booleanValue = Get<bool>("BooleanParameter");
booleanValue = !booleanValue;
Set<bool>("BooleanParameter", booleanValue);
Параметр типа "Коллекция значений"
ObjectList<int> numbers = ObjectList.Create(1, 2, 3, 4);
Set<ObjectList<int>>("IntegerValuesParameter", numbers);
var items = Get<ObjectList<int>>("IntegerValuesParameter");
items.Add(5);
Set<ObjectList<int>>("IntegerValuesParameter", items);
 
ObjectList<bool> booleanValues = ObjectList.Create(false, true, true, false);
Set<ObjectList<bool>>("BooleanValuesParameter", booleanValues);
booleanValues = Get<ObjectList<bool>>("BooleanValuesParameter");
if (booleanValues.Count == 4) {
    booleanValues.Clear();
}
Set<ObjectList<bool>>("BooleanValuesParameter", booleanValues);
ObjectList<DateTime> dateTimeValues = ObjectList.Create(new DateTime(2020, 08, 03, 13, 15, 14), DateTime.Now);
Set<ObjectList<DateTime>>("DateTimeValuesParameter", dateTimeValues);
 
ObjectList<Guid> guidValues = ObjectList.Create(Guid.NewGuid(), Guid.NewGuid());
Set<ObjectList<Guid>>("GuidValuesParameter", guidValues);
guidValues = Get<ObjectList<Guid>>("GuidValuesParameter");
if (!guidValues.Contains(Guid.Empty)) {
    guidValues.Add(Guid.Empty);
}
Set<ObjectList<Guid>>("GuidValuesParameter", guidValues);
 
ObjectList<decimal> decimalValues = ObjectList.Create(3.14m, 432434.00032m);
Set<ObjectList<decimal>>("DecimalValuesParameter", decimalValues);
decimalValues = Get<ObjectList<decimal>>("DecimalValuesParameter");
decimalValues.RemoveAt(1);
Set<ObjectList<decimal>>("DecimalValuesParameter", decimalValues);
 
ObjectList<string> stringValues = ObjectList.Create("string value 1", "string value 2");
Set<ObjectList<string>>("StringValuesParameter", stringValues);
stringValues = Get<ObjectList<string>>("StringValuesParameter");
stringValues.Remove("string value 1");
Set<ObjectList<string>>("StringValuesParameter", stringValues);
Параметр типа "Коллекция записей"
var list = Get<ICompositeObjectList<ICompositeObject>>("ReadDataUserTask1.ResultCompositeObjectList");
var sb = new StringBuilder();
foreach (ICompositeObject item in list) {
   if (item.TryGetValue<string>("Name", out string value)) {
       sb.Append(value).Append( " | ");
   }
}
Set<string>("FieldsOfCompositeObjectListParameter", sb.ToString());
Параметр типа "Коллекция записей", создающий новый перечень записей
var list = new CompositeObjectList<CompositeObject>();
var item1 = new CompositeObject();
item1["Id"] = Guid.NewGuid();
item1["Name"] = "Name1";
list.Add(item1);
var item2 = new CompositeObject();
item2["Id"] = Guid.NewGuid();
item2["Name"] = "Name2";
list.Add(item2);
Set<CompositeObjectList<CompositeObject>>("CompositeObjectListParameter", list);