Addons estándar / Extensión de datos FACe
Ficha técnica
| Elemento | Valor |
|---|---|
| Nombre comercial | Extensión de datos para la factura electrónica FACe |
| Nombre interno | Sit.FACe.Ext |
| Código de artículo | TBD (pendiente de alta en catálogo) |
| Diccionario | DSIT_FACE_EXT (versión 1.3) |
| Carpeta de extensión | Extensiones\Sofitec\SIT_FACE_EXT |
| Escuchador registrado | Sit.FACe.Ext.Dll.Escuchador |
| Tablas propias | SIT_FACE_EXT_CONFIG, SIT_FACE_EXT_MAPEO, SIT_FACE_EXT_RESULTADO |
| Vista propia | SIT_FACE_EXT_V_INCIDENCIAS |
| Ámbito | Facturas de venta, en el momento de generar el fichero de factura electrónica |
| Versiones de referencia | Sit.FACe.Ext.Dll 1.0.0 sobre a3ERP 14.6.2 |
Qué hace#
a3ERP genera el XML de factura electrónica con los datos que él conoce. Cuando la administración receptora, el cliente o el punto general de entrada exigen algún dato adicional —una referencia de contrato, un código de expediente, un centro administrativo—, ese dato existe en la factura pero no llega al fichero.
El módulo se engancha al momento en que a3ERP acaba de generar ese XML y, antes de que se entregue, añade los nodos que se hayan configurado, tomando los valores de campos de la cabecera o de las líneas de la factura.
La correspondencia entre campo de origen y nodo de destino es configuración, no programación: se declara en una tabla del diccionario y se puede cambiar por empresa sin tocar el módulo.
Un ejemplo de extremo a extremo#
Un organismo exige la referencia del contrato y el periodo facturado. La factura FV/2026/0341 lleva anotado CTR-2026-0143 en el campo de referencia de contrato de la cabecera, y las fechas 01/01/2026 y 31/03/2026 en los del periodo.
El XML que entrega a3ERP contiene, en el bloque de datos de emisión, sólo lo que el ERP conoce:
<InvoiceIssueData>
<IssueDate>2026-04-03</IssueDate>
<InvoiceCurrencyCode>EUR</InvoiceCurrencyCode>
<TaxCurrencyCode>EUR</TaxCurrencyCode>
<LanguageName>es</LanguageName>
</InvoiceIssueData>
Y tras pasar por el módulo:
<InvoiceIssueData>
<IssueDate>2026-04-03</IssueDate>
<InvoicingPeriod>
<StartDate>2026-01-01</StartDate>
<EndDate>2026-03-31</EndDate>
</InvoicingPeriod>
<InvoiceCurrencyCode>EUR</InvoiceCurrencyCode>
<TaxCurrencyCode>EUR</TaxCurrencyCode>
<LanguageName>es</LanguageName>
<ReceiverContractReference>CTR-2026-0143</ReceiverContractReference>
</InvoiceIssueData>
Tres cosas a observar. El bloque InvoicingPeriod no existía y lo ha creado el módulo, porque las dos fechas cuelgan de él. Cada nodo se ha insertado en la posición que exige el esquema, no al final: el formato define una secuencia y colocarlos en otro orden invalidaría el fichero. Y lo que ya estaba no se ha tocado.
Alcance: qué se resuelve configurando y qué no#
Es la distinción más importante de todo el artículo, porque determina si una petición del cliente se atiende con una fila en una tabla o con un desarrollo.
El módulo hace una cosa: copiar el valor de una columna existente a un nodo previsto por el esquema de Facturae. De ahí salen sus dos límites.
El destino debe existir en el esquema. No se pueden generar nodos que el formato no contemple, ni en posiciones que su secuencia no admita. Un nodo no reconocido se descarta y se registra.
El origen debe existir como columna. El módulo lee de CABEFACV y LINEFACT, ya sean columnas propias de a3ERP, las que añade este diccionario o las que haya añadido otra extensión. Copia el valor tal cual, con la conversión de tipo y el formato declarados en el mapeo.
Lo que no entra en el alcance:
| Necesidad | Por qué queda fuera |
|---|---|
| Un dato para el que no hay columna donde guardarlo | Exige ampliar el diccionario con campos nuevos |
| Que un campo se rellene automáticamente | El módulo no calcula ni deriva valores |
| Un valor que dependa del cliente, del artículo o de una condición | Es lógica de negocio, no una correspondencia fija |
| Concatenar varias columnas, o transformar el valor | Sólo hay copia con conversión de tipo y formato |
| Alimentar el dato desde otro documento o sistema | Fuera del contexto del evento |
Todo eso es viable, pero corresponde a un módulo adicional a medida, y conviene precederlo de una consultoría que concrete el requisito: qué dato, de dónde sale, quién y cuándo lo introduce, y qué pasa cuando falta. Conviene decirlo pronto en la implantación, antes de que se dé por supuesto que basta con configurar.
Qué no hace, y por qué importa#
No modifica la factura. No escribe en CABEFACV ni en LINEFACT, ni siquiera en columnas propias añadidas por su diccionario. Sólo lee.
No altera ningún dato con relevancia fiscal del XML. Número y serie, fechas de expedición y operación, identificación fiscal de las partes, importes, impuestos, totales y firma están vetados por código, y ese veto no es configurable. Si un mapeo apunta a uno de esos nodos, se descarta al cargar la configuración y se registra la incidencia.
Es una decisión de diseño tomada por el reglamento de sistemas informáticos de facturación: el fichero que se entrega no puede contradecir lo que el ERP tiene registrado. Si un dato fiscal sale mal, la vía es corregirlo en la factura y volver a emitir.
Requisitos#
| Requisito | Detalle |
|---|---|
| a3ERP | Probado sobre 14.6.2 |
| Framework | .NET Framework 4.8 en el cliente |
| Licencia | Requiere licencia activa del módulo. Sin ella el módulo se desactiva, avisa una vez y a3ERP sigue emitiendo el XML sin tratar |
| Permisos | Los del usuario del ERP: el módulo trabaja sobre la conexión que le entrega a3ERP y no abre ninguna propia |
Qué se instala#
El instalador despliega la carpeta de extensión con la estructura habitual:
Extensiones\Sofitec\SIT_FACE_EXT\
├── binarios\ la librería, sus dependencias y regDlls.ini
├── diccionarios\DSIT_FACE_EXT\
└── imagenes\
Después hacen falta tres pasos que el instalador no hace y que se detallan en el artículo de instalación: registrar la DLL en la tabla DLLS de cada empresa donde deba actuar, aplicar el diccionario desde a3ERP, y dar de alta la vista SQL de consulta de incidencias.
Qué crea en la base de datos#
| Objeto | Tipo | Contenido |
|---|---|---|
SIT_FACE_EXT_CONFIG |
Tabla auxiliar | Parámetros del módulo para la empresa. Editable desde tablas adicionales |
SIT_FACE_EXT_MAPEO |
Tabla auxiliar | Correspondencias campo de origen → nodo del XML. Editable desde tablas adicionales |
SIT_FACE_EXT_RESULTADO |
Tabla general | Resultado de cada factura procesada. No editable: la escribe el módulo |
SIT_FACE_EXT_V_INCIDENCIAS |
Vista | Traduce el resultado a datos reconocibles por el usuario |
Además añade columnas propias a CABEFACV y LINEFACT, que son las que el usuario rellena cuando el dato a enviar no existe ya en la factura. Todas llevan el prefijo SIT_FACE_EXT_ y su descripción empieza por FACe: para distinguirlas de las columnas del ERP y de las de otras extensiones.
Cuándo se ejecuta#
El módulo se suscribe a tres eventos de a3ERP:
| Evento | Cuándo | Qué hace |
|---|---|---|
IniciarGeneral |
Al entrar en la empresa | Carga configuración y mapeos, valida licencia, inicia la traza y avisa de incidencias de configuración |
TrasGenerarFacturaE |
Tras generar el XML de una factura, antes de entregarlo | Aplica los mapeos y registra el resultado |
Finalizar |
Al salir de la empresa | Cierra la traza |
Toda la lectura y la escritura ocurren dentro de la transacción del ERP, sobre la conexión que éste facilita.
Configuración#
En SIT_FACE_EXT_CONFIG, una fila por empresa:
| Columna | Valores | Efecto |
|---|---|---|
SIT_FACE_EXT_ACTIVO |
T / F |
Con F el módulo no interviene y a3ERP emite el XML sin tratar |
SIT_FACE_EXT_FORZARNODOS |
T / F |
Con T genera el nodo aunque el valor de origen esté vacío |
SIT_FACE_EXT_VALIDARXSD |
T / F |
Con T valida el XML resultante contra el esquema de la versión de Facturae detectada |
SIT_FACE_EXT_TRUNCAR |
T / F |
Con T recorta el valor si supera la longitud admitida por el nodo. Con F cancela la emisión e informa del campo, el valor y el límite |
SIT_FACE_EXT_AVISOS |
T / F |
Con F no muestra ventanas. Necesario en instalaciones desatendidas |
SIT_FACE_EXT_NIVELTRAZA |
0 a 6 |
0 Trace, 1 Debug, 2 Information, 3 Warning, 4 Error, 5 Critical, 6 ninguna. Por defecto 2 |
El parámetro de truncado es el que más consecuencias tiene. Con T el documento sale, con el valor recortado; con F no sale ninguno, y el usuario recibe un mensaje del ERP que indica qué campo, qué valor, qué longitud y cuál es el límite. Cuál de los dos comportamientos conviene depende de si el dato afectado es relevante para el receptor.
Versiones de Facturae admitidas#
3.1, 3.2, 3.2.1 y 3.2.2. El módulo detecta la versión a partir del espacio de nombres del XML generado y coloca cada nodo en la posición que exige el esquema correspondiente. Ante una versión no reconocida no interviene, y lo registra.
Dónde mirar cuando algo no funciona#
El resultado de cada factura está en la vista SIT_FACE_EXT_V_INCIDENCIAS, con el tipo, la serie, el número, la fecha, el cliente, el estado —O correcto, E error—, el motivo y la fecha de proceso. La forma prevista de consultarla es la vista SQL «Errores XML FACe (Ext)» que se da de alta en el ERP durante la instalación.
La traza está por defecto en C:\Logs, con un fichero por módulo, fecha, usuario y proceso. Subiendo SIT_FACE_EXT_NIVELTRAZA a 1 se registra el detalle de cada decisión: qué mapeo se aplicó, cuál se omitió y por qué.
Si el módulo no parece ejecutarse, la comprobación es el alta en la tabla DLLS de esa empresa concreta: el registro es por empresa, y una empresa nueva no lo hereda.
Límites conocidos#
Las líneas de kit. a3ERP escribe una línea de cabecera de kit y una línea por componente, pero al fichero de factura electrónica sólo emite la del kit. El módulo descarta los componentes para que el emparejamiento entre líneas de la factura y líneas del XML cuadre. Si el recuento no cuadra aun así, no aplica nada en las líneas y lo registra, en lugar de arriesgarse a colocar un dato en la línea equivocada.
Convivencia con VeriFactu. El diseño evita cualquier escritura en facturación y cualquier modificación de nodos fiscales, precisamente para no interferir con el registro de facturación. Queda pendiente de contrastar en una empresa con VeriFactu activo.
Convivencia con otras extensiones. El módulo aísla su traza y resuelve sus dependencias desde su propia carpeta para no interferir con otras extensiones cargadas en el mismo proceso. Pendiente de contrastar en una instalación con varias.