Yes, the best practice is to have a button with a rule that has two submit actions and a query. First submit will submit it with your natural Now() key (also, make sure this value is stored somewhere in your form). Second action is the query - just query the library to get the SharePoint ID assigned to the form that you just submitted. Since you're using InfoPath 2003, you will need to query all rows and filter in the form (or you can use the FilterOwssvr approach to filter out only the one with the Now value that you just saved). Third action sets a field in your form equal to the SharePoint ID value in the secondary data source that you just queried. Finally, submit it again using same name as first time. You can change the columns of the library to make sure the ID appears. The form can also show the ID on the view since you now have it in the form.
The only downside of this approach is that when the data moves from one site to another, the IDs could change. Make sure you promote the IDs after you migrate to a new site so you can use it as a custom column if they don't match the auto-assigned values.