Omitir lógica de negocios personalizada

Hay ocasiones en las que desea poder realizar operaciones de datos sin tener que aplicar una lógica de negocios personalizada. Estos escenarios generalmente involucran operaciones de datos masivos donde se crean, actualizan o eliminan grandes cantidades de registros.

Como desarrollador de una aplicación cliente, puede pasar parámetros opcionales especiales con sus solicitudes para controlar dos tipos de lógica comercial personalizada, como se describe en la siguiente tabla:

Tipo de lógica Cuándo usar
Lógica sincrónica Permitir que la operación de datos masivos se complete lo más rápido posible. Omita la lógica sincrónica cuando sepa que los datos que está cambiando cumplen los requisitos de la organización o tenga un plan para lograr esta lógica por otros medios. Omita toda la lógica sincrónica personalizada para que cada operación pueda completarse más rápido, acortando el tiempo total de la operación masiva.
Flujos de Power Automate Cuando una gran cantidad de trabajos del sistema creados para admitir flujos provocan una copia de seguridad dentro de Dataverse que puede afectar el rendimiento. Puede mitigar este problema de rendimiento al no activar los flujos mientras realiza operaciones masivas.

Omitir lógica sincrónica

Utilice el parámetro opcional BypassCustomPluginExecution para omitir la lógica sincrónica personalizada.

La alternativa a usar este parámetro opcional es ubicar y deshabilitar los complementos personalizados que contienen la lógica de negocios sincrónica. Pero deshabilitar complementos significa que la lógica esta deshabilitada para todos los usuarios mientras esos complementos están deshabilitados. También significa que debe tener cuidado de deshabilitar solo los complementos correctos y recordar volver a habilitarlos cuando haya terminado.

Usar el parámetro opcional le permite deshabilitar complementos sincrónicos personalizados para solicitudes específicas enviadas por una aplicación configurada para usar esta opción.

Existen dos requisitos:

  • Debe enviar las solicitudes utilizando el parámetro opcional BypassCustomPluginExecution.
  • El usuario que envía las solicitudes debe tener el privilegio prvBypassCustomPlugins. De forma predeterminada, solo los usuarios con el rol de seguridad Administrador del sistema tienen este privilegio.

Nota

prvBypassCustomPlugins no está disponible para ser asignado en la interfaz de usuario en este momento. Puede agregar un privilegio a un rol de seguridad usando la API. Más información: Agregar el privilegio prvBypassCustomPlugins a otro rol

¿Qué hace BypassCustomPluginExecution?

Esta solución tiene como objetivo la lógica de negocios síncrona personalizada que se ha aplicado para su organización. Cuando envía solicitudes que omiten la lógica de negocios personalizada, todos los complementos síncronos y los flujos de trabajo en tiempo real se deshabilitan excepto:

  • Complementos que forman parte del núcleo del sistema de Microsoft Dataverse o parte de una solución en la que Microsoft es el editor.
  • Flujos de trabajo incluidos en una solución en la que Microsoft es el editor.

Los complementos del sistema definen los comportamientos básicos para entidades específicas. Sin estos complementos, encontraría inconsistencias en los datos que pueden no ser fáciles de solucionar.

Soluciones enviadas por Microsoft que utilizan Dataverse como Microsoft Dynamics 365 Customer Service o Dynamics 365 Sales también incluyen una lógica de negocios crítica que no se puede omitir con esta opción.

Importante

Es posible que haya comprado e instalado soluciones de otros proveedores de software independientes (ISV) que incluyen su propia lógica empresarial. Se omitirá la lógica síncrona aplicada por estas soluciones. Debe consultar con estos ISV antes de usar esta opción para comprender el impacto que puede tener si usa esta opción con los datos que usan sus soluciones.

¿Cómo uso la opción BypassCustomPluginExecution?

Puede utilizar esta opción con la API web o SDK para .NET.

Hay dos formas de usar este parámetro opcional con el SDK para .NET.

Establecer el valor como un parámetro opcional

El siguiente ejemplo establece el parámetro opcional BypassCustomPluginExecution al crear un nuevo registro de cuenta usando la clase CreateRequest.

static void DemonstrateBypassCustomPluginExecution(IOrganizationService service)
{
    Entity account = new("account");
    account["name"] = "Sample Account";

    CreateRequest request = new()
    {
        Target = account
    };
    request.Parameters.Add("BypassCustomPluginExecution", true);
    service.Execute(request);
}

Puede utilizar este método para las operaciones de datos que inicie en sus complementos cuando el usuario que llama tiene el privilegio prvBypassCustomPlugins.

Establezca la propiedad CrmServiceClient.BypassPluginExecution

El siguiente ejemplo establece la Propiedad CrmServiceClient.BypassPluginExecution al crear un nuevo registro de cuenta:

var service = new CrmServiceClient(connectionString);  

service.BypassPluginExecution = true;

var account = new Entity("account");
account["name"] = "Sample Account";

service.Create(account);

Debido a que esta configuración se aplica al servicio, permanecerá establecida para todas las solicitudes enviadas mediante el servicio hasta que se establezca en false.

Nota

Esta propiedad no está disponible en Dataverse.Client.ServiceClient, pero está disponible en los métodos Dataverse.Client.Extensions.CRUDExtentions.

Agregar el privilegio prvBypassCustomPlugins a otro rol

Como el privilegio prvBypassCustomPlugins no está disponible en la interfaz de usuario para configurar diferentes roles de seguridad, si necesita otorgar este privilegio a otro rol de seguridad, debe usar la API. Por ejemplo, es posible que desee otorgar este privilegio a un usuario con el personalizador del sistema rol de seguridad.

El privilegio prvBypassCustomPlugins tiene la identificación 148a9eaf-d0c4-4196-9852-c3a38e35f6a1 en cada organización.

Asociar el privilegio prvBypassCustomPlugins al rol de seguridad usando AddPrivilegesRoleRequest.

static void AddprvBypassCustomPluginsToRole(IOrganizationService service, Guid roleId)
{
    var request = new AddPrivilegesRoleRequest
    {
        RoleId = roleId,
        Privileges = new[]{
            new RolePrivilege{
                PrivilegeId = new Guid("148a9eaf-d0c4-4196-9852-c3a38e35f6a1"),
                Depth = PrivilegeDepth.Global
            }
        }
    };
    service.Execute(request);
}

Preguntas frecuentes para eludir la lógica sincrónica (P+F)

Las siguientes son preguntas frecuentes sobre el uso del parámetro opcional BypassCustomPluginExecution para omitir la lógica de negocios sincrónica.

¿BypassCustomPluginExecution evita los complementos para las operaciones de datos mediante complementos de Microsoft?

No. Si un complemento síncrono o un flujo de trabajo en tiempo real en una solución de Microsoft realiza operaciones en otros registros, la lógica de esas operaciones no se omite. Solo se omitirán los complementos síncronos o los flujos de trabajo en tiempo real que se aplican a la operación específica.

¿Puedo usar BypassCustomPluginExecution para operaciones de datos que realizo dentro de un complemento?

Sí, pero solo cuando el complemento se ejecuta en el contexto de un usuario que tiene el privilegio prvByPassPlugins. Para el complementos, configure el parámetro opcional BypassCustomPluginExecution en la clase derivada de la Clase OrganizationRequest. No puede utilizar las clases CrmServiceClient o ServiceClient en un complemento.

¿Qué pasa con los pasos de complemento asincrónicos, los flujos de trabajo y los flujos asincrónicos?

La lógica asincrónica no se pasa por alto. La lógica asincrónica no contribuye significativamente al costo de procesamiento de los registros, por lo tanto, este parámetro no la pasa por alto.

Omitir Power Automate Flujos

Los flujos de Power Automate pueden responder a eventos de Dataverse usando los desencadenantes Cuando se agrega, modifica o elimina una fila o Cuando se realiza una acción. Cuando ocurren estos eventos, Dataverse crea trabajos del sistema para ejecutar estos flujos.

Cuando un programa o complemento realiza operaciones masivas, se puede crear una gran cantidad de trabajos del sistema. Una gran cantidad de trabajos del sistema pueden causar problemas de rendimiento para Dataverse. Puede optar por omitir la creación de estos trabajos del sistema en su programa o complemento utilizando el parámetro opcional SuppressCallbackRegistrationExpanderJob.

La tabla CallbackRegistration administra los activadores de flujo y hay una operación interna llamada expansor que crea los trabajos del sistema.

Nota

Cuando se usa esta opción, los propietarios del flujo no recibirán una notificación de que se omitió su lógica de flujo.

Cuándo omitir flujos de Power Automate

Importante

No use el parámetro opcional SuppressCallbackRegistrationExpanderJob a menos que sepa que los problemas de rendimiento que está experimentando se deben a una gran cantidad de trabajos específicos del sistema que se crean.

Las personas han agregado flujos por motivos comerciales y no se deben omitir sin una consideración cuidadosa. Asegúrese de considerar las estrategias de mitigación mencionadas a continuación.

¿Le ayudará SuppressCallbackRegistrationExpanderJob?

Use esta opción solo si ve problemas de rendimiento después de que se produzcan operaciones masivas y tiene una gran cantidad de trabajos del sistema Operación del expansor CallbackRegistration con un StatusCode establecido en 0 : Esperando Recursos.

Puede utilizar las siguientes consultas para obtener información sobre el estado de estos trabajos.

Si el recuento total es superior a 50 000, estas consultas devuelven el siguiente error.

Nombre: AggregateQueryRecordLimitExceeded
Código: 0x8004E023
Número: -2147164125
Mensaje: The maximum record limit is exceeded. Reduce the number of records.

Nota

Si las consultas no devuelven un error, es probable que el problema no sea el número de trabajos en cola. Por lo general, la cantidad de trabajos en cola supera los 50 000 registros antes de que ocurran problemas de rendimiento.

Los siguientes ejemplos muestran el número de trabajos del sistema Operación del expansor CallbackRegistration por el código de estado. El valor de operationtype para esta clase de trabajo del sistema es 79.

static void RetrieveCallbackRegistrationExpanderStatus(IOrganizationService service)
{
    string fetchXml = @"<fetch aggregate='true'>
        <entity name='asyncoperation'>
        <attribute name='statuscode' alias='statuscode' groupby='true' />
        <attribute name='statuscode' alias='count' aggregate='count' />
        <filter>
            <condition attribute='operationtype' operator='eq' value='79' />
        </filter>
        </entity>
    </fetch>";

    FetchExpression fetchExpression = new(fetchXml);

    EntityCollection response = service.RetrieveMultiple(fetchExpression);

    foreach (Entity result in response.Entities)
    {
        string statusCode = result.FormattedValues["statuscode"];
        int count = (int)((AliasedValue)result["count"]).Value;
        Console.WriteLine($"{statusCode}: {count}");
    }
}

Salida:

Canceled: 4101
Failed: 13
Waiting for Resources: 50,000

Cómo omitir flujos de Power Automate

La forma en que omite los flujos depende de si usa el SDK para .NET o la API web.

Nota

Para las operaciones de datos iniciadas dentro de los complementos, debe usar el SDK para .NET.

Los siguientes ejemplos crean un registro de cuenta que no activará Power Automate.

static void DemonstrateSuppressCallbackRegistrationExpanderJob(IOrganizationService service)
{
    Entity account = new("account");
    account["name"] = "Sample Account";

    CreateRequest request = new()
    {
        Target = account
    };
    request.Parameters.Add("SuppressCallbackRegistrationExpanderJob", true);
    service.Execute(request);
}

Estrategias de mitigación

Los propietarios de flujos esperan que se ejecute su lógica. No se notificará a los propietarios de flujos que su lógica se omitió cuando usa esta opción. Es importante comunicar a los propietarios de flujos que no se aplicó la lógica para que sepan cuándo y por qué no se aplicó su lógica. Luego pueden determinar si aplicar o cómo aplicar su lógica.

Las personas pueden crear flujos secundarios que contengan lógica que pueda ser invocada por múltiples activadores, incluso manualmente. Si la lógica está contenida dentro de un flujo secundario, puede activarse por otros medios más adelante. Más información: Crear flujos secundarios

Identificar los flujos que se desviarán

Es posible que no pueda identificar exactamente qué flujos se omitirán. Puedes consultar la Tabla CallbackRegistration para evaluar cuánto impacto habrá y a quién contactar si sus flujos no se ejecutan. La siguiente tabla describe algunas columnas de la tabla CallbackRegistration que son útiles;

Columna Descripción
name Si este valor es un valor GUID, debe coincidir con el valor de flowid y debería poder ver la definición de flujo en una URL con este valor agregándolo a esta URL: https://make.powerautomate.com/environments/<environmentid>/flows/<flowid>/details.
message Cuando el flujo utiliza el desencadenante Cuando se agrega, modifica o elimina una fila, puede suscribirse a todas las combinaciones de operaciones Create, Update, y Delete con estas opciones:
- 1: Agregado
- 2: Eliminado
- 3: Modificado
- 4: Agregado o Modificado
- 5: Agregado o Eliminado
- 6: Modificado o Eliminado
- 7: Agregado o Modificado o Eliminado
sdkmessage Cuando el flujo utiliza el desencadenante Cuando se realiza una acción, esta columna contiene el nombre del mensaje.
scope Los flujos solo se aplican al alcance especificado por el usuario según lo definido mediante estas opciones:
- 1: Usuario
- 2: BusinessUnit
- 3: ParentChildBusinessUnit
- 4: Organización
ownerid El propietario del registro de devolución de llamada y el flujo.
softdeletestatus Si el flujo es eliminado. 0 no se elimina. 1 se ha eliminado.

Las siguientes consultas de ejemplo devuelven estos valores:

static void RetrieveCallbackOperations(IOrganizationService service)
{

    QueryExpression callbackRegistrationQuery = new("callbackregistration")
    {
        ColumnSet = new ColumnSet("name", "entityname", "message", "sdkmessagename", "scope", "ownerid"),
        Criteria = new FilterExpression(LogicalOperator.And)
        {
            Conditions = {
                { new ConditionExpression("softdeletestatus",ConditionOperator.Equal,0) },
                // Add more conditions here to filter the results
            }
        }
    };

    EntityCollection callbackRegistrations = service.RetrieveMultiple(callbackRegistrationQuery);

    foreach (Entity callbackRegistration in callbackRegistrations.Entities)
    {
        string ownerid = callbackRegistration.FormattedValues["ownerid"];
        string scope = callbackRegistration.FormattedValues["scope"];
        string name = callbackRegistration.GetAttributeValue<string>("name");
        string message = callbackRegistration.FormattedValues["message"];
        string entityname = callbackRegistration.GetAttributeValue<string>("entityname");
        string sdkmessage = callbackRegistration.GetAttributeValue<string>("sdkmessagename");

        Console.WriteLine($"{ownerid},{scope},{name},{message},{entityname},{sdkmessage},");
    }
}

Output

FirstName LastName,Organization,de7153ba-9221-4079-82cc-c884bbd05dc0,Modified,account,,
FirstName LastName,Organization,Callback Registration Id: b44090aa-adde-4866-ac2e-d68fbcbe7d5a,Added,account,,
FirstName LastName,Organization,Callback Registration Id: dabfa1a1-b794-44d0-ad34-cd49ea650606,Added,none,sample_BusinessEvent,

Preguntas más frecuentes sobre omitir flujos de Power Automate (P+F)

Las siguientes son preguntas frecuentes sobre el uso del parámetro opcional SuppressCallbackRegistrationExpanderJob para omitir flujos de Power Automate.

¿Los usuarios necesitan un privilegio especial?

No. A diferencia de Omitir lógica sincrónica, no se requiere ningún privilegio especial.

Si mi aplicación cliente usa este parámetro opcional, ¿también lo aplicarán las operaciones realizadas por los complementos registrados en la operación?

No. El parámetro no se transfiere a ninguna operación realizada por los complementos registrados para los eventos que ocurren debido a las solicitudes de su aplicación cliente. Si desea omitir flujos para operaciones realizadas por complementos, debe usar el parámetro opcional SuppressCallbackRegistrationExpanderJob en su código de complemento.

Consulte también

API web: Componer solicitudes HTTP y administrar errores
Usar parámetros opcionales

Nota

¿Puede indicarnos sus preferencias de idioma de documentación? Realice una breve encuesta. (tenga en cuenta que esta encuesta está en inglés)

La encuesta durará unos siete minutos. No se recopilan datos personales (declaración de privacidad).