Доброго времени суток, коллеги! Возникла потребность в очистке БД, объем перевалил за 700гб. Подскажите пожалуйста, из каких таблиц можно удалить записи, чтобы не затронуть общий функционал среды. До этого пробовали удалит из таблицы, где хранятся логи (SysLog, 120 гб), но доступного пространства не увеличилось на 120 гб, а всего лишь на 30 гб. Можно ли использовать shrink? Как правильно сделать оптимизацию БД? 

Нравится

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

Добрый день, Адлет.

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

Ещё рекомендую посмотреть эту статью на Академии.

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

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

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

Вопрос: возможно ли реализовать обновление страницы после завершения активности? Используя для этого только клиентскую часть?

Пробовала прикрутить методы this.reloadEntity(), но проблема в том, что не удается "поймать" момент завершения активности. Подскажите, пожалуйста, возможно ли в странице редактирования получить значение состояния активности?

Способ с ActivityEventListener не подходит. 

 

Нравится

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

Добрый день,

 

Я тут вижу два варианта:

 

1) На событии после сохранения активности в DCM

(доступно из расширеных настроек активности

) сделать логику отправки серверного сокет сообщения на клиент, а на клиенте на карточке оформить подписку (и уничтиожение) на определенное сообщение. По получению сообщения обновлять страницу редактирования.

 

2) При отработке метода save из ActivityMiniPage реализовать отправку sandbox сообщения в модуль нужной страницы редактирования и обновлять страницу по получению этого сообщения.

Oscar Dylan,

спасибо за ответ. Выбрала второй способ через сообщения. Реализовала отправку сообщения , но при попытке завершить активность нажатием на кнопку "сохранить" выпадает ошибка: message name_message is not define in MiniPageModule (ViewModule_MiniPageListener_MiniPage_ActivityMiniPage) module.

Не понимаю где ещё  нужно объявить это сообщение, кроме как в activityMiniPage и нужной страницы редактирования ?

Если можно на смену стадии кейса, то можно посылать сообщение из бизнес-процесса, который стартует по изменению стадии заказа

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

Подскажите пожалуйста как решить следующую проблему: 

- Creatio 7.16.3

- Установлен плагин для MS Word

- Успешно подключаюсь к Creatio и создаю шаблон docx.

При попытке из плагина загрузить отчёт в Creatio получаю ошибку "Server Connection Failed", попробовал подключиться напрямую и используя корпоративный VPN.

Перехожу в Creatio в "Настройку отчётов" и пытаюсь загрузить мой docx шаблон в отчёт MS WORD, но получаю ошибку "На данный момент сервис не доступен."

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

Нравится

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

Здравствуйте Дмитрий,



Рекомендуем выполнить полную копиляцию системы.





Если после этого проблема не решится, рекомендуем проверить состояние консоли на предмет ошибок, во время попытки из плагина загрузить отчёт в Creatio.



Также, вы можете обратиться в нашу команду поддержки support@creatio.com для помощи с решением данной проблемы.



Надеюсь смог помочь.



С уважением, Павел!

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

Добрый день!

В обычном реестре работают горячие клавиши для выделения диапазона ячеек. То есть кликом мышки и нажатием shift можно выделить сразу много записей. Однако такое не работает в детали с редактируемым реестром.

Можно ли где-то включить это? Или как-то допилить редактируемый реестр, чтобы работал этот функционал?

В обсуждениях на форуме не нашла ничего подобного.

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

Нравится

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

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

 

Если говорить о редактируемом реестре в Classic UI (версии системы 7.x), то по умолчанию он не умеет работать с горячими клавишами и доработок базового функционала в данном направлении не планируется.

 

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



С уважением, 

Анастасия

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

 

Если говорить о редактируемом реестре в Classic UI (версии системы 7.x), то по умолчанию он не умеет работать с горячими клавишами и доработок базового функционала в данном направлении не планируется.

 

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



С уважением, 

Анастасия

Понятно. Спасибо за ответ.

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

Всем привет. 

Пытаюсь выполнить простой запрос на добавление контакта через Odata 4.

Если в header проставить флаг ForceUseSession = true, то запрос возвращается с 500 ошибкой

 

{"error":{"code":"","message":"An error has occurred.","innererror":{"message":"Object reference not set to an instance of an object.","type":"System.NullReferenceException","stacktrace":"   at Terrasoft.Web.OData.Filters.ODataAuthorizationFilterHelper.GetCanPortalUsersUseOdata(UserConnection userConnection)\r\n   at Terrasoft.Web.OData.Filters.ODataAuthorizationFilterHelper.GetCanUserUseODataService(UserConnection userConnection)\r\n   at Terrasoft.Web.OData.Filters.ODataAuthorizationFilterHelper.GetIsRequestAuthorized(Func`1 getUserConnection, Type controllerType, IDictionary`2 routeValues, Boolean isGetMethod)\r\n   at Terrasoft.WebApp.Filters.ODataAuthorizeFilter.OnAuthorization(HttpActionContext actionContext)\r\n   at System.Web.Http.Filters.AuthorizationFilterAttribute.OnAuthorizationAsync(HttpActionContext actionContext, CancellationToken cancellationToken)\r\n--- End of stack trace from previous location where exception was thrown ---\r\n   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()\r\n   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n   at System.Web.Http.Filters.AuthorizationFilterAttribute.<ExecuteAuthorizationFilterAsyncCore>d__3.MoveNext()\r\n--- End of stack trace from previous location where exception was thrown ---\r\n   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()\r\n   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n   at System.Web.Http.Dispatcher.HttpControllerDispatcher.<SendAsync>d__15.MoveNext()"}}}

Если флаг убрать, то все сохраняется.



Пробовал на разных версиях (7.16.0, 7.16.4, 7.18.5, 8.0.10), на некоторых работает и с флагом, на других нет. Например в 7.16.0 работает, а 7.16.4 нет. Подозреваю, что существует какая-то настройка или что-то в этом роде.

Все запросы от Supervisor делаю.

Может кто-то поможет мне, как избавиться от ошибки? 

Нравится

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

Добрый день!

Данная проблема наблюдалась в старых версиях особенно при использовании Odata4 с хедером ForceUseSession: true вместе с Feature-EnableOAuth20Integration = true. Эта ошибка была исправлена в релизных версиях. Именно по этой причине мы рекомендуем использовать последнюю версию продукта.

Kyrylo Atamanenko,

Попробовал Feature-EnableOAuth20Integration поставить и true и false, ничего не поменялось(

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

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

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

 

Нравится

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

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

В данной статье описано отключение/замещение обработчика событий:

https://community.creatio.com/questions/disable-core-javascript-method-contractpagev2?_gl=1*1d49jeg*_gcl_au*MTYxNTAzNjkzMi4xNjkyOTU4NzI3

Отключение родительского обработчика в конце обсуждения по ссылке ниже:

https://community.terrasoft.ua/questions/raznica-vo-vremeni-v-aktivnost…

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

Добрый день, как можно c помощью entitySchemaQuery изменить значение колонки в детали на странице.

Есть страница, и на ней две детали в разных вкладках. Одна деталь - "позиции заказа", другая "Документы по заказу". В деталь "документы по заказу" добавила кнопку, при нажатии на которую, происходит update значения выбранной колонки(сделала через updateQuery по инструкции из документации). В этом же методе с помощью entitySchemaQuery создаю коллекцию с корневой схемой "позиции заказа". При обработке этой коллекции я пытаюсь поменять значение колонки с помощью инструкции this.set("NameColumn",value);

Однако это не работает, и значение колонки не меняется. 

Подскажите, пожалуйста, что я делаю не так и можно ли изменить значение колонки в детали через front-end?

Нравится

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

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

 

Метод this.set("NameColumn",value) лучше заменить на обновление поля с помощью колл-бэк функции. Ниже представлен метод:

methodName: function() {
	var updateQuery = Ext.create("Terrasoft.UpdateQuery", {
	rootSchemaName: "YourSchemaName"});
	var filters = updateQuery.filters;
	filters.addItem(this.Terrasoft.createColumnFilterWithParameter(
	  this.Terrasoft.ComparisonType.EQUAL, "YourDetailColumnName", "YourColumnNameFromPageDesigner",));
	updateQuery.setParameterValue("YourColumnNameToUpdate",
"ValueToWriteInUpdate", this.Terrasoft.DataValueType.TEXT);
	updateQuery.execute(function(result){ 
	if(result.success) this.updateDetail({detail: "YourDetailCodeName"});}, this);  
}

Более подробное описание вы можете найти тут: https://community.terrasoft.ua/questions/ustanovka-znacheniy-kolonok-cherez-esq-na-klientskoy-chasti#comment-88853

 

С уважением,

Ангелина!

Добрый день,

Пожалуйста, предоставьте пример entitySchemaQuery, который вы настраиваете.

Viktoriia Hrynchuk,

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

setStatusDetail:function()
{
    /* Получает массив идентификаторов выбранных записей. */
                var selectedRows = this.get("SelectedRows");
                /* Обработка запускается в случае, если выбрана хотя бы одна запись. */
                if (selectedRows.length &gt; 0) {
                    /* Создает экземпляр класса пакетных запросов. */
                    var batchQuery = this.Ext.create("Terrasoft.BatchQuery");
                    /* Обновляет каждую из выбранных записей. */
                    selectedRows.forEach(function(selectedRowId) {
                        /* Создает экземпляр класса UpdateQuery с корневой схемой Activity. */
                        var update = this.Ext.create("Terrasoft.UpdateQuery", {
                            rootSchemaName: "DocumentComponent" // DocumentComponent - схема отвечающая за документы по заказу 
                        });
            //Далее я пытаюсь создать ещё одну коллекцию, на основе другой схемы и получить по связям колонку, которую также необходимо обновить, но уже в другой детали.
            var esq = this.Ext.create("Terrasoft.EntitySchemaQuery",{
                rootSchemaName: "OrderPosition"
            });
            esq.addColumn("StatusComponentOrder","StatusComponent");
            esq.addColumn("RowDocumentComponent.DocumentId","DocMoving"); 
            esq.esqFirstFilter = esq.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL,
            "RowDocumentComponent.DocumentId", selectedRowId);
            esq.filters.add("esqFirstFilter",esqFirstFilter);
                esq.getEntityCollection(function(result)
            {
                if(result.success)
                {
                    result.collection.each(function(item)
                    {
                        this.set("StatusComponentOrder",ConstantJS.StatusComponent);
                    }
                    
                )}
            },this);
 
                        /* Применяет фильтр для определения записи для обновления. */
                        update.enablePrimaryColumnFilter(selectedRowId);
                        /* Для колонки [Status] устанавливается значение из файла с константами */
                        update.setParameterValue("Status", "ConstantJS.DocShipped", this.Terrasoft.DataValueType.GUID);
                        /* Добавляет запрос на обновление записи в пакетный запрос. */
                        batchQuery.add(update);
                    }, this);
                    /* Выполняет пакетный запрос к серверу. */
                    batchQuery.execute(function() {
                        /* Обновляет реестр. */
                        this.reloadGridData();
                    }, this);
                }

}

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

 

Метод this.set("NameColumn",value) лучше заменить на обновление поля с помощью колл-бэк функции. Ниже представлен метод:

methodName: function() {
	var updateQuery = Ext.create("Terrasoft.UpdateQuery", {
	rootSchemaName: "YourSchemaName"});
	var filters = updateQuery.filters;
	filters.addItem(this.Terrasoft.createColumnFilterWithParameter(
	  this.Terrasoft.ComparisonType.EQUAL, "YourDetailColumnName", "YourColumnNameFromPageDesigner",));
	updateQuery.setParameterValue("YourColumnNameToUpdate",
"ValueToWriteInUpdate", this.Terrasoft.DataValueType.TEXT);
	updateQuery.execute(function(result){ 
	if(result.success) this.updateDetail({detail: "YourDetailCodeName"});}, this);  
}

Более подробное описание вы можете найти тут: https://community.terrasoft.ua/questions/ustanovka-znacheniy-kolonok-cherez-esq-na-klientskoy-chasti#comment-88853

 

С уважением,

Ангелина!

Anhelina,

спасибо за помощь! Помогло)

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

Добрый день, есть такая задача:

На странице есть две вкладки "Позиции заказа" и "Документы по заказу". На этих вкладках есть детали, названия деталей соответствуют вкладкам. Детали основаны на разных объектах.

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

Вопрос: Как обновить значение колонки (какой-либо) в первой детали "позиции заказа"? 

Пыталась сделать это так:

Колонка в детали "Документы по заказу" обновляется через UpdateQuery, нашла инструкцию в документации.

С обновлением колонок детали в первой вкладке наткнулась на трудность. 

Я пыталась сделать коллекцию через esq по позициям заказа. Устанавливаю значение через инструкцию this.set("NameColumn",value);

Однако это не работает. Подскажите, пожалуйста, как правильно в такой ситуации заполнить значение колонки? И возможно ли так вообще сделать?

Нравится

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

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

 

Ниже можно посмотреть пример кода для обновления двух колонок, которые смотрят на разные объекты, при нажатии на кнопку.

var value = this.get('UsrChange') – новое значение, которое вы хотите записать в необходимую колонку;

updateQuery.setParameterValue("Name", value, this.Terrasoft.DataValueType.TEXT) – в значение "Name" ("Notes" во втором запросе) подставьте название поля из объекта, в которое хотите записать изменения;

Удостоверьтесь, что вы добавили в дизайнере нужные поля на страницу. "detailColumn" - “Where detail column”, "masterColumn" - “Equals to page column”, "entitySchemaName"  - “Detail”.

 

...
details: /**SCHEMA_DETAILS*/{"UsrTabSecond": {
        "schemaName": "OpportunityHistoryActivityDetail",
        "entitySchemaName": "Activity",
        "filter": {
        "detailColumn": "Priority",
        "masterColumn": "UsrLookup2"
        }
    },
    "UsrTabFirst": {
        "schemaName": "AccountContactsDetailV2",
        "entitySchemaName": "Contact",
        "filter": {
        "detailColumn": "Job",
        "masterColumn": "UsrLookup1"
        }
    }
}/**SCHEMA_DETAILS*/,
    businessRules: /**SCHEMA_BUSINESS_RULES*/{}/**SCHEMA_BUSINESS_RULES*/,
        methods: {
             onMyButtonClick: function() {
                   var value = this.get('UsrChange');
                   var IdValue = this.get('UsrLookup1');
                   var updateQuery = Ext.create("Terrasoft.UpdateQuery", {
                       rootSchemaName: "Contact"});
                   var filters = updateQuery.filters;
                   filters.addItem(this.Terrasoft.createColumnFilterWithParameter(
                       this.Terrasoft.ComparisonType.EQUAL, "Job", IdValue));
                   updateQuery.setParameterValue("Name", value, this.Terrasoft.DataValueType.TEXT);
                   updateQuery.execute(function(result){
                       if(result.success) this.updateDetail({detail: "UsrTabFirst"});}, this);                                 
                                                          
                   var value1 = this.get('UsrChange');
                   var IdValue1 = this.get('UsrLookup2');
                   var updateQuery1 = Ext.create("Terrasoft.UpdateQuery", {
                       rootSchemaName: "Activity"});
                   var filters1 = updateQuery1.filters;
                   filters1.addItem(this.Terrasoft.createColumnFilterWithParameter(
                       this.Terrasoft.ComparisonType.EQUAL, "Priority", IdValue1));
                   updateQuery1.setParameterValue("Notes", value1, this.Terrasoft.DataValueType.TEXT);
                   updateQuery1.execute(function(result){
                       if(result.success) this.updateDetail({detail: "UsrTabSecond"});}, this);
        }
},
...

 

С уважением,

Ангелина

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

 

Ниже можно посмотреть пример кода для обновления двух колонок, которые смотрят на разные объекты, при нажатии на кнопку.

var value = this.get('UsrChange') – новое значение, которое вы хотите записать в необходимую колонку;

updateQuery.setParameterValue("Name", value, this.Terrasoft.DataValueType.TEXT) – в значение "Name" ("Notes" во втором запросе) подставьте название поля из объекта, в которое хотите записать изменения;

Удостоверьтесь, что вы добавили в дизайнере нужные поля на страницу. "detailColumn" - “Where detail column”, "masterColumn" - “Equals to page column”, "entitySchemaName"  - “Detail”.

 

...
details: /**SCHEMA_DETAILS*/{"UsrTabSecond": {
        "schemaName": "OpportunityHistoryActivityDetail",
        "entitySchemaName": "Activity",
        "filter": {
        "detailColumn": "Priority",
        "masterColumn": "UsrLookup2"
        }
    },
    "UsrTabFirst": {
        "schemaName": "AccountContactsDetailV2",
        "entitySchemaName": "Contact",
        "filter": {
        "detailColumn": "Job",
        "masterColumn": "UsrLookup1"
        }
    }
}/**SCHEMA_DETAILS*/,
    businessRules: /**SCHEMA_BUSINESS_RULES*/{}/**SCHEMA_BUSINESS_RULES*/,
        methods: {
             onMyButtonClick: function() {
                   var value = this.get('UsrChange');
                   var IdValue = this.get('UsrLookup1');
                   var updateQuery = Ext.create("Terrasoft.UpdateQuery", {
                       rootSchemaName: "Contact"});
                   var filters = updateQuery.filters;
                   filters.addItem(this.Terrasoft.createColumnFilterWithParameter(
                       this.Terrasoft.ComparisonType.EQUAL, "Job", IdValue));
                   updateQuery.setParameterValue("Name", value, this.Terrasoft.DataValueType.TEXT);
                   updateQuery.execute(function(result){
                       if(result.success) this.updateDetail({detail: "UsrTabFirst"});}, this);                                 
                                                          
                   var value1 = this.get('UsrChange');
                   var IdValue1 = this.get('UsrLookup2');
                   var updateQuery1 = Ext.create("Terrasoft.UpdateQuery", {
                       rootSchemaName: "Activity"});
                   var filters1 = updateQuery1.filters;
                   filters1.addItem(this.Terrasoft.createColumnFilterWithParameter(
                       this.Terrasoft.ComparisonType.EQUAL, "Priority", IdValue1));
                   updateQuery1.setParameterValue("Notes", value1, this.Terrasoft.DataValueType.TEXT);
                   updateQuery1.execute(function(result){
                       if(result.success) this.updateDetail({detail: "UsrTabSecond"});}, this);
        }
},
...

 

С уважением,

Ангелина

Anhelina, 

большое спасибо за помощь!

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

Добрый день!

Появилась идея отправлять уведомление некоторой выборке пользователей. Выборка производится в бизнес процессе в задании - сценарии с помощью ESQ.

Возможно ли из c#-го кода отправить уведомление?

В документации есть пример отправки напоминания о дате актуализации продажи в лиде. Но это немного не то, что нужно. В моем случае не нужно замещать схему объекта. 

Может быть есть способ проще написать метод для отправки такого уведомления?

Нравится

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

Вопрос решился просто. Добавила этот код в исходный код для нужного мне контакта. 

var Activity = UserConnection.EntitySchemaManager.GetInstanceByName("Activity");
var EntityActivity = Activity.CreateEntity(UserConnection);
EntityActivity.SetDefColumnValues();
EntityActivity.SetColumnValue("OwnerId", contactID);
EntityActivity.SetColumnValue("Title", "Активность с уведомлением");
EntityActivity.SetColumnValue("RemindToOwner", true);
EntityActivity.SetColumnValue("RemindToOwnerDate", DateTime.UtcNow);
EntityActivity.Save(false);

Вопрос решился просто. Добавила этот код в исходный код для нужного мне контакта. 

var Activity = UserConnection.EntitySchemaManager.GetInstanceByName("Activity");
var EntityActivity = Activity.CreateEntity(UserConnection);
EntityActivity.SetDefColumnValues();
EntityActivity.SetColumnValue("OwnerId", contactID);
EntityActivity.SetColumnValue("Title", "Активность с уведомлением");
EntityActivity.SetColumnValue("RemindToOwner", true);
EntityActivity.SetColumnValue("RemindToOwnerDate", DateTime.UtcNow);
EntityActivity.Save(false);
Показать все комментарии

Добрый день!

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

Для примера написала такую строку:  var esq = Ext.create("Terrasoft.EntitySchemaQuery",{rootSchemaName: "Contact"});

Ошибки вылетают такие: expected ),expected }, expected ; , и т.д. в строке var esq.

 Помогите разобраться как правильно здесь использовать ESQ (если это возможно), и можно ли вообще получить доступ к данным из задания сценария.

Данные необходимы, чтобы написать бизнес процесс по уведомлению пользователей о всех просроченных счетах.

 

Нравится

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

В задании - сценарий необходимо использовать серверную версию esq и код c#, как коллеги выше же описали. см тут https://academy.terrasoft.ua/docs/8-0/developer/back_end_razrabotka/ope… или в других примерах на сообщесте

Я бы в таком случае, если есть возможность, включил режим фс и выгрузил файлы на диск. Открыл проект в VS и посмотрел ошибку

Я не уверена в правильности использования такой конструкции для элемента задание - сценарий. В руководствах находила два вида написания запросов. Один написан выше, другой выглядит так :

var esq = new EntitySchemaQuery(UserConnection.EntitySchemaManager, "Имя схемы");.

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

Не сразу увидел. var esq = Ext.create("Terrasoft.EntitySchemaQuery",{rootSchemaName: "Contact"}); - это код JS. 

В задании - сценарий необходимо использовать серверную версию esq и код c#, как коллеги выше же описали. см тут https://academy.terrasoft.ua/docs/8-0/developer/back_end_razrabotka/ope… или в других примерах на сообщесте

Безуглый Кирилл Александрович, Спасибо за помощь!

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