Los seis rechazos de la AEAT que te vas a comer (y cómo evitarlos)
No son los errores del manual. Son los que aparecen cuando ya crees que lo tienes terminado y Hacienda te devuelve un código de cuatro cifras sin explicación.
1110 · «El productor del SIF no consta»
Este llega cuando declaras el bloque SistemaInformatico. La AEAT no valida el NIF por
un lado y el nombre por otro: los contrasta juntos contra su censo. Si tu empresa
figura en Hacienda como KRAAKVC OU y tú envías tu marca comercial, el par no cuadra y el
envío se cae entero.
El campo NombreRazon del sistema informático es la razón social del fabricante
del software, no el nombre del programa. El nombre del programa va en
NombreSistemaInformatico, que es otro campo distinto. Confundirlos es el camino
más corto al 1110.
1177 · «Identificador del sistema informático incorrecto»
El campo IdSistemaInformatico admite dos caracteres. Ni tres, ni
seis, ni un identificador bonito tipo VFCO01. Dos.
Y hay una confusión habitual que conviene deshacer: ese identificador no te lo asigna la AEAT. Lo eliges tú y lo haces constar en tu declaración responsable. Nadie te va a mandar un código; lo inventas y lo declaras.
4104 · «Emisor no identificado»
El hermano del 1110, pero aplicado al obligado a emisión. La razón social del emisor tiene que ser exactamente la del censo de Hacienda: la que aparece en sus modelos fiscales, no el rótulo del local ni el nombre con el que factura de cara al público.
Es el motivo número uno de rechazo en producción, porque el dato lo introduce el usuario final en su ficha y nadie lo valida. Si tu software deja escribir el nombre a mano, avisa en la propia interfaz de que ahí va el nombre fiscal.
El formato de los importes (este no avisa)
Los tres anteriores son ruidosos: te rechazan el envío y te enteras. Este no.
La huella se calcula sobre una cadena de texto donde los importes van escritos de una forma
concreta. El XML que remites escribe esos mismos importes. Si los dos formatos no coinciden —por
ejemplo, la huella sobre 12 y el XML declarando 12.00— la AEAT recalcula
la huella desde el XML, no le cuadra con la que le has enviado, y marca el registro como
«Aceptado con errores».
No se pierde. No falla nada visible. Simplemente queda un defecto anotado en Hacienda, factura a factura, hasta que alguien lo mire.
La cadena bifurcada (este tampoco avisa)
Registrar una factura es leer el último registro de la cadena, calcular la huella nueva usando la suya, e insertar. Tres pasos.
Si dos facturas del mismo emisor se registran a la vez —dos puestos de TPV, una pestaña duplicada, un cron solapándose con un usuario— las dos leen el mismo registro anterior y las dos se encadenan a él. La cadena se bifurca.
Y aquí está lo importante: la huella es irreversible. No se recalcula. Para arreglarlo habría que rehacer el histórico entero, cosa que no se puede hacer con registros ya remitidos. El único momento de evitarlo es antes de que ocurra.
# Serializar la escritura en la cadena, por emisor
SELECT GET_LOCK('cadena_' + emisor_id, 10);
-- leer último registro
-- calcular huella
-- insertar
SELECT RELEASE_LOCK('cadena_' + emisor_id);
Un SELECT … FOR UPDATE sobre la fila anterior parece la solución natural, pero tiene
un agujero: cuando el emisor todavía no tiene ningún registro no hay fila que bloquear, y ese es
justamente uno de los casos en los que dos altas simultáneas se pisan.
El control de flujo del artículo 16
En cada respuesta, la AEAT te dice cuántos segundos debes esperar antes del siguiente envío
(TiempoEsperaEnvio). No es una sugerencia.
Si lo ignoras y sigues enviando, te encuentras con que el servicio deja de atenderte justo cuando más lo necesitas: en hora punta, con la cola llena. Guarda ese valor y respétalo, y diseña la cola asumiendo que a veces habrá que esperar.
Y uno de propina: el sello temporal
El campo FechaHoraHusoGenRegistro entra en el cálculo de la huella y tiene que ir en
ISO-8601 con huso horario (2026-08-04T11:10:20+02:00). Sin el huso, la
huella que calculas y la que calcula Hacienda no coinciden.
Más sutil: ese sello hay que guardarlo. Cuando montes el XML tienes que escribir exactamente el mismo instante que usaste al calcular la huella. Si lo regeneras al enviar —aunque sean dos segundos después— ya no cuadra.