General accepted practice is to not move data around for 'archiving' purposes. Flag it as complete somehow - a date field is the best approach IMO. If date is null, it is a current record. If not, not only is it archived/complete/fini - you know when that happened. Your forms recordsources are then queries (which they should always be) which return only the applicable records. Multiple tables as you describe take up more overhead (file size) than a single table with all of the records. None of that even considers the possibility that a record might need to be un-archived, making this a pita.
This
run an update query to put each headerID in the appropriate detail.headerID field.
doesn't sound right. The subform detail records you create on a form should automatically link to the invoice header. Methinks you are doing something you shouldn't, like working directly in tables.
The more we hear silence, the more we begin to think about our value in this universe.
Paraphrase of Professor Brian Cox.