Studio_Creatio
channels
Studio_Creatio

Hi Creatio Community,

I'm currently implementing a custom chat channel provider by following the official documentation, and I have a couple of questions regarding the database setup.

1. Creating the provider settings table

The documentation instructs us to create a database table using a SQL script, for example:

 

CREATE TABLE SomeProviderMsgSettings (
    Id uniqueidentifier NOT NULL DEFAULT (newid()),
    Token nvarchar(250) NOT NULL DEFAULT (''),
    UserName nvarchar(250) NOT NULL DEFAULT (''),
    CONSTRAINT PK_SomeProviderMsgSettings_Id PRIMARY KEY CLUSTERED (Id)
)

 

My understanding is that creating the table directly with SQL only creates the physical database table, but does not create a corresponding Object (Entity) in Creatio.

Is that correct?

If so:

  • Is it completely acceptable for this table to exist only in the database without a Creatio Object?
  • Or is it considered best practice to create a Creatio Object (schema) that maps to this table instead of creating it only with SQL?

2. Registering the custom provider in the Channel table

The documentation says to add a record to the Channel database table.

However, when I look in the Configuration section, I can see several objects related to "Channel", for example:

  • Channel
  • ChannelPerformance
  • ChannelPerformanceAIStatus
  • ChannelPerformanceStatus

My questions are:

  • Which Channel object is the correct one that should contain the record for a custom chat provider?
  • Is this referring to the Channel object with the code name Channel, or another object?
  • What is the recommended way to insert the record?
    • Should it be inserted directly using SQL?
    • Or is there a supported way to create the record through the Creatio UI (for example, by creating a page or using an existing section)?
    • If the UI approach is recommended, could someone explain the proper way to do it?

I'd appreciate any guidance or best practices from anyone who has implemented a custom chat channel before.

 

Thank you!

Like 0

Like

1 comments

Hello Ghifari Zakaria Ramadhan,

1. Yes, the SQL only creates a physical DB table, and that's by design - no Creatio Object is needed.

2. Use the Channel object (title "Chat channel"). You can insert data via SQL script or Data binding.

Show all comments

Hi,

I am facing an issue after migrating a Freedom UI dashboard from our One environment to another.

  • I created a Freedom UI dashboard page named Service Management using the BaseDashboardTemplate parent page in package.
  • I exported this package from one and successfully imported it into our another environment.

The Issue:

In another environment, under the Configuration section, I can see the client module page schema perfectly, and I can even open it in the Page Designer where all the layout components and widgets display correctly.

However, when I navigate to the Dashboards section in the workplace shell, the dashboard entry appears in the list, but selecting it results in a completely blank screen / infinite loading animation.

What I've Tried:

I suspect the issue is due to a missing database record binding (the metadata transferred, but the actual lookup/registry data didn't). I went to Advanced Settings $\rightarrow$ Data Binding in my package to manually bind the data record, but:

  • Searching in SysDashboard or SysWidgetDashboard by Title returns No records found.
  • Searching in SysSchemaUserSetting by the schema code also returns no results.

My Question:

Which specific system table or object stores the runtime registry/navigation records for Freedom UI dashboards built on BaseDashboardTemplate? What is the correct way to bind this dashboard so it displays properly in the workplace section after deployment?

Any guidance or step-by-step help would be highly appreciated!

Like 0

Like

0 comments
Show all comments

Hi All,

May I ask: Have you ever experienced a 400 error like this?

This appears when we save data in a form. And the data won't saved.

And after this error appears, AI Chat Creatio immediately stops working.

I also tried running Creatio in Firefox, Chrome, and other browsers in Incognito mode, but not fix the error. And this issue is intermittent but I can say 95% frequent showed up.

Need advice please, thank you.

Like 0

Like

1 comments

Hello.

The GetCanEdit 400 error is most commonly related to how the page's data source is configured, particularly when it comes to the relation criteria used to resolve a specific record.

When the relation criteria on a page are set up incorrectly, or point to a relationship that cannot be properly resolved at runtime, Creatio is unable to determine a valid related record for the given context. As a result, the value primaryColumnValue is passed as null when the request is sent to RightsService/GetCanEdit. Since this service expects a valid GUID value in order to perform the permission check, receiving a null value instead leads to a GUID deserialization error, which in turn causes the request to fail with a 400 status code.

To resolve this, we recommend reviewing the relation criteria configured on the page. Please verify whether these criteria correctly reference the intended relationship, and whether the referenced relationship is expected to always resolve to a valid record in your specific business scenario. If the relation criteria are not required for the page to function correctly, or if they are pointing to an incorrect or unnecessary relationship, we would recommend removing them.

If reviewing the relation criteria does not resolve the issue, this behavior may alternatively be caused by a duplication of the data source on the page. In such cases, having more than one data source referencing the same entity schema on a single page can also lead to similar permission-check errors, and this would need to be reviewed separately as a possible root cause.

Best regards,
Antonii

Show all comments
mobile
FreedomUI
local
storage
Studio_Creatio
8.0

Hi,
I'm adapting my Creatio mobile Freedom UI customizations to work correctly when there is no connection to the server. Is there something like local storage that I could use to save information between app launches?
I was thinking about creating a special "offline cache" object to store this data, and filtering it by the assigned user. However, this feels like a workaround.
Maybe there is already a built-in solution for this, or does Creatio plan to add something like this in the future?
Thank you in advance for your help!

Like 0

Like

3 comments

Hello Eryk,

Yes, we have native support of the offline mode. The offline mode requires an Internet connection only for the first imports and subsequent synchronizations. With this mode, the data is saved on your mobile device. Manually run a synchronization with the Creatio instance server to get the configuration changes and update the data.

You can use the following articles to get more information on how the offline mode works:
https://academy.creatio.com/docs/8.x/mobile/mobile-app-setup/classic-ui/synchronization
https://academy.creatio.com/docs/8.x/mobile/mobile-development/mobile-basics/architecture-mobile/overview-mobile

Have a great day!
 

Hi, thanks for the response.

I may have phrased my question a bit imprecisely - the need I'm describing is fairly specific. I'd like to be able to store some temporary technical information locally on the phone only, scoped to the currently logged-in user. I know I could do this by adding a dedicated object with a relation to the user and fields to hold this kind of data, setting that relation on record save, adding a filter on read, and possibly some security to prevent other users from reading it. But that feels somewhat overengineered, and on top of that, it unnecessarily writes this data to the database. It would be much simpler in this case if the SDK offered something like localStorage, where I could do:

localStorage.setItem('someSetting', { ... })

and later just read it back with:

const settingValue = localStorage.getItem('someSetting');

Hello,

At the moment, the Mobile Creatio Freedom UI SDK does not provide a public localStorage-like API for device-only data. Page attributes exist only within the ViewModel lifecycle, and custom logic runs in an embedded JS runtime rather than a browser, so the standard web localStorage is not available either.
The approach you described (a dedicated object filtered by the current user) is currently the supported way to persist such data. In offline and hybrid mode, records are stored in the local on-device database and transferred to the server only during synchronization, so it works without a connection: https://academy.creatio.com/docs/8.x/mobile/mobile-development/mobile-b…
You are right that the data will eventually reach the server database, and there is no supported way to keep it device-only. A local key-value storage in the mobile SDK is a reasonable suggestion, so please consider posting it in the Ideas section: https://community.creatio.com/?type=idea

Show all comments
mobile
FreedomUI
converters
validators
Studio_Creatio
8.0

Hi,
I know that in the browser version of Creatio, Freedom UI supports handlers, converters, and validators. I also know that for mobile, it's possible to define handlers through a remote module.
A couple of questions on this:
- Do mobile apps support converters and validators at all, or is this functionality limited to handlers only?
- If they are supported, is it possible to define them via a remote module as well, the same way as handlers?
- I'm aware that one workaround is to implement "validation" through a handler on record save (e.g. checking a field value and showing a message). However, what I'm really looking for is something that highlights the invalid field immediately, at the moment of input - similar to how validators behave in the browser UI, rather than only surfacing an error after attempting to save.

Has anyone managed to achieve this on mobile, or is this simply not supported yet?

Like 1

Like

1 comments
mobile
label
translation
Studio_Creatio
8.0

Hi,
Is there a way in Creatio mobile to reference translation labels via $context.Resources.Strings, the same way we do in JS on the Web version? I tried this, but unfortunately it doesn't work. It's possible to hardcode translations inside the mobile app, but that leaves the question of how to determine which language is currently active for the user. Is the user's active language/culture exposed anywhere in the mobile SDK?
 

Like 1

Like

3 comments
Best reply

Hello,

Yes, it is possible to reference translation labels in the Mobile application. You can retrieve them in the following ways:

1. const label = await ($context as any).getResourceString('MyResourceKey') ?? 'fallback';

This approach allows you to obtain the localized value for a specific resource key directly in code. If the resource is not found, the fallback value will be used.

2. #ResourceString(UsrName)# can be passed as title for dialog, label for button, etc via SDK. It will be resolved automatically.

 

 

Hello,

Yes, it is possible to reference translation labels in the Mobile application. You can retrieve them in the following ways:

1. const label = await ($context as any).getResourceString('MyResourceKey') ?? 'fallback';

This approach allows you to obtain the localized value for a specific resource key directly in code. If the resource is not found, the fallback value will be used.

2. #ResourceString(UsrName)# can be passed as title for dialog, label for button, etc via SDK. It will be resolved automatically.

 

 

Hi,

I checked both approaches and they work. Thanks!

Is there, however, any way to access information about the currently logged-in user and their language within the mobile app?

I just realized what my original problem actually was, and why your answer doesn't solve it :)

These solutions work when it's a label defined for the view, but they don't work at all when it's a label that refers to an object field.


[Example 1]

{
    "operation": "insert",
    "name": "TabContainer_gbg1csl",
    "values": {
        "type": "crt.TabContainer",
        "items": [],
        "caption": "#ResourceString(TabContainer_gbg1csl_caption)#",
        "iconPosition": "only-text",
        "visible": true
    },
    "parentName": "TabPanel_poiszvh",
    "propertyName": "items",
    "index": 6
},

Here we have a view label, and as you can see, it's assigned using the ResourceString macro. This works fine.

[Example 2]

{
    "operation": "insert",
    "name": "ComboBox_9ijhdyv",
    "values": {
        "layoutConfig": {
            "column": 1,
            "colSpan": 1,
            "row": 1,
            "rowSpan": 1
        },
        "type": "crt.ComboBox",
        "label": "$Resources.Strings.CaseDS_CreatedBy_lyopz5h",
        "ariaLabel": "",
        "isAddAllowed": true,
        "showValueAsLink": true,
        "labelPosition": "auto",
        "control": "$CaseDS_CreatedBy_lyopz5h"
    },
    "parentName": "GridContainer_945eip2",
    "propertyName": "items",
    "index": 0
},

Here the label is the column name. Unfortunately, in this case, none of the solutions work as expected.

Below is an example of the handler code:

await dbg($context, 'T1: ' + await $context.getResourceString('TabContainer_gbg1csl_caption')); // Correct label
await dbg($context, 'T2: ' + await $context.getResourceString('CaseDS_CreatedBy_lyopz5h')); // Incorrect label: null
await dbg($context, 'T3: #ResourceString(TabContainer_gbg1csl_caption)#'); // Correct label
await dbg($context, 'T4: #ResourceString(CaseDS_CreatedBy_lyopz5h)#'); // Incorrect label: #ResourceString(CaseDS_CreatedBy_lyopz5h)#
Show all comments
mobile
filter
quick-filter
list
Studio_Creatio
8.0

Hi,
Is it possible to manage quick filters on the list view in the Creatio Freedom UI mobile app the same way as in the browser version?
What I need:

  • Add custom filters
  • Multiselect filters
  • Restrict the static list of values available in a filter - for example, in the Owner field, show only contacts of the "Employee" type

I've noticed that the set of filters is tied to the set of columns displayed on the list tile, but this is limiting.

Like 1

Like

2 comments
Best reply

Hello,

You can add the Quick Filter component by selecting it in the Freedom UI Mobile Designer and dragging it onto your page layout. After adding the component, ensure that the filter is configured with the appropriate data type and is correctly linked to the corresponding list component.

Please refer to the screenshot below for reference on configuring Quick Filters in the new Freedom UI Mobile Designer.

image.png

I hope this helps.

Thank you for choosing Creatio!

Hello,

You can add the Quick Filter component by selecting it in the Freedom UI Mobile Designer and dragging it onto your page layout. After adding the component, ensure that the filter is configured with the appropriate data type and is correctly linked to the corresponding list component.

Please refer to the screenshot below for reference on configuring Quick Filters in the new Freedom UI Mobile Designer.

image.png

I hope this helps.

Thank you for choosing Creatio!

Thank you :)

Show all comments
Studio_Creatio

Hello

I'm working on a Creatio application with two sections:

  1. Application (Service Request)
  2. License

Each License belongs to a specific Application.

I have already created a Request Number lookup field in the License section, so each License is linked to its corresponding Application, and this relationship works correctly.

Now I want to achieve the reverse: on the Application page, I want to display the related License automatically.

To do this, I added a License Number lookup field to the Application section (lookup to the License object). However, I cannot get it to populate automatically with the related License.

I tried several approaches, including using a Business Process with Read Data and Modify Data, but I haven't been able to make it work.

What is the recommended or best-practice approach in Creatio for implementing a one-to-one relationship like this? Should I use:

  • A Business Process?
  • A Business Rule?
  • A Detail instead of a lookup?
  • Or is there another recommended configuration?

Any guidance or examples would be greatly appreciated. Thank you!

Like 0

Like

1 comments

Hi,

For a true one-to-one relationship, I would not recommend maintaining two independent lookup fields unless you really need to store the reverse reference for reporting/integration purposes.

The cleaner approach is to keep a single source of truth:

License.Request Number -> Application

Then, on the Application page, display the related License through the page configuration rather than trying to populate Application.License Number automatically.

If you are using Freedom UI, the best fit is usually Multiple data sources. Add License as an additional/secondary data source on the Application page and configure the relation criteria using the existing lookup:

License.Request Number = current Application

After that, you can place the needed License fields directly on the Application page. This is the closest match for a real 1:1 UI, because the user sees License data as part of the Application page without duplicating the relationship.

Documentation:
https://academy.creatio.com/docs/8.x/no-code-customization/customization-tools/ui-and-business-logic-customization/multiple-data-sources

A Business Rule is not the right tool for this. Business rules are mainly for UI behavior, visibility, required fields, validation, etc. They do not automatically query a related child record and populate a reverse lookup.

A Business Process can do it, but only if you intentionally want to denormalize the data. In that case, you would need to handle all scenarios: License creation, changing the Application on the License, deleting/unlinking the License, and preventing more than one License per Application. Otherwise the two lookup fields can become inconsistent.

Show all comments
audit
Studio_Creatio
8.0

Hello community,

does anyboty know how to get all event types which are really stored in Audit log if occured? I mean I can select all event type in the advanced filter but if it means that all event types I can select are really stored in the log even now I can't find at least one of them?

For example, I can select in the filter "Get enitity schema operation rights" value and don't see any records. Is this event in any case stored in the log if it occured? Or can the actual list be confugured somewhere?

Like 0

Like

3 comments

Hi Artem, 

in system settings you can turn on/off the logging for certain types of events - e.g. UseAdminSettingsLog, UseAdminEntitySchemaOperationLog...

I assume what you see is the possible Lookup Values for types of events, however if logging for them is turned off, then no records are created of this type you could see

Best, 
David

David Örnek,

thanks a lot! Does selected Default value checkbox mean that the event is included in the log, and if it isn't selected then vice versa?

Hi Artem,

The Audit log records themselves are stored in the SysOperationAudit table. The list of available audit event types is stored separately in the SysOperationType lookup/table.

This means that the values you see in the advanced filter are the available operation types from SysOperationType, but it does not necessarily mean that records for all of these types are currently being written to the audit log.

Whether a specific type of event is actually logged depends on the corresponding system setting.

Regarding the Default value checkbox in the system setting: if it is enabled, then this logging option is enabled and the corresponding event type should be included in the audit log when such an event occurs.

Show all comments
mobile
closepage
discard
Studio_Creatio
8.0

Hi, I'm trying to use crt.ClosePageRequest in the mobile app. If any field on the view has been previously changed, a popup appears asking me to confirm whether I really want to discard the current changes. Unfortunately, I'm unable to get rid of it in any way. In the browser version of Creatio, defining a handler for the crt.CanDiscardUnsavedDataRequest request helped, as described in this article: https://customerfx.com/article/suppressing-the-unsaved-data-prompt-when…
I've already tried many different things, including setting $context.HasUnsavedData = false, but unfortunately without success.
 

Like 2

Like

2 comments

Hello,

This functionality is currently not available in the mobile application. It can lead to unintended data loss caused by accidental swipes, taps, or navigation actions.

Additionally, overriding crt.ClosePageRequest would not address all navigation scenarios. For example, it would not be triggered when users navigate away from the page using device-level system buttons or gesture-based navigation, which are common on mobile devices.

Hi Krzysztof,
Thanks for the explanation, but I think this doesn't fully explain the limitation. The web app has the same risk (accidental clicks, closed tabs, etc.), but `crt.CanDiscardUnsavedDataRequest` still allows a developer to skip the prompt when needed. The idea isn't to change the default behavior for users, it's to give developers the same option that already exists on web.
The point about system-level gestures and buttons is fair, but it only means the hook wouldn't cover 100% of cases. On web, closing the browser with an OS shortcut isn't covered either, and the hook is still useful for the navigation paths that do go through the app logic.
 

Show all comments