Por empezar déjenme decir algo.
En una facturación como en una contabilidad la función de eliminar físicamente un registro no es una opción. Es ILEGAL. No debe existir la posibilidad, via sistema, de que el usuario elimine estos registros.
En su lugar se anula la factura y se emite otra, y para un asiento contable mal confeccionado se ingresa un nuevo asiento (a veces llamado contra asiento) en que se detalle los movimientos correctivos.
Otra alternativa para tener en orden en las numeraciones es llevar una tabla adicional con la cuenta a modo de log o bitácora. De este modo se examina o consulta esta tabla para conocer el próximo ID y se procede a actualizar cuando finalice la operación.
La opción de leer el último registro como la que comenta Gaston en un ambiente C/S donde hay varios clientes en simultáneo puede traer problemas. Con la incorporación de esta tabla "CONTADORES" básicamente lo que se hace es que cada vez que un cliente va a insertar un nuevo registro incrementa el valor, y se lleva un control de quien pidió a que valor.
Por ejemplo, Pepito inició una nueva factura, lee la tabla y se le "asigna" a el la Factura 5. Luego está Ana y atiende a otro cliente, genera otra factura, y el sisteme le otorga el número 6. Pepito es un tipo lento... y Ana se lleva muy rápido con la PC, le gana y termina. Se ha materializado la Factura 6. El cliente que está con Pepito se arma de paciencia, y espera. Pepito confirma y se ha generado la factura 5. Ahora viene otro cliente, Pepito la tortuga lo atiende, el sistema le otorga el valor 7. Mientras tanto Ana ya se pone a atender a otro más, y ya el sistema detecta que debe darle el número 8. Ana nuevamente gana, se materializa la factura 8. Pepito se duerme en sus laureles, y el cliente se cansa y se va. Pepito ahora debe cancelar todo. Físicamente esto termina en la generación de la factura 7 anulada.
No hay huecos.
Ahora bien voy a decir algo que ya hace un tiempo había comentado: para crear los números de factura (o cualquier cosa que no permita huecos en su numeración) JAMAS se debe utilizar las sequencias (FB 2+) o generadores (FB 1.5-) debido a que éstos escapan a las transacciones. Una cancelación de la transacción no vuelve atrás a la sequencia o al generador. Esto es motivo para que queden huecos.
Como bien ha dicho Marc, la opción es postergar la asignación y creación físicamente de la factura en la base de datos sino es hasta que el usuario confirme. Mientras tanto, se trabaja con los datos "en memoria", o bien en una cache local y luego proceder a materializar la operación sobre la DB.
Saludos,