Hello Creatio Community,

I am facing an issue when working with the JS editor in Creatio. After adding JavaScript code and clicking "Save," I receive a popup notification that says "Record successfully added." However, when I close the tab and reopen it later, the JS code is missing, and I have to re-enter it.

Has anyone encountered this issue? Is there any solution or workaround to ensure that the code is saved properly and remains after reopening the tab?

Thank you for your help!

im using 8.2.2

Like 0

Like

1 comments

Hello!

No, we haven’t encountered similar issues while working with the site.
Please gather more details and forward them to Creatio Support.

Show all comments

Hi All,

I have a question:
How can I get the current user's name, organizational role, functional role, and their manager's name, and auto-populate these values into different fields?

Could you please describe step by steps?
i'm using 8.2.2

Thank you

Like 0

Like

1 comments

You can get current user's name and there roles using this code https://customerfx.com/article/showing-or-hiding-a-field-if-the-current-user-is-a-member-of-a-role-in-a-creatio-freedom-ui-page/
just remove first filter from this code.

After getting roles you can set different field like this `request.$context.fieldcode=role`

Show all comments

Hi, Community.

Can you tell me if I can flip the register on list page by 90 deg?

Like 0

Like

2 comments

Hello!

Could you please add more details regarding your business aim?

If you mean changing the list page view in the section, in Creatio, list pages typically display data in a tabular format.

The main goal is to implement a schedule for approximately 100 employees.
There was an idea to implement it using a registry element.
However, the usual calendar view does not quite fit (i.e., dates and working hours are represented horizontally, and employees are listed vertically).
Since the number of employees will be relatively static, but weeks/months will continuously be added, the standard registry view is not entirely suitable for implementation.
The need arose to add new records horizontally (with the ability to scroll left/right) — these will be the weeks/months, while employees will remain static vertically.

The idea is to add new records to the registry horizontally, not vertically.
If it's not entirely clear, I can explain in more detail.

Is such implementation possible?
Perhaps you already have a ready solution for the schedule or better alternatives for implementing it?

Show all comments

Hi,

 

We have a environment where Creatio is System of engagement and core processing is done by backend system. When we query in the Creatio (say using Search field) Creatio invokes SelectQuery -- so how can trap the row count it returns and call a business process if it is zero -- the business process will invoke a API which gets the data from backend application and updates creatio 

 

Just business process with ability to inovke API and load Creatio objects is ready and working fine just how to invoke from Search (from Freedom UI)

Thanks and Regards

Like 0

Like

2 comments
Best reply

The list component has a couple of attributes you can use for this. You'll add a handler for the "crt.HandleViewModelAttributeChangeRequest" request and listen for changes to these attributes. There are a few attributes you could use, one that is ListName_NoItems (boolean) (or "DataTable_NoFilteredItems" for when the list is filtered) or ListName_Items (array of items). If your list component is named "DataGrid_ysopiif", your attribute names would be "DataGrid_ysopiif_NoItems", etc.

Add something like the following to the handlers of the page with the list:

{
    request: "crt.HandleViewModelAttributeChangeRequest",
    handler: async (request, next) => {
        if (request.attributeName === "DataTable_NoItems" || request.attributeName === "DataTable_NoFilteredItems") {
            if (request.value) {
                // no records returned for list
            	Terrasoft.showInformation("No results returned!");
            }
        }
    	return next?.handle(request);
    }
}

Ryan

The list component has a couple of attributes you can use for this. You'll add a handler for the "crt.HandleViewModelAttributeChangeRequest" request and listen for changes to these attributes. There are a few attributes you could use, one that is ListName_NoItems (boolean) (or "DataTable_NoFilteredItems" for when the list is filtered) or ListName_Items (array of items). If your list component is named "DataGrid_ysopiif", your attribute names would be "DataGrid_ysopiif_NoItems", etc.

Add something like the following to the handlers of the page with the list:

{
    request: "crt.HandleViewModelAttributeChangeRequest",
    handler: async (request, next) => {
        if (request.attributeName === "DataTable_NoItems" || request.attributeName === "DataTable_NoFilteredItems") {
            if (request.value) {
                // no records returned for list
            	Terrasoft.showInformation("No results returned!");
            }
        }
    	return next?.handle(request);
    }
}

Ryan

Ryan thanks -- moved to Data_grid and used the following code and it works. 

Now to see how to fix a filter which can show only records which are modified in last 5 mins (out of box gives in hours only)


        handlers: /**SCHEMA_HANDLERS*/[
            {
                request: "crt.RefreshedDataGrid",
                handler: async (request, next) => {
                      const context = await request.$context;
                      const list = await context.DataGrid_cdjhzhp;
                      const listCount = list?.length ?? 0;
                      if ( listCount == 0 &&  await request.$context.SearchFilter_fvbn39g_SearchValue.__zone_symbol__value
!= null ){
                              const uxClaimID= await request.$context.SearchFilter_fvbn39g_SearchValue.__zone_symbol__value
;
                              console.log("Claim Id = " + uxClaimID);
                               const result = await request.$context.executeRequest({
                                          type: "crt.RunBusinessProcessRequest",
                                          processName: "HC_ClaimACID",
                                          processParameters: { ClaimID: uxClaimID },
                                          //resultParameterNames: ["HC_ClaimGUID"],
                                          $context: request.$context
                               });
                               //if (await result.success) { 
                                // }
                       }
                      return next?.handle(request);  
             } 
         }        

Show all comments

Hi Community,

I'm trying to identify the ObjectName (schema name) and the RecordId of a form page that is currently open in Creatio (Freedom UI), using the context data available (as shown in the attachment). Is there a recommended way to retrieve this information through code or the browser console?

What’s the best way to access this data from within the button click handler?

Reference Screenshot

Thanks in advance!

Ajay K

Like 1

Like

1 comments

This is possible, but only from the context of the page itself. I am not sure if it's possible from a sidebar to know anything about the current page loaded elsewhere, maybe with a request handler in a remote module where you can specify the scopes?

As for getting this info within the context of the page, to get the primary data source, you can use: 

const pds = await request.$context.getPrimaryModelName();

With the data source name, you can get the schema for the datasource which will give you the entity/object name, the Id column attribute, and also the primary display value attribute using the following (note, this gets the attribute names, not the values): 

const pds = await request.$context.getPrimaryModelName();
const schema = await request.$context.dataSchemas[pds];
 
const entityName = await schema.name;
const idColumn = await schema.primaryAttributeName;
const nameColumn = await schema.primaryDisplayAttributeName;

Now that you have the attribute names, you can get the values: 

const idValue = await request.$context[idColumn];
const nameValue = await request.$context[nameColumn];
// etc

This sort of thing works great if you have a custom base page type that could be used for many different pages/objects. 

Also, as a FYI, not sure how this is going to change after 8.2.3 since 8.2.3 has a beta feature (not enabled out of the box) that allows a page to have multiple connected data sources. That might break some of this.

Ryan

Show all comments

Hello community,

Is there any way to map the Parent object, while importing data in the detail?

(Example : We want to Import a (Product In Order) in an Order.

Thank you 

Sasor

 

 

Like 0

Like

4 comments

Hello!


Thank you for your question!

Allow me to clarify how the import process works. When importing data into Creatio, you are essentially transferring the information from your Excel file into the corresponding database table. Each detail in Creatio corresponds to a different object or database table. Therefore, during an import, data can be inserted into one table or object at a time.

Import to Contact/Accounts have custom core logic applied, but all other objects work with logic described above.

You can read more about Excel import on Creatio Academy: https://academy.creatio.com/docs/8.x/creatio-apps/creatio-basics/busine…

Have a nice day!

Hello community,

Any update regarding this topic?

Sasor

Hello, answer has been already provided , but we will duplicate it below for your convenience: 

"Thank you for your question!

Allow me to clarify how the import process works. When importing data into Creatio, you are essentially transferring the information from your Excel file into the corresponding database table. Each detail in Creatio corresponds to a different object or database table. Therefore, during an import, data can be inserted into one table or object at a time.

Import to Contact/Accounts have custom core logic applied, but all other objects work with logic described above.

You can read more about Excel import on Creatio Academy: https://academy.creatio.com/docs/8.x/creatio-apps/creatio-basics/busine…

Have a nice day!"

Dear support team members

Kateryna and Oleksandra

I believe you missunderstood our request

_____________________________________________

Here is the scenario

  1. We are in the Opportunity Section.
  2. We want to import a list of Competitors.
  3. While importing the excel file, containing the Competitors list, we need that the competitors list, is assigned to this specific Opportunity '495 / Fast Works / Sale of Goods'
  4. We want to obviously achieve this without manually adding the '495 / Fast Works / Sale of Goods' as a separate column for all the records of the excel. 

Is there any example in the Code-Base, or any other workaround where this is achieved?

Sasor
 

Show all comments

Hi Creatio Community!
I’m building a custom Freedom UI component and need some advice on how to pass data from the component back to the parent page.
I have a custom component with some internal logic and a variable whose value changes based on user interaction inside the component (e.g. clicks, selections).
Now I want to pass this variable's value back to the parent page where the component is used — for example, to trigger some business logic or store it in a page field.
Is there a way to work with the page context from within the custom component?
Or maybe there's a recommended pattern for passing data upward from a component to the parent page in Freedom UI?

Any examples or best practices would be greatly appreciated!

Thanks in advance

Like 2

Like

0 comments
Show all comments

Hey Team , i have a user task in the lead section and inorder to move from one stage to another ( custom stages) , i have put up a user based task. However when the user clicks on complete , the system throws the below error 

I have not written this view.On multiple compilations , i still seem to face this issue.
Please note that this issue is occuring in my local , and when the same code is pulled by others to their local , this seems to work.

Like 0

Like

1 comments

Hello!

Could you please provide some details about the transfer of stages, especially the part related to user tasks?

Show all comments

Hi Team, is it possible to have recursive sub-processes.  Reason: avoid defining a loop within a process.
In standard BP Designer a process does not show itself as an option for a sub-process.  Wondering if there is a flag or other setting to turn this on.

Like 0

Like

2 comments

Hello! Recursive sub-processes-where a process calls itself directly as a sub-process-are not supported natively in the Business Process Designer, and for good reasons:

Why it's not allowed by default:
Recursion can easily result in infinite process executions if not managed carefully (e.g., no base case or exit condition).

Recursive calls could overload the scheduler queue and background processes.

The BP Designer intentionally filters out the current process from the list of available subprocesses to avoid this scenario.

Alternative Solutions:
1. Create a secondary wrapper process (e.g., MyProcessWrapper) that calls the main process (MyRecursiveProcess).

Inside MyRecursiveProcess, under certain conditions, call the wrapper again.

This technically breaks the direct recursion and gives more control.

2. Instead of recursion, Creatio recommends modeling loops with Gateways (Exclusive or Inclusive) and Intermediate Timer or Signal Events to create a controlled looping behavior.

3. If your recursion is simple (e.g., batch iteration or hierarchical processing), consider using Script Tasks with logic in C# to handle recursion internally. This avoids BPM overhead.

Nick Ovchynnik,

Thank you Nick for the detailed response.

Show all comments

Hi Creatio Community!
I’m currently working on a custom Angular component (Freedom UI) and ran into an issue I hope someone has already dealt with. I created a custom table component that loads data from a web service — the structure is quite complex with nested records, so I chose to use a service instead of standard object bindings.

I'm receiving the current record ID like this:

@Input()
@CrtInput()
public recordId!: { value: string; displayValue: string };

This is how I set recordId into component

{
	"operation": "insert",
	"name": "CustomTable",
	"values": {
		"recordId": "$UsrContractConditionsGroupDS_UsrContract_c00dfo4",
		"type": "usr.Table"
	},
	"parentName": "ListOfTarrifGroupByPeriod_ExpansionPanel",
	"propertyName": "items",
	"index": 0
},

When I open the page for the first time, everything works fine — the recordId arrives as expected. 

But when I back to section and open this record again, the component throws an error because recordId is undefined, and my table is empty.

I’m calling the service directly in ngOnInit().

Could you please advise on the correct way to store the record ID in the component so that it doesn’t get lost when opening the page a second time?

 

Like 1

Like

2 comments
Best reply

Hello Artem,

 

You can store record ID in the custom attribute and populate its value when the page is opening in the request crt.HandleViewModelInitRequest.

 

viewModelConfigDiff: /**SCHEMA_VIEW_MODEL_CONFIG_DIFF*/[
	{
		"operation": "merge",
		"path": [
			"attributes"
		],
		"values": {
			"RecordId": {}
			...
		}
	}
	...
]
handlers: [
	{
		request: "crt.HandleViewModelInitRequest",
		handler: async (request, next) => {
			await next?.handle(request);
			request.$context.RecordId = request.$context.Id;
		}
	}
]

Then you can use this custom attribute in your component

 

{
	"operation": "insert",
	"name": "CustomTable",
	"values": {
		"recordId": "$RecordId",
		"type": "usr.Table"
	},
	"parentName": "ListOfTarrifGroupByPeriod_ExpansionPanel",
	"propertyName": "items",
	"index": 0
},

Hello Artem,

 

You can store record ID in the custom attribute and populate its value when the page is opening in the request crt.HandleViewModelInitRequest.

 

viewModelConfigDiff: /**SCHEMA_VIEW_MODEL_CONFIG_DIFF*/[
	{
		"operation": "merge",
		"path": [
			"attributes"
		],
		"values": {
			"RecordId": {}
			...
		}
	}
	...
]
handlers: [
	{
		request: "crt.HandleViewModelInitRequest",
		handler: async (request, next) => {
			await next?.handle(request);
			request.$context.RecordId = request.$context.Id;
		}
	}
]

Then you can use this custom attribute in your component

 

{
	"operation": "insert",
	"name": "CustomTable",
	"values": {
		"recordId": "$RecordId",
		"type": "usr.Table"
	},
	"parentName": "ListOfTarrifGroupByPeriod_ExpansionPanel",
	"propertyName": "items",
	"index": 0
},

Iryna Oriyenko,

Thank you very much!

Show all comments