Всем привет!
Изучаю сейчас бизнес процессы, и остановился на Скрипт-сценарии(СС).
Вроде как бы это и C# но какой то странный (перемеренные определяются как в js).
Полноценной документации я не нашел(
Возникли такие вопросы:
1. Есть перед СС у меня блок чтение данных, где я выбираю все записи нужного раздела по нужным мне критерием. Как передать их в СС?
2. Логика будет довольно обширная, и я думаю создать отдельный класс в Конфигурации. Как мне создать экземпляр данного класса?
3. Поддерживает ли СС вызов стандартного для c# GET/POST запроса к удаленному сервису? Если нет, то поддерживает ли класс созданный в конфигурации?
Нравится
Добрый день, скрипт-сценарий в бизнес-процессе, это полноценный C#. Вас наверно смутило объявление переменных через ключевое слово var, поясню, это фича языка называется "неявная типизация" https://msdn.microsoft.com/ru-ru/library/bb384061.aspx и появилась она лет 10 тому назад, в версии языка C# 3.0.
Документации по самому языку, и прекрасных книг, предостаточно.
По поводу самих бизнес-процессов на академии целый раздел.
По поводу вопросов:
1. Можно через имя элемента чтения + "." + "ResultEntityCollection" обратится к ним, если вы вбираете множество записей, или через "." + ResultEntity если выбираете одну. Но если вы уж будете писать свой класс, то наверное проще использовать для получения данных EntitySchemaQuery http://academy.terrasoft.ru/documents/docs/technic/SDK/7.6.0/UsingEntit… а не элемент "Чтение данных".
2. Создавайте свой класс, как схему «Исходный код», примеров в конфигурации достаточно. Вот мой пример.
namespace MyNamespace { using System; using System.IO; using System.Net; using System.Text; using System.Collections.Specialized; public class MyClass { public void SendText(string text) { using(WebClient client = new WebClient()) { var reqparm = new System.Collections.Specialized.NameValueCollection(); reqparm.Add("value", text); byte[] responsebytes = client.UploadValues("http://localhost:3231/api/values", "POST", reqparm); string responsebody = Encoding.UTF8.GetString(responsebytes); } } } }
В любом случае это полноценный C#. И в бизнес процессе, в СС его экземпляр создается самым обычным способом, по его полному имени, или по укороченному если его namespace описан в using's. Вот так я создаю экземпляр своего класса-примера, и вызываю его метод:
var myClass = new MyNamespace.MyClass(); myClass.SendText("Hello World!");
3. Поддерживает, но блок using там вынесен в отдельную структуру, так что удобнее будет писать эту логику в своей схеме (своем классе), по примеру той, что я описал выше. Там я как раз отправляю строку на внешний сайт. Нужно только понимать, что код может быть различным, в зависимости от того как написан внешний сервис. Но, это опять же таки, в любом случае, самый обычный C#, и если вы, к примеру, умеете отправлять данные на свой API из обычного консольного приложения на C#, то сможете и из схемы исходного кода.
А еще вопрос.
Допустим мой класс отработал, и мне надо вывести в сообщении юзеру его результат(то что вернет определенный метод).
Какое действие в Дизайнере БП за это отвечает? Или может можно это сделать напрямую с СС?
Вот тут было видео, но его уже нет(
http://www.community.terrasoft.ru/blogs/10619
Из того что видно по приведенному коду, первая ошибка в том что вы создаете экземпляр как
new WebCity.SendListingForIpoteka, хотя в исходном коде немспейс называется не WebCity а Ecco.
Следовательно и создавать нужно так:
var test = new Ecco.SendListingForIpoteka();
Остальные ошибки могли посыпаться просто из за того что эта строка неверна, либо у вас еще где-то по коду бизнес-процесса ошибки. Попробуйте вначале поправить вышесказанное, если не поможет, создайте "с нуля" БП, и правильно создавайте экземпляр своего класса. А именно имя немспейса + имя класса.
По поводу вопроса касательно сообщения пользователю. Из СС это можно сделать следующим образом: http://www.community.terrasoft.ru/forum/topic/11784#comment-56699 либо по логике БП специальным элементом "Вопрос пользователю".
Я это и заметил и пост удалил)
Все работает спасибо!
Вот сморите, класс отработал. И сформулировал Стрингу. Мне ее надо записать в поле Договора(на нем по сигналу срабатывает БП)
Если вы получили интересующее вас значение и оно в скрипте СС, вы можете записать его в параметр БП, и в следующем элементе, "изменение данных", или "создание данных" записать туда, куда вам нужно.
Для этого параметры и нужны, для общения между частями БП. Как записывать и читать в параметр вы уже интересовались выше.
Так же вы можете манипулировать данными прямо по коду C#, в своем СС, используя Update, Insert, Delete, множество примеров использования вы можете найти в вашей конфигурации, к примеру, на схеме Account из пакета Base, нажмите второй кнопкой, и выберите "Исходный код" -> "Открыть". Там, среди прочего, можно будет увидеть варианты использования вышеописанных классов.
... if (removeRelationship && relationshipId != Guid.Empty) { Delete deleteRelationshipQuery = new Delete(UserConnection); deleteRelationshipQuery.From("Relationship"); deleteRelationshipQuery.Where("Id").IsEqual(Column.Parameter(relationshipId)); deleteRelationshipQuery.Execute(executor); } else { if (relationshipId != Guid.Empty) { Update updateRelationshipQuery = new Update(UserConnection, "Relationship"); updateRelationshipQuery.Set(parentAccountColumnName, Column.Parameter(parentId)); updateRelationshipQuery.Where("Id").IsEqual(Column.Parameter(relationshipId)); updateRelationshipQuery.Execute(executor); } else { Insert insertRelationshipQuery = new Insert(UserConnection); insertRelationshipQuery.Into("Relationship"); insertRelationshipQuery.Set("Active", Column.Parameter(true)); insertRelationshipQuery.Set("AccountBId", Column.Parameter(accountId)); insertRelationshipQuery.Set("RelationTypeId", Column.Parameter(relationTypeId)); insertRelationshipQuery.Set("AccountAId", Column.Parameter(parentId)); insertRelationshipQuery.Set("ReverseRelationTypeId", Column.Parameter(reverseRelationTypeId)); insertRelationshipQuery.Execute(executor); } } ...
Спасибо!
Еще такой вопрос!
Вот я читаю данные с одной записи, и мне надо знать поле checkSumm. Блок чтения называется ReadObj. Хочу получить в сценарии результат с этого блока. Я так понял это будет: var tempvar = ReadObj.ResultEntity.get("checkSumm"). Верно?
И еще, параметр в который я буду записывать результат работы класса какое у него должно быть Поведение? Я так понимаю Результирующий, верно?
1. Этот момент уже обсуждался на форуме, достаточно поискать по ключевому слову "ResultEntity".
var myString = ReadObj.ResultEntity.GetTypedColumnValue("Name");
При условии что у сущности которую вы читаете есть колонка Name.
2. Можете оставить его по умолчанию Направление: "Входящий/исходящий", и не ставить галочку "Результирующий" и спокойно использовать его по мере работы процесса. Признак результирующий нужен если вы хотите указать, что процесс завершился с определенным результатом.
Подробнее в академии: Использование параметров процесса.