Hi,

Our team is working on a project for Creatio 8.1.2 (for Linux and PostgreSQL). We collaborate using filesystem mode and save our changes in a Git repository. When uploading changes to the instance, we first perform the "Update packages from filesystem" operation, followed by "Compile." Our project currently consists of slightly over 30 packages. We have encountered several issues when transferring changes to other instances.

At a certain point, we started experiencing problems with uploading changes to the instances. This is particularly noticeable when creating new instances. After connecting the repository and performing "Update packages from filesystem" for the first time, numerous errors can be observed (by going to the /dev view, then selecting all packages and sorting by status in descending order). These errors include information about a broken constraint, a non-existent column in the database, etc. Following this lead, I hypothesized that during the "Update packages from filesystem" operation, many database connections are opened, exceeding the limit defined in the PostgreSQL configuration. I verified it, and the default max_connections option was set to 100. When I increased it to 300, the problem stopped occurring on newly created instances. However, it seems to me that it should not consume such a large number of connections, and I don't think continuously increasing this number is a good solution as our project grows. Is there any option in Creatio to fix it?

Some changes do not work immediately after being uploaded to a new instance. You need to go into the configuration of the specific element and perform the PUBLISH operation on the target instance. Sometimes (although rarely), the system informs us that a given business process requires re-publishing. More often, however, something doesn't work, and it's hard to know this normally. For example, a query to a web service returns 404, even though it was uploaded to the target instance, and the compilation was performed immediately after the upload. Performing a complete compilation does not solve this problem. I have to go into the class with the given web service and re-publish it. The problem is that whether something works after uploading the changes seems completely random. Sometimes restarting a container with creatio, redis and postgres help, but it's not a rule. We test the changes thoroughly on our own instances, but after uploading the changes to the client's production instance, they may not work. We would really have to perform full regression tests to detect all the problems, and this is cumbersome.

Do any of you have similar problems and know how to deal with them? Thanks in advance for your responses!

Like 4

Like

2 comments

Hi Eryk, 

Thank you for your thorough feedback, looking forward to an answer from Creatio because the phrase "The problem is that whether something works after uploading the changes seems completely random. Sometimes restarting a container with creatio, redis and postgres help, but it's not a rule. We test the changes thoroughly on our own instances, but after uploading the changes to the client's production instance, they may not work. We would really have to perform full regression tests to detect all the problems, and this is cumbersome." is exactly something we struggle with. 


More advanced documentation , training and tutorials from Creatio on how to handle this more effectively, ideally with some tools to avoid full manual regression tests, are more than welcome

Bookmarking this feed. 

Cheers, 

Damien

Dear Eryk,

Many connections are created to optimize the installation process. If this approach doesn't work for you, you can disable specific settings in the application's web.config file, reducing the number of connections.
 

Please disable the following features in the external \web.config:
 

UseAsyncSaveSchemaResourcesInstallation
UseBulkSaveSchemaResourcesInstallation
UseAsyncSchemaCaptionsInstallation
UseAsyncPackageInstallation
 

To do this, open the web.config file, locate the above settings, and set their values to false. The lines should look like this:

 

<add key="UseAsyncSaveSchemaResourcesInstallation" value="false" />
<add key="UseBulkSaveSchemaResourcesInstallation" value="false" />
<add key="UseAsyncSchemaCaptionsInstallation" value="false" />
<add key="UseAsyncPackageInstallation" value="false" />
 

After making these changes, please clear Redis, restart the application, perform a source code generation for all schemas, and compile all actions.
 

For any other issues, please create a support request with Creatio, which requires a more detailed investigation.

Best regards,
Andrii

Show all comments

Hi Team,

When creating a new custom UserTask, I notice that certain field types like 'Unlimited length text' and 'Localizable String' are available in existing UserTasks but are missing in my custom UserTask.I would greatly appreciate any assistance with this. Thank you in advance.

Regards,
Mahalaxmi.G

Like 0

Like

2 comments

Dear Mahalaxmi,
 

Thank you for reaching out regarding the missing parameter types in your custom UserTask.
 

The “Unlimited length text” and “Localizable String” parameter types, which you noticed in existing UserTasks, were removed starting from version 7.17.0. 

These parameter types are still present in UserTasks created in previous versions for backward compatibility, but they are no longer available when creating new UserTasks in the latest versions.
 

I understand how this might be unexpected, and I appreciate your understanding.
 

Best regards,
Andrii

Show all comments

Hi Team,

 

We have open and click rates out of the box in Creatio for email analytics. We can also track link peroformance (click #) for multiple links sent out in the email. Is there a way to see a list of contact records (name & email address) who clicked for each of these links sent out in the email? Thanks

Like 0

Like

1 comments

Yes, you'll create a contact filter using the "Click through links with email (by column Contact)" to view the contacts that clicked a specific link. See https://customerfx.com/article/creating-a-filter-of-contacts-that-clicked-a-specific-link-in-a-creatio-bulk-email/

Note, you can also bind that to a List on the contact page to get a list of links the contact has clicked.

Ryan

Show all comments
Question

Hi,


I would appreciate your help. I need to send an email that has to approve a request for an entire department. How is it correct to do it and extract all the emails of the contacts?

Like 0

Like

1 comments

Hi!

 

You can find an example of how to develop an Approval process, including sending email notifications in the following Creatio Academy: https://academy.creatio.com/docs/8.x/no-code-customization/bpm-tools/bpm-process-examples/configur-document-approval-process

 

Also, you can get more information about business processes in the following link tree:

https://academy.creatio.com/docs/user/bpm_tools/business_process_setup 

 

I hope this helps. Have a great day!

Show all comments

Hi Community,

Can you provide a snippet on how we can achieve the following?

For example in the 'Contacts' editable list

We want the field 'Full Job title' to be editable and the field 'Email' to be NOT editable (its values are populated via Business processes) so we dont want manual insertion from the user. How can this be achieved?

Sasor

Like 3

Like

3 comments

You could add a business rule at the object level to disable editing of the email, but then it would also be disabled at the page level (unless that is also what you want). Other than that, the only option is to turn off the editable list property (since, currently, you can't make certain fields editable and others not)

@sasori Great idea !

Try add a readonly flag to your column in crt.DataGrid for Contacts
After that try to restore default settings on the page for this detail if you added more columns to this grid. This functionality is kinda buggy.

Show all comments

Hello team,

I have question that there are 2 tabs and inside it there is available 3 fields. For example, we have MainTab and AdditionalTab and inside MainTab there is firstname, lastname, middlename. Inside AdditionalTab there is Phonenumber, email, birthdate. I need to put validation to this fields separately. If I put validation to firstname and Phonenumber, these two shouldn't affect each other. when Firstname and Phonenumber is not filled in and try to save record, if I am on Maintab, system should return Firstname validation. at the same time, when I change tab to AdditionalTab, system should return Phonenumber validation. in this case how can I put validation based on tabs?

Below I'll share written code for validation.
 
define("UsrExample1Page", ["ConfigurationConstants"], function(ConfigurationConstants) {
    return {
        entitySchemaName: "UsrExample",
        attributes: {
         "CurrentActiveTab": {
               dataValueType: Terrasoft.DataValueType.TEXT,
               type: Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
               value: "" // Initial value, empty by default
           }
       },
        details: /**SCHEMA_DETAILS*/{
            "Files": {
                "schemaName": "FileDetailV2",
                "entitySchemaName": "UsrExampleFile",
                "filter": {
                    "masterColumn": "Id",
                    "detailColumn": "UsrExample"
                }
            }
        },
        methods: {
           onActiveTabChange: function(activeTab) {
               // Store the active tab identifier
               this.set("CurrentActiveTab", activeTab);
           },
 
           setValidationConfig: function() {
               this.callParent(arguments);
               this.addColumnValidator("UsrName", this.nameFieldsValidator);
               //this.addColumnValidator("UsrLastName", this.nameFieldsValidator);
               this.addColumnValidator("UsrPhoneNumber", this.phoneFieldsValidator);
           },
           nameFieldsValidator: function(value, column) {
               var invalidMessage = "";
               var firstName = this.get("UsrName");
               console.log("Name:", firstName);
               if (Ext.isEmpty(firstName)) {
                   invalidMessage = this.get("Resources.Strings.InvalidNameMessage");
                   // Switch to the tab containing the first name field
                   console.log("Switching to name tab:", invalidMessage);
                   this.set("CurrentActiveTab", "Tabbfc229c0TabLabel"); // Assuming "NameTab" is the tab identifier
               }
               return { invalidMessage: invalidMessage };
           },
           phoneFieldsValidator: function(value, column) {
             var invalidMessage = "";
             var phoneNumber = this.get("UsrPhoneNumber");
             console.log("Phone number:", phoneNumber);
             if (Ext.isEmpty(phoneNumber)) {
                 invalidMessage = this.get("Resources.Strings.InvalidPhoneNumberMessage");
                 console.log("Switching to phone tab:", invalidMessage);
                 this.set("CurrentActiveTab", "Tab68b5b8f6TabLabel"); // Ensure this is correct
             }
             return { invalidMessage: invalidMessage };
         }
       },
        dataModels: /**SCHEMA_DATA_MODELS*/{}/**SCHEMA_DATA_MODELS*/,
        diff: /**SCHEMA_DIFF*/[
           {
               "operation": "insert",
               "name": "Tabs",
               "values": {
                   "tabs": [
                       {
                           "name": "MainTab",
                           "caption": { "bindTo": "Resources.Strings.MainTabCaption" },
                           "items": [],
                           "change": { "bindTo": "onActiveTabChange" }
                       },
                       {
                           "name": "AdditionalTab",
                           "caption": { "bindTo": "Resources.Strings.AdditionalTabCation" },
                           "items": [],
                           "change": { "bindTo": "onActiveTabChange" }
                       }
                   ]
               }
           }
        ]/**SCHEMA_DIFF*/
    };
});
Like 0

Like

1 comments

Hello Abbos,

To do so, you can replace the OnSaved method, where you make a check:

1) needed tab is active 

2) validation successful

If both are true - call this.callParent(arguments). Else - add needed conditions.

onSaved: function() {
	var activeTab = this.get("ActiveTab");
	var isActiveTabTab2 = activeTab == "Name of the tab"; //result true\false
	var isFirstColumnValid = this.validateFirstColumn(); //result true\false
	if (isActiveTabTab2 &amp;&amp; isFirstColumnValid) {
		this.callParent(arguments)
	} elese if () {
		...
	} else if () {
		...
	} else {
		...
	}
},
 
validateFirstColumn: function() {
	var colValue = this.get("ColumnCodeHere");
	return colValue == "Test value" || colValue = "1" //add conditions here
}

P.S. This method will not work with the required fields, since disabling the requirement is impossible.

Show all comments

Hello,

how can we make column non/editable for portal users?

 

We have editable detail and column Requested amount, that should be editable for external users and non-editable for system users.

And column Confirmed amount, that should be editable for system users and non-editable for external users.

 

We use business rules based on calculated attribute (from Terrasoft.isCurrentUserSsp) for pages - it works perfectly. But it doesn't work in editable details

 

Any ideas?

Thank you!

Like 0

Like

4 comments

Hello,

Desired permission set up can be achieved via column permissions in the object permission settings. Step-by-step guide on the column permission set up available on Creatio Academy.

Best regards
Ivan

Ivan Savenko,

Thank you, it can be used, but it doesn't give visual 'lock' for column, only an error after saving.
Besides, column permissions requires to define each column of the object (at least, for the portal), that is not the best approach

I agree, visual locks would help a lot :)

Damien Collot,

especially on portal, where hundreds of users without experience should be provided with clear and easy UI

 

Kind regards,

Vladimir

Show all comments

Hello!
I have created a business process that must run after changes are made to the "Not allowed" field in the Activity. When I change this field manually and then save the activity, it runs as it should. However, I also wrote a very simple C# code in the saving event that changes this field in the activity when I move the activity in the calendar, but the process does not start despite the changes in the "Not allowed" field.

I am moving the activity in the calendar

Code: _entity.SetColumnValue("CHNotAllowed", DateTime.UtcNow.ToString("yyyy-MM-dd HH:mm:ss")); 

Process:


 

Like 0

Like

2 comments

Hello,
If an Entity.Save() call occurs in the embedded process or listener, in this case, the signal to start the BP is not thrown.
Try using the EntitySchemaQuery, if I'm not mistaken, it should trigger the necessary Entity level.

Dmytro Vovchenko writes:

Hello,
If an Entity.Save() call occurs in the embedded process or listener, in this case, the signal to start the BP is not thrown.
Try using the EntitySchemaQuery, if I'm not mistaken, it should trigger the necessary Entity level.

It works everywhere except changes in the calendar

"Try using the EntitySchemaQuery" -what do you mean? plz give an example. 

Show all comments

Hi Community,
Can you provide a snippet example, on how we can hide a Detail (list) if the List contains no data (records)?

Thank you

Sasori

Like 4

Like

3 comments
Best reply

This can only be done with code. A combination of doing some model queries to check for records that would be in the list, then using an attribute bound to the visible property of the list to set as true/false based on the results of the query. 

Using the model to query data: https://customerfx.com/article/querying-data-using-filter-conditions-vi…

Using attributes: https://customerfx.com/article/using-custom-attributes-on-a-creatio-freedom-ui-page/

Using the init to execute the above code when the page loads: https://customerfx.com/article/waiting-for-model-to-be-ready-and-loaded…

Ryan

Hi Community,

Any remark on this one?

This can only be done with code. A combination of doing some model queries to check for records that would be in the list, then using an attribute bound to the visible property of the list to set as true/false based on the results of the query. 

Using the model to query data: https://customerfx.com/article/querying-data-using-filter-conditions-vi…

Using attributes: https://customerfx.com/article/using-custom-attributes-on-a-creatio-freedom-ui-page/

Using the init to execute the above code when the page loads: https://customerfx.com/article/waiting-for-model-to-be-ready-and-loaded…

Ryan

Hello,
 

Unfortunately, this task cannot be implemented using standard methods.

 Ryan has provided helpful recommendations that will assist you with implementation through development methods.
 

Additionally, we have registered a task for the development team to add such functionality in future releases.

Best regards,
Pavlo

Show all comments

Hi Community,

 

We have this requirement, where we need to have multiple signatures per outbound email. And selected them based on the case category lookup.

 

So for example:

 

Case 1 > Category A > Signature A

 

Case 2 > Category B > Signature B

 

But for the same outbound email.

 

https://academy.creatio.com/docs/8.x/no-code-customization/base-integrations/mailbox-setup/email-account-individual-settings#title-1953-3

 

We would like to know what is the best way to achieve such functionality? What schemas should we change?

 

Thank you.

 

Best Regards,

Pedro Pinheiro

Like 1

Like

1 comments

Hello,

 

Please note that there's no functionality to set up such logic in the system at the moment. However, we have registered this idea for our R&D team and they will review the possibility of adding it in future releases.

 

As a workaround, you could remove the personal signatures of the users and instead create the email templates and design the needed signature as part of the template itself. You can also set up automatic filling in of the sender's name with the help of a macro.

Show all comments