Время создания
Filters

How can a business process and a cookie-based web service be executed from an anonymous web service in Creatio?

Like 0

Like

1 comments

Hello,

A business process can be executed using IProcessExecutor (see Creatio Academy).

To invoke a cookie-based web service, you must send an HTTP request directly to the target endpoint. An anonymous web service does not have an authenticated HTTP session and therefore cannot implicitly reuse cookie-based authentication. Authentication cookies must be handled explicitly (see Creatio Academy).

Show all comments
lookups
Sales_Creatio_enterprise_edition
8.0

Hi.

I wish to deactivate certain records in our Department table, since it is loaded with invalid records that were imported from SalesForce.  See first image below -- I enabled "Allow record deletion", and ran the package.

The Department list looks the same (see second image) with no option to disable a record.  Do I need to add a column or something?   

Thanks
Rob

 

Like 0

Like

1 comments

Hello Rob!

The "Allow record deactivation" option adds a new field to the object, which allows you to deactivate the record.

To deactivate (not delete) records in your Department table, please follow these steps:

1. In the Object Designer, ensure that you have enabled the "Allow record deactivation" property for the Department object.
2. After enabling, publish the object. This automatically adds the "RecordInactive" column—no need to add anything manually.

Once published, you can set records as inactive: To deactivate records, you can add field "Inactive" to the displayed fields, so you can manage it from lookups:


You can also use a business process or apply a bulk data operation to set the RecordInactive field to true for those records.

Best regards,
Alina

Show all comments
File_API_(GetFileFactory
EntityFileLocator)_Not_Working_in_Process_ScriptTask_-_Compilation_Errors

Hello  Team,

We are facing an issue while trying to use the File API inside a Process ScriptTask and would like your clarification.

According to the Creatio Academy documentation (File API overview), it is possible to work with files using the following approach:

 

IFileFactory fileFactory = UserConnection.GetFileFactory(); var fileLocator = new EntityFileLocator("SysFile", recordId); IFile file = fileFactory.Get(fileLocator);

 

However, when implementing this logic inside a ScriptTask of a business process, the code does not compile, and we receive the following errors:

  • 'UserConnection' does not contain a definition for 'GetFileFactory'
  • The type or namespace name 'EntityFileLocator' does not exist in the namespace 'Terrasoft.File.Abstractions'

This suggests that:

  • GetFileFactory() is not available in Process ScriptTasks
  • EntityFileLocator is not accessible in the process execution context

Our goal is to:

  • Read the content of an existing file (e.g. from SysFile or a custom *File entity)

Could you please confirm:

  1. Whether the File API (IFileFactory, EntityFileLocator, IFile) is officially supported inside Process ScriptTasks
  2. If not supported, what is the recommended and supported way to read an existing file and reuse its content inside a process

Thank you in advance for your support and clarification.

Like 0

Like

2 comments

Have you tried adding the Terrasoft.File namespace to the process usings?

Hello,

Please check the documentation regarding File API.

According to it EntityFileLocator is located in the Terrasoft.File namespace. Same goes for UserConnection.GetFileFactory and IFileFactory.Get   (see FileFactoryUtils).

So, all you need to do is to add this namespace to your process (Methods -> Usings):
Process usings

Show all comments
Issue_Adding_WhatsApp_Channel_in_Creatio
WhatsApp_Integration
Sales_Creatio
8.0

Hi Creatio Support,

We are facing an issue while setting up the WhatsApp channel in Creatio.

For your information, I created a trial Creatio CRM instance to test the WhatsApp integration. I followed the steps mentioned in the link below:

Set up WhatsApp integration | Creatio Academy

The first step is marked as optional, so I skipped it. I created a Twilio account, but when I try to add the WhatsApp channel in Creatio, I receive an error. The steps mentioned in the document are:
 

  1. Set up a Twilio free trial account to get acquainted with the integration (optional). Read more >>>
  2. Set up a Twilio business account. Read more >>>
  3. Set up a WhatsApp chat channel in Creatio. Read more >>>

As mentioned in the same document, we verified the following system settings, and they are available in the system:

  • "Identity server Url" ("IdentityServerUrl" code)
  • "Identity server client id" ("IdentityServerClientId" code)
  • "Identity server client secret" ("IdentityServerClientSecret" code)

However, Creatio still shows an error when we try to add the WhatsApp channel in the Chat settings.

Please let us know what we might be missing. We would appreciate it if we could set up a quick call to review this issue.

Like 0

Like

1 comments

Hello,

If, as you mentioned, the system settings already contain the default values, please make sure that this account is connected to only one instance.

Additionally, we recommend generating a new webhook URL (navigate to
https://sitename.creatio.com/0/Shell/#Page/LandingiDesigner_Page → Other landing pages → Click to get your webhook URL) and then trying to reconnect the WhatsApp account.

If the issue persists after performing these steps, please contact us at support@creatio.com, and we will be able to carry out a more detailed analysis.

Show all comments

Passing Data Between Freedom UI Pages in Creatio (Real Project Case)

Introduction

This article is based on a real Freedom UI use case, not a hypothetical demo.

The requirement comes from an actual configuration scenario:

  • A Freedom UI form page (UsrSmartFilter_FormPage)
  • A custom Freedom UI component/page (UsrColumnViewerComponent)
  • The need to pass runtime values (object name + record Id)
  • And then persist user selections back into the database

No sandbox. No assumptions. Only what works in Freedom UI today.

Real Problem Statement

In a Freedom UI implementation, the user:

  1. Opens UsrSmartFilter_FormPage
  2. Selects an object (for example: Account, Contact, etc.)
  3. Clicks a button to configure columns
  4. A second Freedom UI page/component opens
  5. That page must:
    • Know which object was selected
    • Know which UsrSmartFilter record is being edited
    • Show all columns of the selected object
    • Save selected column names back to UsrSmartFilter.UsrColumnNames_Values

Classic UI sandbox messaging cannot be used.

Why Sandbox and Page Parameters Cannot Be Used

In Freedom UI:

  • Pages are isolated
  • There is no exposed sandbox API
  • Parameters passed via crt.OpenPageRequest are not injected into the target page context

This is a documented and observed platform behavior, not a theory.

The Working Mechanism: BroadcastChannel

The solution that works reliably is using the browser-native <strong>BroadcastChannel</strong> API.

This is not a Creatio abstraction. It is a standard Web API that works because:

  • Freedom UI pages run in the same browser context
  • Messaging happens at the browser level
  • No Creatio internals are bypassed

Real Sender: UsrSmartFilter_FormPage Handler

This handler exists on UsrSmartFilter_FormPage and is triggered by a button click.

What It Sends

  • Selected object schema name
  • Current page record Id (UsrSmartFilter.Id)

Real Handler Code

{
	request: "QNT.GetColumns",
	handler: async (request, next) => {
		const objectValue = request.$context.PDS_UsrSelectedObject_n4di2v4;
		const pageId = request.$context.Id;
 
		if (!objectValue || !pageId) {
			return next?.handle(request);
		}
 
		const channel = new BroadcastChannel("UsrSmartFilter_Channel");
 
		channel.postMessage({
			selectedObjectName: objectValue.displayValue,
			pageId: pageId
		});
 
		channel.close();
 
		return next?.handle(request);
	}
}

This code is taken directly from a working Freedom UI page.

Real Receiver: UsrColumnViewerComponent

UsrColumnViewerComponent is a custom Freedom UI component responsible for:

  • Receiving the object name and page Id
  • Loading the selected object schema dynamically
  • Allowing the user to select columns
  • Persisting the selection

Receiving the Data

this._channelIn = new BroadcastChannel("UsrSmartFilter_Channel");
 
this._channelIn.onmessage = async (event) => {
	const { selectedObjectName, pageId } = event.data || {};
 
	this._selectedObjectName = selectedObjectName;
	this._parentPageId = pageId;
 
	await this._loadObjectSchema();
	this._render();
};

This logic runs when the component is initialized.

Loading the Object Schema Dynamically

Instead of hardcoding Account, the schema is loaded dynamically using the received object name:

const model = await sdk.Model.create(this._selectedObjectName);
const schema = await model.getSchema();
 
this._columns = Object.values(schema.attributes).map(attr => ({
	name: attr.name,
	caption: attr.caption || attr.name
}));

This is standard Freedom UI Model API usage.

Persisting the Selected Columns (Real Persistence)

When the user selects or unselects columns, the component:

  1. Builds a comma-separated string
  2. Updates the existing UsrSmartFilter record
const model = await sdk.Model.create("UsrSmartFilter");
 
await model.update({
	Id: this._parentPageId,
	UsrColumnNames_Values: columnsCsv
});

This is not messaging — this is actual data persistence.

Why This Is a Real, Production-Safe Pattern

  • Uses only documented Web APIs
  • Uses Creatio Freedom UI Model API
  • No reliance on undocumented sandbox features
  • Works across page reloads once persisted

This pattern has been validated in real projects.

Key Constraints (Real, Not Theoretical)

  • BroadcastChannel does not queue messages
  • Receiver must be initialized first
  • Transient data should always be persisted

Ignoring these leads to real bugs.

Conclusion

This article does not describe a hypothetical demo.

It documents a real Freedom UI implementation pattern for:

  • Passing data between pages
  • Dynamically loading object metadata
  • Persisting user configuration

Until Creatio provides an official sandbox replacement for Freedom UI, this is the correct approach.

Final Takeaway

Freedom UI pages do not share state.
Browser-level messaging + Model API persistence is the only reliable solution today.

This is based on actual working code, not assumptions.

Like 0

Like

Share

1 comments

Thanks for this write up. I've been using the native BroadcastChannel API for communication in Freedom UI and works fantastically!

It's important to make sure the receiver also gets disconnected to allow garbage collection. For the sender, it's easy to just call channel.close(); after sending, but the listener is typically initialized in the crt.HandleViewModelInitRequest on the receiving page. For this, I will put a reference to the channel object in an attribute on the receiving page (how to use attributes) and then dispose/close in the crt.HandleViewModelDestroyRequest:

{
    request: "crt.HandleViewModelDestroyRequest",
    handler: async (request, next) =&gt; {
        const channel = await request.$context.MyChannelAttr;
        if (channel) {
        	channel.close();
        	request.$context.MyChannelAttr = null;
        }
        return next?.handle(request);
    }
}

Ryan

Show all comments