Te lo respondo en castellano y posteriormente lo copio abajo en ingles para el resto del mundo:
La manera de hacer lo que estas mencionando es con los callbacks de insert y update. Tenes 3 opciones:
1)Con callback_insert/update reemplazas la funcion de insert/update por defecto por una que definis vos... en esta simplemente haces los inserts que necesitas. (tenes la variable $post que te devuelve todos los campos del formulario).
2) Tambien podes dejar que una tabla la llene el GC con la funcion por defecto y llenar las otras dos con un callback_after_insert/update que corre despues del insert/update por defecto.
3) La tercer opcion es MUY parecida a la segunda, y es un callback_before_insert/update. Es basicamente lo mismo pero corre ANTES del insert/update (esto es util si la tabla que vas a dejar que se llene por defecto es la de union).
Ahora... esto es asumiendo que queres/necesitas insertar todos los datos dentro de un mismo formulario... si pudieras "dividirlos" lo mas practico seria que hagas un formulario para la empresa, uno para persona y en alguno de los 2 (o ambos) uses la funcion set_relation_n_n que basicamente lo que hace es llenar la tercer tabla (aunque la utilidad de esto depende de que vaya dentro de state).
Documentacion (para las funciones q menciono): http://www.grocerycrud.com/documentation/options_functions
Now in English:
This is the same as before (or at least tries to be...) , but in English:
There are 3 ways of doing what you are asking:
1)You have the callback_insert/update functions that replace the default GC insert/update with a user defined one. In this new function you just create the inserts that you need for your tables. (You have a $post variable with all the fields from the form).
2) You may also let GC handle the insert/update of one table and use callback_after_insert/update to fill the other 2. This callback runs AFTER the default GC insert.
3) The other way is very similar to the second one and it uses callbac_before_insert/update. This callback is basically the same as the previous one but it runs BEFORE the default GC insert/update (this is useful if you want to let GC handle the joining table).
Now... this is assuming that you want/need to insert all the info in just one form... If you could split them the easiest way to go would be to have 1 form for the enterprise (empresa), one for the person (persona) and then use set_relation_n_n in one (or both) of them. This last function basically handles the join table (3rd one). (Keep in mind that this might or might not be a possible solution depending on the values of the state field).
Documentation: http://www.grocerycrud.com/documentation/options_functions
There... Spanish and English, everybody happy :D