Вопрос

Изменение записи после добавления

Добрый день!

Возник вопрос при правке данных сразу после создания записи. Система пишет ошибку и не отрабатывает как ожидалось. БП создает запись и далее сразу же ее пытаюсь изменить в разделе "После добавления записи".

Entity.SetColumnValue("Name","txt1");
Entity.Save();
return true;

Можете подсказать, что не так? GetColumnValue отрабатывает, а вот с изменением и дальнейшим сохранением операция не проходит.

У меня такой же вопрос

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

Сразу же у меня возникли вопросы, какая именно ошибка у вас возникает?

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

Григорий Чех,

Изначально требуется вызывать WS, записи на выходе парсить и создавать/обновлять записи в отдельном справочнике.
На выходе из WS получаем:
{"results":[{"id":"1", "login":"qwe1", "name":"qwe1"},{"id":"2", "login":"qwe2", "name":"qwe2"},{"id":"3", "login":"qwe3", "name":"qwe3"}]}

Если не ошибаюсь, блок по работе с WS в БП не умеет корректно обрабатывать такие ответы.
Во всяком случае видел в Сообществе такого рода комментарии.
Так что сейчас пробую весь ответ внести в промежуточную служебную форму, удалить лишнее, оставив только JSON, и описать парсинг JSON с логикой по созданию/обновлению записей.

На всякий случай сразу уточню. Можно ли без c# только блоками БП настроить парсинг этого дела?
Вариант с зацикливанием проверю дополнительно.

Спасибо!

Александр Кулиш пишет:
На всякий случай сразу уточню. Можно ли без c# только блоками БП настроить парсинг этого дела?

Для работы с данными служит элемент БП «Формула», но там функций работы с текстом минимум, по сути, только слияние строк.

Проще будет записать результат вызова сервиса в строковой параметр, а потом блоком-скриптом его разобрать, записав в другие параметры или сразу создав кодом записи в таблице базы.

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

Александр Кулиш,

Обсуждалось тут так же обратите внимание на парсинг Json в c# через Newtonsoft.Json

Григорий Чех,

В первой Вашей ссылке рассмотрен пример.
Попробовал его воспроизвести.
Делаю все по нему и в результате система выдает:

System.NullReferenceException: Object reference not set to an instance of an object.
   at Terrasoft.Common.ReflectionUtilities.GetPropertyValueByPath(Object source, String propertyPath)
   at Terrasoft.Core.Process.ProcessModel.Get[T](String propertyPath)
   at Terrasoft.Core.Process.UsrJira2NvgIntegration3MethodsWrapper.ScriptTask1Execute(ProcessExecutingContext context)
   at Terrasoft.Core.Process.ProcessScriptTask.InternalExecute(ProcessExecutingContext context)
   at Terrasoft.Core.Process.ProcessFlowElement.Execute(ProcessExecutingContext context)

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

var collection = Get<ICompositeObjectList<ICompositeObject>>("WebService1.UsrResult_Out");
var result = new List<string>();
foreach (var row in collection){
    row.TryGetValue("UsrResultsId_Out", out string id);
    row.TryGetValue("UsrResultsLogin_Out", out string login);
    row.TryGetValue("UsrResultsName_Out", out string name);
    result.Add($"{name}:{login}:{id}");
}

Set("Name1", string.Join(" | ", result.ToArray()));
return true;

 

Можете подсказать, в каком направлении при этом стоит копать?

Григорий Чех,

Код успешно компилируется.
В режиме отладки вижу, что первая строка кода:
var collection = Get<ICompositeObjectList<ICompositeObject>>("WebService1.UsrTestResult_Out");
не получает никаких данных.
В чем может быть проблема?

Параметры на выходе блока WS такие

Код сейчас такой использую:

var collection = Get<ICompositeObjectList<ICompositeObject>>("WebService1.UsrTestResult_Out");
var result = new List<string>();
foreach (var row in collection){
    row.TryGetValue("UsrTestResultName_Out", out string name);
    row.TryGetValue("UsrTestResultComment_Out", out string comment);
    result.Add($"{name}:{comment}");
}

Set("Name1", string.Join(" | ", result.ToArray()));
Set("Name2", "qwe");

return true;

Войдите или зарегистрируйтесь, чтобы комментировать