En Dynamics 365, el desarrollo de soluciones empresariales, es común utilizar flujos de Power Automate o plugins asociados a eventos, los cuales se desencadenan automáticamente al crear o actualizar registros (además de otros eventos).
Aunque estas automatizaciones son fundamentales para garantizar nuestros procesos de negocios, existen casos específicos en los que no queremos que se desencadenen, como por ejemplo en cargas masivas, donde es preferible evitar que estas lógicas de negocio se activen, ya que pueden ralentizar el proceso o generar resultados no deseados.
Estas operaciones masivas, pueden generar un número muy elevado de trabajos del sistema, lo que puede degradar el rendimiento de Dataverse, especialmente si hay más de 50,000 trabajos en cola. Por lo que hay que ser muy cuidadosos.
Vamos a ver como podemos hacer para evitar desencadenar dichas lógicas tanto para plugins como para flujos de Power Automate.
Omitir la Activación de Flujos de Power Automate
Si queremos evitar que se desencadenen los flujos asociados a la tabla que vamos a actualizar debemos en lugar de usar el Update usaremos execute, donde le especificaremos el parámetro SuppressCallbackRegistrationExpanderJob a true para evitar la activación de los flujos.
static void BypassPowerAutomate(IOrganizationService service)
{
var account = new Entity("account");
account["name"] = "Cuenta ejemplo";
CreateRequest request = new()
{
Target = account
};
request.Parameters.Add("SuppressCallbackRegistrationExpanderJob", true);
service.Execute(request);
}
En el caso de hacer estas actualizaciones mediante Web API, debemos de pasarle en el header
MSCRM.SuppressCallbackRegistrationExpanderJob: true
Omitir la Activación de Plugins
En el caso de los plugins podemos evitar Plugins síncronos (CustomSync) y plugins asíncronos (CustomAsync) especificando en este caso el parámetro BypassBusinessLogicExecution y valor CustomSync,CustomAsync si queremos hacer el bypass de cada tipo de plugin.
static void BypassPlugins(IOrganizationService service)
{
Entity account = new("account");
account["name"] = "Sample Account";
CreateRequest request = new()
{
Target = account
};
request.Parameters.Add("BypassBusinessLogicExecution", "CustomSync,CustomAsync");
service.Execute(request);
}
También podemos especificar, mediante una lista de GUIDs, qué pasos (plug-in steps) se deben omitir, en lugar de omitir toda la lógica personalizada.
static void BypassStepIds(IOrganizationService service)
{
Entity account = new("account");
account["name"] = "Sample Account";
CreateRequest request = new()
{
Target = account
};
request.Parameters.Add("BypassBusinessLogicExecutionStepIds", "45e0c603-0d0b-466e-a286-d7fc1cda8361,d5370603-e4b9-4b92-b765-5966492a4fd7");
service.Execute(request);
}

Hay que tener en cuenta que el usuario que envía la solicitud debe tener asignado el rol de , normalmente reservado a administradores del sistema.prvBypassCustomBusinessLogic
Como recomendación adicional, yo suelo usar mucho un Plugin de XrmToolbox que nos permite hacer el bypass desde la propia herramienta así como forzar que un plugin se desencadene haciendo un touch sobre un atributo. Este plugin es BulkDataUpdater y lo tengo entre mis favoritos sin duda.
Espero que os haya sido de utilidad.
Hasta la próxima!


