Loading

Instancia de Apex anónima para eliminar el acceso a objetos personalizados con licencia de CPQ de los conjuntos de permisos

Fecha de publicación: Sep 27, 2025
Descripción
A partir de Salesforce CPQ 228, se introdujeron las licencias de conjunto de permisos (PSL) para el paquete. Para ver objetos con licencia de CPQ e interactuar con ellos, los usuarios deben tener asignada una PSL de CPQ. Este cambio puede afectar a los conjuntos de permisos existentes si conceden acceso a objetos secundarios sin conceder también acceso a su objeto CPQ principal. Al intentar guardar cambios en estos conjuntos de permisos, es posible que se muestre un mensaje de error de validación similar a los ejemplos siguientes y se impida la acción de guardar:
  • No es posible conceder el permiso Leer en XXXXXX. Conceda el permiso usando un conjunto de permisos con la licencia necesaria o utilice un conjunto de permisos que no esté asociado con una licencia específica.
  • DEBUG|Error en la actualización de los permisos del objeto por el siguiente motivo: System.DmlException: Error al eliminar. Primera excepción en la fila 0 con ID 110Dx0000074p0iIAA; primer error: FIELD_INTEGRITY_EXCEPTION, No se puede eliminar Leer o Ver todos los registros si el conjunto de permisos principal tiene activado el permiso Ver todos los datos: [],AnonymousBlock: línea 23, columna 1
 

El conjunto de permisos debe volver a un estado válido antes de que el sistema permita cualquier cambio. Eliminar todos los permisos del objeto CPQ/AA relevantes restaurará el conjunto de permisos a un estado válido. Para actualizar el conjunto de permisos a fin de que sea compatible después de la actualización a CPQ 228 (Winter '21), los administradores pueden utilizar la siguiente consulta para eliminar los permisos de objetos relacionados con CPQ de los perfiles personalizados. Siga los pasos que se indican a continuación para ejecutar la secuencia de comandos en Developer Console:
  1. Abrir Developer Console
  2. Depurar > Abrir ventana de ejecución anónima (CTRL+E)
  3. Copie y pegue el código en la ventana anónima.
  4. Comprobar: Abra el registro.
  5. Ejecútelo.
  6. Marque la casilla de filtro "Solo depurar".

NOTA: 
  • El objeto Destinatario de DocuSign define Plantilla de presupuesto como el principal de su relación principal-detalle. Por ello, las organizaciones que usan DocuSign pueden tener que eliminar permisos del objeto Destinatario de DocuSign si la persona no es un usuario de CPQ designado con una licencia relacionada. De lo contrario, el usuario deberá tener asignada una licencia de conjunto de permisos de CPQ.
  • Los permisos del sistema Ver todos los datos y Modificar todos los datos se deben eliminar de los conjuntos de permisos para que la secuencia de comandos se ejecute correctamente. 
Solución
// 1. Definir objetos CPQ+AA (LCO + dependientes) por orden jerárquico para su eliminación String[] customLCOAndDependentObjects = new String[] { 'SBQQ__QuoteLinePricingGuidance__c','SBQQ__QuoteDocument__c','SBQQ__QuoteLineConsumptionRate__c','SBQQ__QuoteLineConsumptionSchedule__c','SBQQ__QuoteLine__c','SBQQ__QuoteLineGroup__c','SBQQ__Quote__c', 'SBQQ__PricingGuidanceTier__c','SBQQ__PricingGuidance__c', 'SBQQ__ErrorCondition__c','SBQQ__ConfigurationRule__c','SBQQ__ProductAction__c','SBQQ__ProductRule__c', 'SBQQ__LookupQuery__c','SBQQ__PriceCondition__c','SBQQ__PriceAction__c','SBQQ__PriceRule__c', 'SBQQ__LineColumn__c','SBQQ__TemplateSection__c','SBQQ__QuoteTemplate__c', 'SBQQ__SubscriptionConsumptionRate__c','SBQQ__SubscriptionConsumptionSchedule__c','SBQQ__SubscribedAsset__c','SBQQ__Subscription__c', 'sbaa__ApprovalSnapshot__c','sbaa__Approval__c', 'sbaa__ApprovalCondition__c','sbaa__ApprovalRule__c' }; // reemplazar a continuación con la identificación del conjunto permanente String permSetId = ''; ObjectPermissions[] profileObjPerms; // 2. Iterar y eliminar para que no se realice todo en 1 lote for(String objName : customLCOAndDependentObjects) { // Consulta de permisos de objeto por objeto profileObjPerms = [SELECT Id FROM ObjectPermissions where Parent.Id = :permSetId and SobjectType = :objName]; System. debug('Permisos de objeto para objeto:'+nombreObj+':'+permisosObj.tamaño()); try{ // Anular comentario de la línea inferior antes de ejecutar // delete perfilPermisosObj; } catch(Exception e){ System.debug('La actualización de permisos de objetos falló debido al siguiente motivo: '+ e + ',' + e.getStackTraceString()); } } // 3. Consulta para garantizar que se hayan eliminado todos los permisos de objeto relevantes ObjectPermissions[] objPerms = [SELECT Id FROM ObjectPermissions where Parent.Id = :permSetId and SobjectType = :customLCOAndDependentObjects]; System.debug('Volver a ejecutar los registros permanentes de objetos para CPQ y AA: '+ objPerms.size());


NOTA: Si la regla de precios no se define como el objeto maestro para SBQQ__LookupQuery__c, puede eliminar 'SBQQ__LookupQuery__c' de la lista de objetos en el paso 2 del código anterior.
 

CONSULTE TAMBIÉN

 

Número del artículo de conocimiento

000394589

 
Cargando
Salesforce Help | Article