Всем доброго времени суток!
Столкнулся с проблемой, при сохранении Entity на событийном слое не срабатывает асинхронные операции.

Сохранение происходит в классе обработчике который подписан на очередь Rabbit

Выдает следующую ошибку:

EntityEventAsyncExecutor SendMessage - OnSavedMyEntityAsyncOperations
System.InvalidOperationException: Не удалось получить контекст выполнения фоновой операции. Для сервисов без авторизации необходимо вызвать Terrasoft.Web.Common.SessionHelper.SpecifyWebOperationIdentity.
   в Terrasoft.Core.ServiceBus.BusUtils.CreateUserContext(String userName, String sessionId, Guid externalAccessId)
   в Terrasoft.WebApp.ActorSystem.UserContextProvider.GetUserContext()
   в Terrasoft.ActorSystem.ActorReference.Tell(AppContextMessage message)
   в Terrasoft.Core.ActorSystem.Entities.EntityEventAsyncExecutor.SendMessage(Object parameters, Type operationType)

Как бороться с такой проблемой, может кто знает?

Спасибо!

Нравится

1 комментарий

Здравствуйте!

 

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

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

Всем привет!

 

Только знакомлюсь с платформой. Получил задачу в рамках которой необходимо написать Excel-файл, переданный в мой веб-сервис. До этого использовал для таких вещей OLEDB. Написал код, скомпилировал и через Postman решил его проверить. Получил только ошибку:

 

The server encountered an error processing the request. The exception message is 'The 'Microsoft.Jet.OLEDB.4.0' provider is not registered on the local machine.'. See server logs for more details.

 

Возможность разработки в файловой системе отключена. Кто-нибудь подскажет, что делать? Если нет возможности использовать OLEDB, то, возможно, есть другие варианты?

Нравится

1 комментарий

Добрый день, Константин!

Судя по ошибке можно сделать вывод, что система не поддерживает использование OLEDB. Рекомендую использовать для ваших целей OpenXML.

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

Всем доброго времени суток!

Нужна консультация.

У нас возникла необходимость обрабатывать большие коллекции Entity(изменять значение поля и обновлять) при этом что бы был задействован событийный слой.

Решили данным способом:

var bc = new BlockingCollection<Entity>();
// Наполнение коллекции
.....
Parallel.ForEach(bc, new ParallelOptions {
   MaxDegreeOfParallelism = Environment.ProcessorCount
}, entity => entity.UpdateInDB(false));

Вопрос в следующем будем ли мы ловить локи при использовании UserConnection entity, не создавая нового?
Подобные случаи с локами были на версии 7.8.


 

Нравится

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

Мне нужен фильтр в C# коде
Что-то вроде:

var activity = new EntitySchemaQuery(UserConnection.EntitySchemaManager, "Activity"); //Активность
 
activity.Filters.Add(activity.CreateFilterWithParameters(FilterComparisonType.Equal, "Type",  "id типа")); // тип активности - email
activity.Filters.Add(activity.CreateFilterWithParameters(FilterComparisonType.Contain , "Recepient",  "my_email@gmail.com")); // кому-мне
 
activity.Filters.Add(activity.CreateFilterWithParameters(FilterComparisonType.Contain , "Sender",  "my_dad_email@gmail.com")); // от отца
activity.Filters.Add(activity.CreateFilterWithParameters(FilterComparisonType.Contain , "Sender",  "my_mum_email@gmail.com")); // от матери
activity.Filters.Add(activity.CreateFilterWithParameters(FilterComparisonType.Contain , "Sender",  "my_sister_email@gmail.com")); // от сестры
activity.Filters.Add(activity.CreateFilterWithParameters(FilterComparisonType.Contain , "Sender",  "my_brother_email@gmail.com")); // от брата

нужен такой фильтр:
тип активности-email && кому-мне && (от отца || от матери || от сестры || от брата)

Как добавить логические операторы чтобы получить такой фильтр?
Или может быть надо по другому?

Нравится

3 комментария

 Что то типо такого?

activity.Filters.Add(activity.CreateFilterWithParameters(FilterComparisonType.Contain , "Sender",  new string[] { "my_dad_email@gmail.com", "my_mum_email@gmail.com", "my_sister_email@gmail.com", "my_brother_email@gmail.com"}));

Колногоров Роман Андреевич,

выдает ошибку 

Условие типа "Contain" не может содержать более одного выражения в правой части
обойтись без Contain не получиться

Попробуйте через createColumnInFilterWithParameters

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

Как вызывать из JS я знаю, но тут понадобилось вызвать из C#

Нравится

1 комментарий
var property = "PropertyValue";				
ProcessSchema schema = SystemUserConnection.ProcessSchemaManager.GetInstanceByName("ProcessName");
				bool canUseFlowEngine = ProcessSchemaManager.GetCanUseFlowEngine(UserConnection, schema);
				if(canUseFlowEngine) {
					var flowEngine = new FlowEngine(UserConnection);
					var param = new Dictionary<string, string>();
					param["Property"] = property;
					flowEngine.RunProcess(schema, param);
				} else {
					Process process = schema.CreateProcess(UserConnection);
					process.SetPropertyValue("Property", property);
					process.Execute(UserConnection);
				}

В принципе проверку на canUseFlowEngine можно смело убрать, сейчас все процессы запускаются через FlowEngine.

Показать все комментарии
using Terrasoft.Common;
new LocalizableString(UserConnection.Workspace.ResourceStorage, "ИмяКласса",
					"LocalizableStrings.TestMessageBody.Value").ToString();

 

Нравится

Поделиться

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

Добрый день, всем. Очень долго выполняются запросы связанные с UpdateQuery, SelectQuery, InsertQuery. Кто-нибудь сталкивался с этим? Какие пути использовали, для нахождения проблемы?

Нравится

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

Для анализа запросов есть профайлер в mssql. Запускаете профайлере, делаете запрос из клиентской части. Смотрите какой sql для select получается в профайлере.

Еще может быть, что у вас тормозит обмен по websocket. Надо посмотреть в консоль разработчика в браузере, нет ли там ошибки с подключение к websocket.

И еще creatio требовательна к ресурсам, если вам кажется что все работает медленно, то стоит проанализировать производительность ваших серверов.

Для анализа запросов есть профайлер в mssql. Запускаете профайлере, делаете запрос из клиентской части. Смотрите какой sql для select получается в профайлере.

Еще может быть, что у вас тормозит обмен по websocket. Надо посмотреть в консоль разработчика в браузере, нет ли там ошибки с подключение к websocket.

И еще creatio требовательна к ресурсам, если вам кажется что все работает медленно, то стоит проанализировать производительность ваших серверов.

В profiler смотрел, запросы выполняются за доли миллисекунд.
Websocket работает отлично.
Запросы выполняются долго в момент переключения состояния Обращения, вот что заметил. Пока не отлаживал сам процесс перехода состояний, но может уже кто-то сталкивался с этим.

Саид Иманмагомедов,

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

Вероятно, что в системе есть бизнес процесс, который срабатывает по сигналу и работает не в фоновом режиме, выполнение которого и приводит к длительному выполнению запросов InsertQuery и UpdateQuery.

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

Как создать задачу на визирование в коде?

Нравится

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

EntitySchema invoiceVisaSchema = UserConnection.EntitySchemaManager.GetInstanceByName("InvoiceVisa");
Entity invoiceVisa = invoiceVisaSchema.CreateEntity(UserConnection);
invoiceVisa.SetDefColumnValues();
invoiceVisa.SetColumnValue("Objective", "Требуется утверждение");
invoiceVisa.SetColumnValue("VisaOwnerId", new Guid("7F3B869F-34F3-4F20-AB4D-7480A5FDF647"));
invoiceVisa.SetColumnValue("StatusId", new Guid("3462594D-77A7-4B0A-874A-6D8B54B293BC"));
invoiceVisa.SetColumnValue("InvoiceId", new Guid("3C2B6D9F-4C1E-4364-99F2-53956562B606"));
invoiceVisa.Save();

 

аналог элемент процесса

EntitySchema invoiceVisaSchema = UserConnection.EntitySchemaManager.GetInstanceByName("InvoiceVisa");
Entity invoiceVisa = invoiceVisaSchema.CreateEntity(UserConnection);
invoiceVisa.SetDefColumnValues();
invoiceVisa.SetColumnValue("Objective", "Требуется утверждение");
invoiceVisa.SetColumnValue("VisaOwnerId", new Guid("7F3B869F-34F3-4F20-AB4D-7480A5FDF647"));
invoiceVisa.SetColumnValue("StatusId", new Guid("3462594D-77A7-4B0A-874A-6D8B54B293BC"));
invoiceVisa.SetColumnValue("InvoiceId", new Guid("3C2B6D9F-4C1E-4364-99F2-53956562B606"));
invoiceVisa.Save();

 

аналог элемент процесса

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

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

 

Нравится

6 комментариев
var userConnection = Get<UserConnection>("UserConnection");
var esq = new EntitySchemaQuery(userConnection.EntitySchemaManager, <SchemaName>);
esq.AddAllSchemaColumns();
esq.Filters.Add(esq.CreateFilterWithParameters(FilterComparisonType.Equal, <FieldName>, fieldValue));
var enitites = esq.GetEntityCollection(userConnection);
ver entity = enitites.FirtsOrDefault();

Примерно так.

Дамиан, так делать неправильно, в момент GetEntityCollection всё равно будут получены все записи, соответствующие условиям.

Правильнее будет перед этим дописать:

esq.RowCount = 1;

Аналогично и с колонками, оставить только нужные.

Дмитрий, а почему такие крайности, от 20000 к 1? Что именно Вы получаете и что потом с этими данными делаете? Может, подобрать оптимальный размер порции для обработки за раз?

Как пропустить часть записей с начала и выбрать следующие несколько, см. в теме.

Александр, спасибо за уточнение. Нашёл еще один подход.

public Entity GetEntity(UserConnection userConnection)
{
    var entitySchema = userConnection.EntitySchemaManager.GetInstanceByName(name);
    var esq = new EntitySchemaQuery(entitySchema);
    esq.AddAllSchemaColumns();
    return esq.GetEntity(userConnection, primaryColumnValue);
}

 

Тут всё зависит, сколько реально записей отфильтруется по такому условию. Если всегда 0 или 1, то можно и первым, и вторым Вашим способом. А если есть риск получить 100500 результатов, то лучше перестраховаться, ограничив количество в запросе.

Зверев Александр,
у нас логи по 1с пишутся в системе, куда отправили , что отправили , также получаем данные из 1с, из-за этого логов за один проход чуть больше 100 получается каждые пол часа
а первую запись из выборки мне надо для нумерации этих логов

Соответственно он не сможет дальше писать ничего , если при записи лога взял пулом 20 тыс записей разом

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

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

Подскажите пожалуйста как можно настроить тестовые данные, для того что бы протестировать Delete с помощью библиотеки Terrasoft.TestFramework?

Может у вас есть пример кода?
Спасибо.

Нравится

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

Александр, для создания записей, как и везде в скриптах, можно воспользоваться функциональностью классов либо Entity, либо Insert, иногда используют их совместно, как в функциях, которые применялась для подготовки тестирования работоспособности Delete в ядре:

  public static void CreateSchemaDataInDB(UserConnection userConnection, EntitySchema entitySchema,
    params object[] values) {
   Entity entity = entitySchema.CreateEntity(userConnection);
   int columnIndex = 0;
   foreach (object value in values) {
    entity.SetColumnValue(entitySchema.Columns[columnIndex++], value);
   }
   var insert = entity.CreateInsert();
   insert.Execute();
  }
 
  public static void CreateSchemaDataInDB(UserConnection userConnection, EntitySchema entitySchema,
    TestData testData) {
   var inserts = new Collection<Insert>();
   foreach (var dataRow in testData) {
    Entity entity = entitySchema.CreateEntity(userConnection);
    foreach (TestDataColumnValue dataColumn in dataRow) {
     entity.SetColumnValue(dataColumn.GetColumnValueName(), dataColumn.Value);
    }
    inserts.Add(entity.CreateInsert());
   }
   using (DBExecutor dbExecutor = userConnection.EnsureDBConnection()) {
    foreach (Insert item in inserts) {
     item.Execute(dbExecutor);
    }
   }
  }

Но конкретная реализация зависит от того, что Вы хотите создавать и удалять в ходе своего теста.

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

А возможно не создавать реально данные в базе? а использовать какое-то темповое хранилище?? Или что бы проверить Delete мне необходимо создавать реальные данные в базе?? и Как в таком случае в тестах инициализировать UserConnection?

Спасибо.

В этой теме есть примеры как имитации данных в базе, так и с формированием реальных запросов, но без их запуска, со сравнением полученного SQL-кода. Там тестируют Select, можно так и с Delete.

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

 

Я видел эту тему, но код который используется в нем у меня не компилируется так как не видно некоторых типов

TestDBTypeConverter
TestData
TestData testData = UnitTestUtilities.GetTestDataWithStructure(entitySchemaManager, "Activity");

Не могу понять какую библиотеку нужно подключить для корректной работы??

у меня версия системы 7.12.2

 

В 7.12 уже должны работать примеры из этой статьи, там есть ссылка на исходники SDK.

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