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

Hi Everyone,

We are experiencing an issue with the Send Test Email functionality in Bulk Email.

When we click Send Test Email, the test email is not delivered immediately. In our testing, it is taking almost 24 hours to arrive. We have also noticed that when the email is finally received, it is being routed to Quarantine instead of the inbox.

We have tested this with multiple bulk emails and observed the same behavior.

Has anyone else experienced delayed test email delivery or quarantine issues? If so, were there any settings or configurations that helped resolve it?

Any guidance would be appreciated.

Thank you!

Like 0

Like

0 comments
Show all comments
Studio_Creatio
sidebar
FreedomUI
creatio_v_8.3.3
Studio_Creatio
8.0

Hi,

I have a custom Freedom UI sidebar, that I open programmatically from a button on another page using crt.OpenSidebarRequest.

My requirement: every time the sidebar opens, I need to pass dynamic data (a record Id, a record number, etc. — different each time depending on what the user clicked) into the sidebar so it can pre-fill some fields.

What I've tried and confirmed does NOT work:

  1. crt.OpenSidebarRequest — only accepts type, sidebarCode, and $context. No params field.
  2. Mutating request.$context on the caller before opening, then reading it from the sidebar — turns out the sidebar's $context is a completely separate view-model instance, so changes never propagate across.
  3. crt.HandleViewModelResumeRequest / crt.HandleViewModelInitRequest inside the sidebar's inline schema — Init only fires once (the sidebar's view model is created once and never destroyed/recreated on subsequent opens, just hidden/shown), and Resume also only fired on the very first open in my testing, not on every reopen.
  4. crt.HandleSidebarOpenRequest — confirmed this only works from an Angular remote module. But even after building the remote module and confirming it fires reliably every single open cycle, the request object only contains { type, sidebarCode } — no $context, so there's no way to push data from the remote module into the sidebar's actual view model fields.

What does work : BroadcastChannel, sent from the caller page's click handler, received in the sidebar's crt.HandleViewModelInitRequest handler (registered once, stays alive for the sidebar's whole lifetime since the view model itself isn't destroyed/recreated). Combined with a "ready" handshake to fix a race condition on the very first open (sidebar's listener isn't registered yet by the time the caller sends, since async init takes a moment).

My question: is there a more "native"/supported way to do this that I'm missing, or is BroadcastChannel genuinely the only mechanism Creatio offers for this in Freedom UI sidebar today? Specifically interested in:

  • Whether crt.HandleSidebarOpenRequest's request payload can ever carry custom data (e.g. via some other request type chained before it)
  • Whether there's a documented way to get a live reference to the sidebar's own view model from the caller's side
  • Whether Creatio has any roadmap plans to add a params/data field to crt.OpenSidebarRequest

    Creatio Version - 8.3.3

    Thanks
Like 0

Like

2 comments

Hello Darshan Dev Prajapat,

You can use MessageChannelService instead of BroadcastChannel.

All you need to do is import the Creatio DevKit SDK, select the place to subscribe/unsubscribe (Pause/Resume or Init/Destroy events), and use the sdk.MessageChannelService. Available in version 8.2.0 and above.

Basic subscription example:

handlers: /**SCHEMA_HANDLERS*/[
	{
		request: "crt.HandleViewModelResumeRequest",
		handler: async function (request, next) {
			const messageChannelService = new sdk.MessageChannelService();

			request.$context.MySubscription = await messageChannelService.subscribe(
				"TestSender",
				(message) => console.log(message.body)
			);

			return next?.handle(request);
		}
	},
	{
		request: "crt.HandleViewModelPauseRequest",
		handler: async function (request, next) {
			const subscription = await request.$context.MySubscription;
			subscription.unsubscribe();

			return next?.handle(request);
		}
	}
]/**SCHEMA_HANDLERS*/

Basic sending example:

handlers: /**SCHEMA_HANDLERS*/[
	{
		request: "crt.HandleViewModelInitRequest",
		handler: async (request, next) => {
			const messageChannelService = new sdk.MessageChannelService();

			const body = {
				// Some data
			};

			await messageChannelService.sendMessage(
				"TestSender",
				body,
				sdk.MessageChannelType.PTP
			);

			return next?.handle(request);
		}
	}
]/**SCHEMA_HANDLERS*/

You can use the following channel types:

  • MessageChannelType.PTP: The message will be sent to the same user who sent that message (client-side).
  • MessageChannelType.BROADCAST: The message will be sent to all users (client-side).
  • MessageChannelType.SERVER: The message will be sent to the server. In this case, only the server-side subscription will receive this message.

Eduard Dovydovskyi,

Hello Eduard Dovydovskyi,

Thanks for the suggestion! I tried MessageChannelService with crt.HandleViewModelResumeRequest/crt.HandleViewModelPauseRequest as shown, but I'm hitting the same root issue I had before switching to it: crt.HandleViewModelResumeRequest only fires on the very first time the sidebar opens, not on subsequent opens.

In my testing, the sidebar's view model is created once and never destroyed — closing the sidebar just hides it, it doesn't tear down/recreate the page instance. So Resume/Pause don't actually fire again on reopen, the way they would for normal page navigation. I confirmed this independently with console logs on Init/Resume/Pause/Destroy before trying MessageChannelService — only Init and Resume fired once each, on the first open, and nothing fired again on close/reopen.

Since MessageChannelService.subscribe is set up inside Resume in your example, the subscription itself is also only ever created once — which actually works fine for receiving subsequent messages (since the subscription stays alive), but doesn't help if the goal is to refresh/re-trigger something specifically tied to the reopen event itself.

Is this a known difference in sidebar lifecycle vs. regular page lifecycle? Is there a Resume/Pause-equivalent that's specific to the sidebar's open/close state rather than the view model's attach state? Or is the expectation that we just send a new message each time (via PTP) to a subscription that was set up once on first init/resume, rather than relying on the subscribe step itself re-firing?

For context, my actual use case: I need to pass different data into the sidebar's fields every time it's reopened with a different source record. Right now I'm sending the message right after crt.OpenSidebarRequest resolves and the sidebar's subscription (set up once on first load) picks it up fine — so the data delivery itself works. The only remaining friction is the very first open, since the subscription isn't registered yet at the moment the first message is sent (timing race). Would love to know if there's a "ready" signal or queuing behavior built into MessageChannelService for that case, or if I should keep handling it manually with a short retry/handshake.

Thanks

Show all comments
Service_Creatio
Service_Creatio_enterprise_edition
8.0

Hi Team,

I’m currently working on the Case Rating / Feedback functionality in Creatio and came across the following condition in the OOTB service:

UserConnection.GetIsFeatureEnabled("UseOldFeedbackPage")

It controls whether the system opens the standard feedback page or the icons-based page.

I have a few quick questions:

  • How to enabled it in Creatio?
  • If not visible in Feature Management, should we create it manually?
  • What is the recommended way to control feedback page behavior?

Thanks in advance!

Like 1

Like

0 comments
Show all comments

Hi commnity,

 

we have a business process where we need to have an agent answer to an email from a customer.

I know how to get the email via id in activity with type email, but am struggling to then create a reply that keeps all of the email history and works as a "normal" threaded email.

 

Any ideas on how to achieve this?

Thanks,

Luis

Like 1

Like

1 comments

Hello,

In this scenario, the recipient information should be taken from the related email message records rather than only from the Activity record itself. The Activity with type “Email” can be used to identify the email, but to build a proper “reply all” scenario, the process would need to read the corresponding Email Message object data, including the sender, To, and CC recipients, and then determine the required recipient list for the outgoing message.

However, sending an email directly as a reply into the same existing email thread, so that it behaves exactly like a normal threaded email with the full conversation history and mail headers preserved, is not supported by out-of-the-box business process tools.

Using the standard “Send email” process element, it is possible to send a new email and, if needed, manually include the previous email content in the body/template. However, this does not create a true technical reply in the original email thread in the same way as replying from an email client would.

To achieve the expected behavior, additional development would be required in the business process, for example by using a Script task or a custom process element. The custom logic would need to read the original Email Message, prepare the outgoing message, populate the required recipients, include the previous email body if needed, and set the necessary email/threading parameters so that the message is processed as a reply rather than as a completely new email.

Therefore, the requirement is achievable, but not only by standard no-code business process configuration. It requires custom development.

Show all comments
8.3.3
Business Process
logging
Sales_Creatio
8.0

I am trying to add some custom logging to BP execution, and would like to have a reference back to the BP instance that is being run so that the user can click the link and go to the BP instance's log page. I do not believe there is a system variable/similar that will provide that, but I'm hoping I'm just missing something! I know it is possible to use a script task to fetch this information from context.Process.InstanceUId, but if possible it would be nice to avoid having to add a script task and therefore compile the BP just for this.

Like 0

Like

1 comments

Hello,

The recommended approach to obtain the business process instance ID is to create a script task, as you mentioned, and retrieve the value directly from the context.

At present, there is no alternative recommended solution for this requirement.

Show all comments