diff --git a/ecrire/public/compiler.php b/ecrire/public/compiler.php
index 79b475cfcf931d96458a39a4e25206979a45dc7d..aeed16648911f761ed796f2f77aa32195584ee80 100644
--- a/ecrire/public/compiler.php
+++ b/ecrire/public/compiler.php
@@ -695,31 +695,29 @@ function public_compiler_dist($squelette, $nom, $gram, $sourcefile) {
 	// tableau des informations sur le squelette
 	$descr = array('nom' => $nom, 'sourcefile' => $sourcefile);
 
-	// une boucle documents est conditionnee par tout le reste!
+	// Initialiser les champs necessaires a la compilation
+	// et signaler une boucle documents (les autres influent dessus)
 	foreach($boucles as $id => $boucle) {
 		$type = $boucle->type_requete;
 		if ($type != 'boucle') {
-		  $boucles[$id]->descr = &$descr;
-		  if (isset($table_des_tables[$type])) {
-		    $boucles[$id]->id_table = $x = $table_des_tables[$type];
-		    $boucles[$id]->primary = $tables_principales["spip_$x"]['key']["PRIMARY KEY"];
-		    if ((!$boucles[$id]->jointures)
-			AND (is_array($x = $tables_jointures['spip_' . $x])))
-		      $boucles[$id]->jointures = $x;
-		  } else if (isset($tables_auxiliaires['spip_' .$type])) {
-		  	// table auxiliaire
-		    $boucles[$id]->id_table = $type;
-		    $boucles[$id]->primary = $tables_auxiliaires['spip_' . $type]['key']["PRIMARY KEY"];
-		  } else {
-			// table non Spip.
-		    $boucles[$id]->id_table = $type;
-		    $serveur = $boucle->sql_serveur;
-		    $x = $tables_des_serveurs_sql[$serveur ? $serveur : 'localhost'][$type]['key'];		
-		    $boucles[$id]->primary = ($x["PRIMARY KEY"] ? $x["PRIMARY KEY"] : $x["KEY"]);
-		  }
+			$table = isset($table_des_tables[$type])
+			? $table_des_tables[$type]
+			: $type;
+			$show = trouver_def_table($table, $boucles[$id]);
+			if ($show) {
+				$nom_table = $show[0];
+				$show = $show[1]['key'];
+				$boucles[$id]->descr = &$descr;
+				$boucles[$id]->id_table = $table;
+				$boucles[$id]->primary = $show["PRIMARY KEY"];
+				if ((!$boucles[$id]->jointures)
+				AND (is_array($x = $tables_jointures[$nom_table])))
+					$boucles[$id]->jointures = $x;
+				spip_log("j $nom_table  $x $table");
+				if (($type == 'documents') && $boucle->doublons)
+					{ $descr['documents'] = true;  }
+			}
 		}
-		if (($boucle->type_requete == 'documents') && $boucle->doublons)
-			{ $descr['documents'] = true;  }
 	}
 	// Commencer par reperer les boucles appelees explicitement 
 	// car elles indexent les arguments de maniere derogatoire
diff --git a/ecrire/public/criteres.php b/ecrire/public/criteres.php
index 335d7909958e722773543bc6d15c9c0eaf3f009e..87e81a25b296e881f674ad474d0b44205c9e1cef 100644
--- a/ecrire/public/criteres.php
+++ b/ecrire/public/criteres.php
@@ -1048,7 +1048,8 @@ function trouver_def_table($nom, &$boucle)
 	  }
 	erreur_squelette(_T('zbug_table_inconnue', array('table' => $nom)),
 			 $boucle->id_boucle);
-	}
+	return false;
+}
 
 // http://doc.spip.org/@trouver_champ_exterieur
 function trouver_champ_exterieur($cle, $joints, &$boucle, $checkarrivee = false)