Всем привет. Столкнулся с такой проблемой:

Изображение удалено.

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

Запустил в SQL Profiler трасировку, выполнил действие, нашел.

Заметил, что Duration гораздо больше CPU + Reads, и нет никакого плана выполнения для такого запроса.

Сталкивался ли кто с подобной ситуацией? Какие меры предпринимали?

Я так понимаю, что рано или поздно данная ситуация возникает у всех, если развивать СРМ с куча интеграций и т.п., получения обращений в систему с 5 почт, подключением сотрудников в количестве от 30-48.

Ресурсов у сервера БД достаточно, 2 виртуалки, по 2 ТБ памяти, по 98 ГБ ОЗУ, процессор 2.4Ггц X 12 ядер.

Нравится

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

Саид, как видно со скриншота, это запрос на вставку в таблицу активностей записи с названием "Диагностировать и решить инцидент #...".

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

Или дело в какой-то глобальной блокировке на таблицу, наложенную одновременнно работающей другой логикой.

Не пробовали аналогичный запрос (естественно, с другим Id) запускать из Management Studio вручную, так тоже тормозит?

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

Да, это на добавление активности "Диагностировать  и решить инцидент ..." запись в трасировке, я забыл в описании указать. В следующий раз попробую через Management Studio выполнить запрос. Вот не знаю почему, но после добавления 2 индексов в SysCaseRight действия такие, как Отправка письма в обращении и т.д., переход между состояниями в кейсе страницы редактирования, стали работать быстрее заметно.

Саид, после добавления индексов ускорилась же не работа конкретного запроса вставки активности, а всё действие? Может, там перед этим (или после) ещё был длительный запрос чтения обращений с учётом прав, он и ускорился?

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

Да, он ускорился.

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

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

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

Не могу скачать сервис для обновления по этой ссылке из этой статьи.

Нравится

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

Попробуйте пока скачать по временной альтернативной ссылке, сообщим ответственной команде что существует проблема со скачиванием сервиса. https://creatiocom-my.sharepoint.com/:u:/g/personal/t_ponomarov_creatio_com/EVQFFMoVSZRJjfmRAY6guVgBCSrQb1hhWSkPj2KLH4n5uA?e=Uyep6o

Попробуйте пока скачать по временной альтернативной ссылке, сообщим ответственной команде что существует проблема со скачиванием сервиса. https://creatiocom-my.sharepoint.com/:u:/g/personal/t_ponomarov_creatio_com/EVQFFMoVSZRJjfmRAY6guVgBCSrQb1hhWSkPj2KLH4n5uA?e=Uyep6o

t.ponomarov, Спасибо!

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

Добрый день!

 

Хотим настроить в Маркетинговой Кампании автоматическую отправку письма-напоминания при отсутствии регистрации на мероприятие. Задача достаточно стандартная, но реализовать ее через элемент БП "Лендинг" не выходит.

Изображение удалено.

Если указываем результат "Не заполнена веб-форма" с задержкой перед выполнением, то по истечении указанного срока переход к следующему элементу не происходит. По другой ветке (при успешной регистрации) отрабатывает все штатно.

 

Возможно кто-то сталкивался. Что делаем не правильно?

 

Нравится

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

Максим, сравните настройки своей кампании со стандартной настроенной «Конференция "Дни CRM"». Там тоже лендинг и три ветви для возможных его результатов. Из отличий от Вашего скриншота, там указывается точное время и условие фильтрации, выбран объект «Контакт». Если у Вас настроить аналогично, то тоже не срабатывает?

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

Как реализовать синхронизацию товаров с маркетплейса Prom.ua в Creatio?

Ручной импорт из Excel - не решение, поскольку цены могут меняться несколько раз на день.

Какой либо загрузчик фида или импорт с Гугл таблиц не нашел.

Интеграция с Промом предлагает лишь импорт клиентов и заказов.

Кто сталкивался с такой задачей?

Спасибо.

Нравится

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

Дмитрий, для интеграции в том числе и с  Prom.ua есть дополнение ApiX-Drive connector, которое взаимодействует с сервисом ApiX Drive. Но там товаров действительно нет.

На сайте Prom.ua тоже не нашёл информации о документации разработчика, возможно, её предоставляют по запросу.

В зависимости от характера API, подход может быть противоположным: либо из БП в Creatio вызывать веб-сервис Prom, передавая и получая параметры. Либо на стороне Prom (или промежуточном сервере, взаимодействующем с обоими системами) подключаться к сайту Creatio по OData и добавлять или менять значения в нужном объекте. Наконец, извне можно запускать БП в Creatio, передавая в него нужные значения, а уже процесс будет изменять данные.

 

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

Добрый день!

 

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

Если вставить просто макрос со ссылкой на многострочное поле, то шаблон не находит
и \n в тексте и считает, что переноса строк нет, хотя они и есть.

Возможно есть вариант заменять переносы строк на \n в рамках бизнес-процесса?

Нравится

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

   Отправка письма

 var emailSendService = new EmailSendService(context.UserConnection);

    

    var activityId = Guid.NewGuid();

    var insertActivity = new Terrasoft.Configuration.Activity(context.UserConnection);

    insertActivity.Id = activityId;

    insertActivity.SetDefColumnValues();

    insertActivity.Title = "Тема письма";

    insertActivity.Recepient = email;

    insertActivity.Sender = senderEmail;

    insertActivity.PriorityId = new Guid("D625A9FC-7EE6-DF11-971B-001D60E938C6");

    insertActivity.IsHtmlBody = true;

    insertActivity.Body = "<div>Тело письма</div>";

    insertActivity.TypeId = new Guid("E2831DEC-CFC0-DF11-B00F-001D60E938C6");

    insertActivity.MessageTypeId = new Guid("7F6D3F94-F36B-1410-068C-20CF30B39373");

    insertActivity.Save();

    

    emailSendService.Send(activityId.ToString());

Нормально манипулировать текстом письма можно только используя C#. Делает ScriptTask в нем отправку письма на C# и собираете любое тело письма которое вам нужно.

Полозюков Евгений Петрович,

Спасибо! Подскажите, где можно подробнее прочитать про отправку письма по скрипту?

   Отправка письма

 var emailSendService = new EmailSendService(context.UserConnection);

    

    var activityId = Guid.NewGuid();

    var insertActivity = new Terrasoft.Configuration.Activity(context.UserConnection);

    insertActivity.Id = activityId;

    insertActivity.SetDefColumnValues();

    insertActivity.Title = "Тема письма";

    insertActivity.Recepient = email;

    insertActivity.Sender = senderEmail;

    insertActivity.PriorityId = new Guid("D625A9FC-7EE6-DF11-971B-001D60E938C6");

    insertActivity.IsHtmlBody = true;

    insertActivity.Body = "<div>Тело письма</div>";

    insertActivity.TypeId = new Guid("E2831DEC-CFC0-DF11-B00F-001D60E938C6");

    insertActivity.MessageTypeId = new Guid("7F6D3F94-F36B-1410-068C-20CF30B39373");

    insertActivity.Save();

    

    emailSendService.Send(activityId.ToString());

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

Каким образом можно реализовать условные операторы в модуле Планирование? Например, если Факт отрицательное значение, то % выполнения считать как 0.

Нравится

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

Евгений, сейчас такой возможности нет.

Уже зарегистрирована идея добавить логические операции в формулы в планировании.

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

Доброго времен суток!

 

Подскажите, 

Есть на marketplace (https://marketplace.terrasoft.ru/template/vydelenie-cvetom-zapisey-v-ra…)

приложение для выделения цветом записей в заказах и 

обращениях. Как, используя это приложение как template, добиться того же и в счетах?

Нравится

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

Привет. 



При запуске процесса из элемента "Задание сценарий" следующим образом: 



var manager    = UserConnection.ProcessSchemaManager;

var flowEngine = new FlowEngine(UserConnection);

var processSchema = manager.GetInstanceByName("test process");

Dictionary parameter = new Dictionary();

TestCompositeObjectList list = new TestCompositeObjectList();

list.Add(new A { ColName= "test1" });

list.Add(new A { ColName= "test2" });

parameter.Add("TestCollection", list);

parameter.Add("Name", "Test");

flowEngine.RunProcess(processSchema, parameter);

return true;

 

Сам класс TestCompositeObjectList был создан по этому примеру.

 

При запуске процесса ловим: 

System.InvalidCastException: Unable to cast object of type 'Terrasoft.Common.CompositeObjectList`1[Terrasoft.Common.CompositeObject]' to type 'System.Collections.Generic.List`1[System.String]'.



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

TestCollection - и есть коллекция записей с полем стринг.

Name - просто ещё один параметр.



Дайте пожалуйста пример как сделать это.

 

 

Нравится

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

Разобрался. 

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



Код вызова: 

 

var manager	= UserConnection.ProcessSchemaManager;
var flowEngine = new FlowEngine(UserConnection);
var processSchema = manager.GetInstanceByName("ProcessName");
 
Dictionary&lt;string, object&gt; parameter = new Dictionary&lt;string, object&gt;();
 
CompositeObjectList&lt;CompositeObject&gt; objList = new CompositeObjectList&lt;CompositeObject&gt;();
 
objList.Add(new CompositeObject (new Dictionary&lt;string, object&gt;() {{"SubParamName",  "SubParamValue1"}}));
objList.Add(new CompositeObject (new Dictionary&lt;string, object&gt;() {{"SubParamName",  "SubParamValue2"}}));
// ....
// Первый коллекция записей - второе примитивный 
parameter.Add("CollectionName", objList);
parameter.Add("PrimaryParam", "Test");
 
flowEngine.RunProcess(processSchema, parameter);

 

Получение в скрипте: 

 

CompositeObjectList&lt;CompositeObject&gt; collection = Get&lt;CompositeObjectList&lt;CompositeObject&gt;&gt;("CollectionName");

 

if (ProcessSchemaManager.GetCanUseFlowEngine(userConnection, processSchema)) {

                    var flowEngine = new FlowEngine(userConnection);

                    Dictionary<string, string> parameter = new Dictionary<string, string>();

                    parameter.Add("CaseRecordId", CaseRecordId.ToString());

                    flowEngine.RunProcess(processSchema, parameter);

                } else {

                    var moduleProcess = processSchema.CreateProcess(userConnection);

                    if (processSchema.Parameters.ExistsByName("CaseRecordId")) {

                        moduleProcess.SetPropertyValue("CaseRecordId", CaseRecordId);

                    }

                    moduleProcess.Execute(userConnection);

                }

Полозюков Евгений Петрович,

У вас в примере обычный параметр, а не лист. С обычными то все понятно. Меня интересует передача именно параметра типа коллекция записей.

Возможно ли это вообщ? Потому что тут последний коммент говорит что "неа".

Разобрался. 

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



Код вызова: 

 

var manager	= UserConnection.ProcessSchemaManager;
var flowEngine = new FlowEngine(UserConnection);
var processSchema = manager.GetInstanceByName("ProcessName");
 
Dictionary&lt;string, object&gt; parameter = new Dictionary&lt;string, object&gt;();
 
CompositeObjectList&lt;CompositeObject&gt; objList = new CompositeObjectList&lt;CompositeObject&gt;();
 
objList.Add(new CompositeObject (new Dictionary&lt;string, object&gt;() {{"SubParamName",  "SubParamValue1"}}));
objList.Add(new CompositeObject (new Dictionary&lt;string, object&gt;() {{"SubParamName",  "SubParamValue2"}}));
// ....
// Первый коллекция записей - второе примитивный 
parameter.Add("CollectionName", objList);
parameter.Add("PrimaryParam", "Test");
 
flowEngine.RunProcess(processSchema, parameter);

 

Получение в скрипте: 

 

CompositeObjectList&lt;CompositeObject&gt; collection = Get&lt;CompositeObjectList&lt;CompositeObject&gt;&gt;("CollectionName");

 

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

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

Нравится

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

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

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

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

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

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

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

В profiler смотрел, запросы выполняются за доли миллисекунд.

Websocket работает отлично.

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

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

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

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

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

Привет. 

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

Нравится

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

Страница входа это у вас что IntroPage или /Login/NuiLogin.aspx?

 

Полозюков Евгений Петрович,

Второе. 

Уточните, Вам нужно поменять саму ссылку на вход? Или нужно редактировать наполнение страницы?

support,

От создание новых полей со своей логикой до запуска доп. серверного кода и передачи доп. параметров в урле для того что бы дополнительно это все обработать.

Андреев Андрей Сергеевич,

 

Пользовательскими средствами нет возможности каким-либо образом конфигурировать страницу входа. Вся логика описана в js-модулях - \Terrasoft.WebApp\Resources\ui\Terrasoft\amd\sspLoginModule.js и \Terrasoft.WebApp\Resources\ui\Terrasoft\amd\loginModule.js

 

Соответственно, изменить логику на странице входа можно только посредством модификации этих файлов.

Олег Нефедьев,

я знаю что там фронт для этих страниц и я знаю что он указа в dll лоадере. Мне нужен совет как это все сделать правильно, что бы при обновлении системы все не слетело.

Если углубиться, то хочется в конфиге прописать нужную логин страницу со скопированым функционалом текущей + своей функциональности и там потом разрабы смогут её допиливать. Я знаю что могут быть проблемы при обновлении, но догадываюсь что логин страница меняется уж очень редко, так что придется осторожно ставить обнову и допиливать. 

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