Esta es la decimonovena entrega de la serie sobre utilidades para Business Central. En esta ocasión explico tres suscriptores de eventos que permiten extender el sistema de adjuntos estándar de Business Central para que funcione con tablas que no están soportadas de forma nativa, como Salesperson/Purchaser (Vendedores) y Location (Almacenes).

¡Vamos manos a la obra! 📎


¿Por qué son necesarios estos eventos?

El sistema de Document Attachment de BC gestiona documentos adjuntos a registros de muchas tablas (Clientes, Artículos, Pedidos...). Sin embargo, no todas las tablas están configuradas de forma nativa. Para añadir soporte a una tabla nueva, hay que suscribirse a los eventos que BC publica durante el proceso de adjuntar documentos.


📋 Evento 1: Obtener la tabla de referencia

[EventSubscriber(ObjectType::Codeunit, codeunit::"Document Attachment Mgmt", OnAfterGetRefTable, '', true, true)]
local procedure DocAttachManagementOnAfterGetRefTable(DocumentAttachment: Record "Document Attachment"; var RecRef: RecordRef)
var
    SaleSPerson: Record "Salesperson/Purchaser";
begin
    case DocumentAttachment."Table ID" of

        Database::"Salesperson/Purchaser":
            begin
                RecRef.Open(Database::"Salesperson/Purchaser");
                if SaleSPerson.Get(DocumentAttachment."No.") then
                    RecRef.GetTable(SaleSPerson);
            end;
    eND;
end;

¿Qué hace?

Se suscribe al evento OnAfterGetRefTable del codeunit Document Attachment Mgmt. Cuando BC necesita abrir la tabla de referencia de un adjunto, este evento nos permite indicar qué tabla abrir para el caso de Salesperson/Purchaser.

Si el adjunto pertenece a un vendedor, abre la tabla y carga el registro correspondiente en el RecordRef.


📋 Evento 2: Inicializar campos desde RecordRef

[EventSubscriber(ObjectType::Table, Database::"Document Attachment", 'OnAfterInitFieldsFromRecRef', '', false, false)]
local procedure OnAfterInitFieldsFromRecRef(var DocumentAttachment: Record "Document Attachment"; var RecRef: RecordRef)
var
    FieldRef: FieldRef;
    RecNo: Code[20];
begin
    case RecRef.Number of
        Database::"Salesperson/Purchaser":
            begin
                FieldRef := RecRef.Field(1);
                RecNo := FieldRef.Value;
                DocumentAttachment.Validate("No.", RecNo);
            end;

    end;
end;

¿Qué hace?

Se suscribe al evento OnAfterInitFieldsFromRecRef de la tabla Document Attachment. Cuando BC inicializa los campos de un nuevo adjunto a partir de un registro, este evento permite leer el campo clave primaria del RecordRef (campo número 1) y asignarlo al campo No. del adjunto.

Esto es lo que permite que el adjunto quede correctamente vinculado al código del vendedor.


📋 Evento 3: Abrir para tabla Location (Almacén)

[EventSubscriber(ObjectType::Page, Page::"Document Attachment Details", 'OnAfterOpenForRecRef', '', false, false)]
local procedure OnAfterOpenForRecRef(var DocumentAttachment: Record "Document Attachment"; var RecRef: RecordRef);
var
    FieldRef: FieldRef;
    RecNo: Code[20];
begin
    case RecRef.Number of
        Database::Location:
            begin
                FieldRef := RecRef.Field(1);
                RecNo := FieldRef.Value;
                DocumentAttachment.Validate("No.", RecNo);
            end;
    end;
end;

¿Qué hace?

Se suscribe al evento OnAfterOpenForRecRef de la página Document Attachment Details. Cuando se abre la pantalla de adjuntos desde un almacén (Location), este evento inicializa correctamente el filtro de la tabla Document Attachment para mostrar solo los adjuntos del almacén en cuestión.


¿Cómo encajan los tres eventos?

El flujo completo cuando un usuario adjunta un documento a un vendedor es:

  1. BC invoca OnAfterGetRefTable → se abre la tabla correcta (Salesperson/Purchaser).
  2. BC invoca OnAfterInitFieldsFromRecRef → se rellena el campo No. del adjunto con el código del vendedor.
  3. Al abrir el detalle de adjuntos para un almacén, BC invoca OnAfterOpenForRecRef → se filtra para mostrar solo los adjuntos de ese almacén.

Implementar estos tres eventos es la forma estándar y recomendada de añadir soporte de adjuntos a tablas no contempladas de forma nativa en BC.


💡 Aplicaciones prácticas

  • Adjuntar contratos, fotos o documentos a fichas de vendedores.
  • Adjuntar planos, fichas técnicas o certificados a fichas de almacenes.
  • Extender este patrón a cualquier otra tabla que necesite soporte de adjuntos.

Conclusión

En esta decimonovena entrega de la serie Utils, muestro cómo extender el sistema de adjuntos de Business Central para dar soporte a tablas no incluidas de forma nativa, como vendedores y almacenes. El patrón de tres eventos es reutilizable para cualquier tabla que quieras incorporar al sistema de adjuntos estándar.

Para seguir todos los posts de esta serie, puedes encontrarlos bajo la etiqueta #UtilsBc.

Si quieres ver el código completo, está en GitHub.

¡Nos vemos en la próxima!