Retour à l'accueil

Problèmes d'architecture de configuration 1C pour les développeurs

L'article analyse les insuffisances architecturales et fonctionnelles des configurations 1C standard : de la liaison du code aux formulaires et des requêtes illisibles aux problèmes avec les rôles d'accès et le calcul du prix de revient. Exemples et recommandations d'amélioration pour les développeurs middle/senior.

Insuffisances 1C : de l'architecture à la fonctionnalité
Advertisement 728x90

Défauts critiques de l'architecture des configurations 1C standard

Les configurations standard 1C intègrent trop souvent la logique métier directement dans les formulaires, limitant ainsi l'exécution à l'environnement client. Les procédures des formulaires et des modules d'objets sont rarement marquées comme exportées, ce qui empêche toute invocation directe sans recourir à des extensions. Les fonctions sont fortement couplées et dépendent étroitement du contexte du formulaire, violant ainsi le principe d'isolation.

Voici quelques exemples typiques de ce couplage excessif :

  • L'import des relevés bancaires n'est possible qu'à partir d'un formulaire de liste ou d'un formulaire de document.
  • Le renseignement des coordonnées d'une organisation ou d'un tiers via le numéro d'identification fiscale est lié aux éléments d'interface, obligeant les développeurs à dupliquer le code lors de la création d'objets par programmation.

Cette approche architecturale entrave considérablement la réutilisation des modules et les tests.

Google AdInline article slot

Utilisation irrationnelle des appels serveur

Les développeurs 1C ont tendance à abuser des modules suffixés par _ServerCall_, ce qui entraîne la duplication des appels vers les mêmes procédures. Les fonctions des modules communs sont invoquées directement sur le serveur sans l'indicateur « Appel serveur », pour être ensuite rappelées via des modules proxy avec cet indicateur activé. Cette pratique alourdit inutilement la base de code.

La présence de dizaines de modules de ce type dans les configurations standard sature les développeurs. Une approche plus propre consisterait à simplement exporter les procédures côté serveur à l'aide du mot-clé Export, éliminant ainsi les enveloppes redondantes.

Des requêtes monolithiques au détriment d'un code lisible

L'extraction des données repose majoritairement sur des requêtes, même lorsque des méthodes d'objets suffiraient. Dans les modules de gestionnaires de documents, les requêtes génèrent les données d'impression, mais lors du calcul des mouvements de registres, elles se transforment en constructions illisibles, truffées de jointures et de branchements conditionnels.

Google AdInline article slot

Ce choix sacrifie la lisibilité au profit d'un style déclaratif, compliquant le débogage et les évolutions futures. Une meilleure alternative consiste à combiner les requêtes avec une logique impérative au sein des procédures.

Structures de données ambiguës

Lors de la génération de formulaires d'impression, plusieurs documents tabulaires sont souvent fusionnés en un seul, séparés par des zones (_Document1_, _Document2_) au lieu de transmettre de véritables collections. Ces structures de collection imitent des objets, mais la composition de leurs champs est fréquemment illogique, nécessitant un mappage manuel lors des personnalisations.

Chaînes asynchrones chaotiques

Les chaînes d'appels asynchrones dans 1C sont mal documentées : les noms des procédures manquent de contexte descriptif et les commentaires sont absents. Le débogage du traitement des tickets de caisse en est un exemple classique : une longue séquence d'appels sans point d'entrée clair.

Google AdInline article slot

La solution optimale consiste à implémenter une machine à états avec un paramètre d'état courant qui aiguille les appels en conséquence.

Exemple de pseudocode pour une machine à états :

Procedure ExecuteAction(CurrentStatus) Export
    If CurrentStatus = "Initialization" Then
        InitializeReceipt();
        TransitionToStatus("Forming");
    Else If CurrentStatus = "Forming" Then
        GenerateReceipt();
        TransitionToStatus("Printing");
    // Et ainsi de suite
    EndIf;
EndProcedure

Absence de débogage sécurisé

Les opérations critiques, comme l'interaction avec les registres de caisse, ne prennent pas en charge l'émulation des réponses. Le code s'attend à un retour matériel réel, excluant ainsi tout test virtuel. Cela augmente considérablement les risques lors du développement et de l'intégration.

Nomenclature instable et refactoring hasardeux

Les objets applicatifs, modules et champs sont fréquemment renommés, parfois préfixés par _Delete_. Une recherche de _Delete_ dans la configuration renvoie des centaines de résultats. La terminologie telle que « partenaires/tiers/acheteurs » est incohérente, et les entités (par exemple, les contrats d'acquisition) sont constamment fusionnées ou scindées.

Cette approche reflète des décisions architecturales impulsives, obligeant les développeurs à perdre un temps précieux à migrer les références.

Interfaces incohérentes

Les éléments d'interface utilisent des conventions de nommage très variables : un bouton d'ajout dans une partie tabulaire peut s'appeler _InventoryAdd ou simplement _Add. La colonne de droite d'un document pourrait être _RightColumn ou _HeaderRight. Cette incohérence entrave l'automatisation et le développement d'extensions.

Algorithmes inefficaces

Malgré un accent fort sur les performances, la base de code souffre d'un gonflement significatif. Lors de l'impression des factures, tous les modèles sont préchargés d'emblée, alors que seuls quelques-uns sont nécessaires. Un cache à la demande réduirait la surcharge dans 99 % des cas.

Fonctionnalités HTTP dupliquées

Différentes équipes implémentent des requêtes HTTP de manière isolée (pour les services bancaires directs, la synchronisation de sites web, etc.) sans point d'interception unifié. Il n'existe aucun proxy standardisé pour une configuration centralisée.

Défauts fonctionnels

Les solutions standard échouent souvent dans des scénarios réels en raison d'hypothèses trop simplistes formulées par les architectes système.

Problèmes de calcul des coûts

Le passage à une clôture mensuelle fonctionne pour la grande industrie, mais crée des goulots d'étranglement pour le commerce de détail et les PME : les soldes négatifs à la fin de la période bloquent entièrement le calcul des coûts.

Limitations matérielles

Interdire l'utilisation de deux caisses sur un seul poste de travail est un exemple flagrant d'obstacle aux optimisations favorables à l'entreprise.

Comptabilisation incorrecte des bonus

Les bonus à date d'expiration nécessitent un suivi par lot, mais 1C utilise par défaut des méthodes de moyenne, ce qui entraîne des erreurs de calcul. La version 2.5 aggrave le problème, rendant la fonctionnalité inutilisable sans une réécriture complète.

Modèle de droits d'accès obsolète

Les rôles s'appuient sur des cases à cocher statiques, ignorant l'exécution dynamique du code. Les droits d'accès complets incluent par inadvertance des privilèges administratifs, permettant aux utilisateurs standards de créer des comptes ou de télécharger l'intégralité de la base de données.

Points clés à retenir

  • Rigidité architecturale : Le couplage fort avec les formulaires et le contexte limite considérablement la réutilisation.
  • Duplication du code : Les modules _ServerCall_ multiplient inutilement la logique.
  • Requêtes illisibles : Des requêtes monolithiques remplacent des méthodes d'objets propres.
  • Absence de prise en charge de l'émulation : Il est impossible de tester les opérations fiscales de manière isolée.
  • Nomenclature instable : Des centaines d'éléments _Delete_ compliquent la maintenance à long terme.

— Editorial Team

Advertisement 728x90

Lire ensuite