{"id":32465,"date":"2019-10-31T21:47:12","date_gmt":"2019-10-31T18:47:12","guid":{"rendered":"https:\/\/prohoster.info\/blog\/pro-veb-klient-1s\/"},"modified":"2026-05-20T19:17:21","modified_gmt":"2026-05-20T17:17:21","slug":"pro-veb-klient-1s__trashed","status":"publish","type":"post","link":"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/pro-veb-klient-1s__trashed","title":{"rendered":"\u00c0 propos du client Web 1C","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>L'une des caract\u00e9ristiques agr\u00e9ables de la technologie 1C:Entreprise est que la solution applicative, d\u00e9velopp\u00e9e selon la technologie des formulaires g\u00e9r\u00e9s, peut \u00eatre lanc\u00e9e \u00e0 la fois dans un client l\u00e9ger (ex\u00e9cutable) sous Windows, Linux, MacOS X, et comme client web sous 5 navigateurs \u2013 Chrome, Internet Explorer, Firefox, Safari, Edge \u2013 et tout cela sans modification du code source de l'application. De plus, l'application en client l\u00e9ger et dans le navigateur fonctionne et appara\u00eet pratiquement de mani\u00e8re identique.<br \/>\nTrouvez 10 diff\u00e9rences (2 images sous le pli) :<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nFen\u00eatre du client l\u00e9ger sur Linux :<\/p>\n<p><img decoding=\"async\" alt=\"\u00c0 propos du client Web 1C\" src=\"\/wp-content\/uploads\/2019\/04\/6a836d01f80f447302e04d1827d5eebb.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nLa m\u00eame fen\u00eatre dans le client web (dans le navigateur Chrome) :<\/p>\n<p><img decoding=\"async\" alt=\"\u00c0 propos du client Web 1C\" src=\"\/wp-content\/uploads\/2019\/04\/1cab8bdf0d9d1c9d6601219c3ae6018c.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nPourquoi avons-nous cr\u00e9\u00e9 le client web ? Pour dire les choses de mani\u00e8re un peu pompeuse, cette t\u00e2che nous a \u00e9t\u00e9 impos\u00e9e par le temps. Cela fait longtemps que le travail via Internet est devenu une condition n\u00e9cessaire pour les applications professionnelles. Au d\u00e9but, nous avons ajout\u00e9 la possibilit\u00e9 de travailler via Internet pour notre client l\u00e9ger (certains de nos concurrents, d'ailleurs, se sont arr\u00eat\u00e9s l\u00e0 ; d'autres, au contraire, ont abandonn\u00e9 le client l\u00e9ger et se sont limit\u00e9s \u00e0 la mise en \u0153uvre du client web). Nous avons d\u00e9cid\u00e9 de donner \u00e0 nos utilisateurs la possibilit\u00e9 de choisir l'option de client qui leur convient le mieux.<\/p>\n<p><img decoding=\"async\" alt=\"\u00c0 propos du client Web 1C\" src=\"\/wp-content\/uploads\/2019\/04\/345d070d695cfc4854c485148d22d24c.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nL'ajout de la possibilit\u00e9 de travailler via Internet pour le client l\u00e9ger \u00e9tait un grand projet avec un changement complet de l'architecture de l'interaction client-serveur. Cr\u00e9er le client web, c'est un projet compl\u00e8tement nouveau, commenc\u00e9 from scratch.<\/p>\n<h3>D\u00e9finition du probl\u00e8me<\/h3>\n<p>\nAinsi, les exigences du projet sont : le client web doit faire la m\u00eame chose que le client l\u00e9ger, \u00e0 savoir :<\/p>\n<ol>\n<li>Afficher l'interface utilisateur<\/li>\n<li>Ex\u00e9cuter le code client \u00e9crit dans le langage 1C<\/li>\n<\/ol>\n<p>\nL'interface utilisateur dans 1C est d\u00e9crite dans un \u00e9diteur visuel, mais de mani\u00e8re d\u00e9clarative, sans placement pixel par pixel des \u00e9l\u00e9ments ; environ une trentaine de types d'\u00e9l\u00e9ments d'interface sont utilis\u00e9s \u2014 boutons, champs de saisie (textes, num\u00e9riques, date\/heure), listes, tableaux, graphiques, etc. <\/p>\n<p>Le code client en langage 1C peut contenir des appels serveur, travailler avec des ressources locales (fichiers, etc.), imprimer et bien d'autres choses.<\/p>\n<p>Tant le client l\u00e9ger (lorsqu'il est utilis\u00e9 via le web) que le client web utilisent le m\u00eame ensemble de services web pour communiquer avec le serveur d'applications 1C. La mise en \u0153uvre pour les clients est, bien s\u00fbr, diff\u00e9rente \u2013 le client l\u00e9ger est \u00e9crit en C++, le client web est en JavaScript.<\/p>\n<h3>Un peu d'histoire<\/h3>\n<p>\nLe projet de cr\u00e9ation d'un client web a d\u00e9but\u00e9 en 2006, avec une \u00e9quipe d'environ 5 personnes en moyenne. \u00c0 diff\u00e9rentes \u00e9tapes du projet, des d\u00e9veloppeurs ont \u00e9t\u00e9 engag\u00e9s pour mettre en \u0153uvre des fonctionnalit\u00e9s sp\u00e9cifiques (documents tableurs, diagrammes, etc.); en r\u00e8gle g\u00e9n\u00e9rale, ce \u00e9taient les m\u00eames d\u00e9veloppeurs qui avaient con\u00e7u ces fonctionnalit\u00e9s dans le client l\u00e9ger. C'est-\u00e0-dire que les d\u00e9veloppeurs ont r\u00e9\u00e9crit en JavaScript les composants qu'ils avaient auparavant cr\u00e9\u00e9s en C++.<\/p>\n<p>D\u00e8s le d\u00e9part, nous avons rejet\u00e9 l'id\u00e9e d'une conversion automatique (m\u00eame partielle) du code C++ du client l\u00e9ger en JavaScript pour le client web en raison des fortes diff\u00e9rences conceptuelles entre ces deux langages; le client web a \u00e9t\u00e9 \u00e9crit en JavaScript \u00e0 partir de z\u00e9ro.<\/p>\n<p>Lors des premi\u00e8res it\u00e9rations du projet, le client web convertissait le code client \u00e9crit en 1C dans JavaScript. Le client l\u00e9ger fonctionne diff\u00e9remment: le code en 1C est compil\u00e9 en bytecode, puis ce bytecode est interpr\u00e9t\u00e9 c\u00f4t\u00e9 client. Par la suite, le client web a adopt\u00e9 ce m\u00eame processus \u2013 d'une part, cela a am\u00e9lior\u00e9 les performances, d'autre part, cela a permis d'unifier l'architecture des clients l\u00e9ger et web.<\/p>\n<p>La premi\u00e8re version de la plateforme 1C:Entreprise avec un client web a \u00e9t\u00e9 publi\u00e9e en 2009. \u00c0 l'\u00e9poque, le client web supportait 2 navigateurs \u2013 Internet Explorer et Firefox. Les plans initiaux incluaient la prise en charge d'Opera, mais en raison de probl\u00e8mes insurmontables avec les gestionnaires de fermeture d'application dans Opera (il \u00e9tait impossible de suivre avec 100 % de certitude si l'application se fermait, et \u00e0 ce moment-l\u00e0 d'effectuer la proc\u00e9dure de d\u00e9connexion du serveur d'applications 1C), ces plans ont d\u00fb \u00eatre abandonn\u00e9s.<\/p>\n<h3>Structure du projet<\/h3>\n<p>\nIl y a au total 4 projets dans la plateforme 1C:Entreprise, \u00e9crits en JavaScript:<\/p>\n<ol>\n<li>WebTools \u2013 biblioth\u00e8ques communes utilis\u00e9es par les autres projets (nous incluons \u00e9galement ici <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Google_Closure_Tools#Closure_Library\">Google Closure Library<\/a><\/noindex>).<\/li>\n<li>\u00c9l\u00e9ment de contr\u00f4le <noindex><a rel=\"nofollow\" href=\"http:\/\/v8.1c.ru\/overview\/Term_000000785.htm\">Document format\u00e9<\/a><\/noindex> (r\u00e9alis\u00e9 en JavaScript tant dans le client l\u00e9ger que dans le client web)<\/li>\n<li>\u00c9l\u00e9ment de contr\u00f4le <noindex><a rel=\"nofollow\" href=\"https:\/\/wonderland.v8.1c.ru\/blog\/planirovshchik\/\">Planificateur<\/a><\/noindex> (r\u00e9alis\u00e9 en JavaScript tant dans le client l\u00e9ger que dans le client web)<\/li>\n<li>Un client web<\/li>\n<\/ol>\n<p>\nLa structure de chaque projet ressemble \u00e0 celle des projets Java (ou des projets .NET \u2013 selon les pr\u00e9f\u00e9rences); nous avons des namespaces, et chaque namespace est dans un dossier s\u00e9par\u00e9. \u00c0 l'int\u00e9rieur de chaque dossier se trouvent les fichiers et les classes du namespace. Le projet du client web contient environ 1000 fichiers.<\/p>\n<p>Structurellement, le client web est principalement divis\u00e9 en les sous-syst\u00e8mes suivants:<\/p>\n<ul>\n<li>Interface g\u00e9r\u00e9e de l'application cliente\n<ul>\n<li>Interface g\u00e9n\u00e9ral de l'application (menus syst\u00e8me, panneaux)<\/li>\n<li>Interface des formulaires g\u00e9r\u00e9s, comprenant notamment environ 30 \u00e9l\u00e9ments de contr\u00f4le (boutons, diff\u00e9rents types de champs d'entr\u00e9e \u2013 texte, num\u00e9rique, date\/heure, etc., tableaux, listes, graphiques, etc.)<\/li>\n<\/ul>\n<p>\n<\/li>\n<li>Mod\u00e8le d'objet accessible aux d\u00e9veloppeurs c\u00f4t\u00e9 client (plus de 400 types au total : mod\u00e8le d'objet d'interface g\u00e9r\u00e9e, param\u00e8tres de mise en page des donn\u00e9es, mise en forme conditionnelle, etc.)<\/li>\n<li>Interpr\u00e9teur du langage embarqu\u00e9 1C<\/li>\n<li>Extensions de navigateur (utilis\u00e9es pour des fonctionnalit\u00e9s non prises en charge par JavaScript)\n<ul>\n<li>Travail avec la cryptographie<\/li>\n<li>Travailler avec des fichiers<\/li>\n<li>Technologie des composants externes, permettant de les utiliser \u00e0 la fois dans le client l\u00e9ger et le client Web<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p><\/p>\n<h3>Particularit\u00e9s du d\u00e9veloppement<\/h3>\n<p>\nLa mise en \u0153uvre de tout ce qui pr\u00e9c\u00e8de en JavaScript n'est pas une t\u00e2che facile. Peut-\u00eatre que le client Web 1C est l'une des plus grandes applications c\u00f4t\u00e9 client \u00e9crites en JavaScript \u2013 environ 450 000 lignes. Nous utilisons activement dans le code du client Web une approche orient\u00e9e objet qui simplifie le travail avec un projet aussi vaste.<\/p>\n<p>Pour minimiser la taille du code client, nous avons d'abord utilis\u00e9 notre propre obfuscateur, et depuis la version 8.3.6 de la plateforme (octobre 2014), nous utilisons <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Google_Closure_Tools#Closure_Compiler\">Google Closure Compiler<\/a><\/noindex>. L'effet de cette utilisation en chiffres \u2013 la taille du framework du client Web apr\u00e8s obfuscation :<\/p>\n<ul>\n<li>Notre propre obfuscateur \u2013 1556 Ko<\/li>\n<li>Google Closure Compiler \u2013 1073 Ko<\/li>\n<\/ul>\n<p>\nL'utilisation de Google Closure Compiler nous a permis d'am\u00e9liorer la performance du client Web de 30 % par rapport \u00e0 notre propre obfuscateur. De plus, la consommation m\u00e9moire de l'application a diminu\u00e9 de 15 \u00e0 25 % (selon le navigateur).<\/p>\n<p>Google Closure Compiler fonctionne tr\u00e8s bien avec du code orient\u00e9 objet, donc son efficacit\u00e9 pour le client Web est maximale. Closure Compiler nous fournit plusieurs avantages :<\/p>\n<ul>\n<li>V\u00e9rification statique des types au moment de la construction du projet (assur\u00e9e par le fait que nous compl\u00e9tons le code avec des annotations JSDoc). Le r\u00e9sultat est une typage statique tr\u00e8s proche de celui en C++. Cela aide \u00e0 attraper un pourcentage assez \u00e9lev\u00e9 d'erreurs lors de la compilation du projet.<\/li>\n<li>R\u00e9duction de la taille du code par obfuscation<\/li>\n<li>Un certain nombre d'optimisations du code ex\u00e9cut\u00e9, par exemple, telles que :\n<ul>\n<li>remplacements inline des fonctions. Appeler une fonction en JavaScript est une op\u00e9ration relativement co\u00fbteuse, et les remplacements inline de petites m\u00e9thodes couramment utilis\u00e9es acc\u00e9l\u00e8rent consid\u00e9rablement le code.<\/li>\n<li>Calcul des constantes \u00e0 la compilation. Si une expression d\u00e9pend d'une constante, la valeur r\u00e9elle de la constante sera substitu\u00e9e.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>\nPour le d\u00e9veloppement du client web, nous utilisons WebStorm.<\/p>\n<p>Pour l'analyse du code, nous utilisons <noindex><a rel=\"nofollow\" href=\"http:\/\/www.sonarqube.org\/\">SonarQube<\/a><\/noindex>, o\u00f9 nous int\u00e9grons des analyseurs de code statiques. Gr\u00e2ce \u00e0 ces analyseurs, nous surveillons la d\u00e9gradation de la qualit\u00e9 du code source en JavaScript et nous faisons en sorte de l'\u00e9viter.<\/p>\n<p><img decoding=\"async\" alt=\"\u00c0 propos du client Web 1C\" src=\"\/wp-content\/uploads\/2019\/04\/886fe89a8c12d29d940b6b59316ea627.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3>Quelles t\u00e2ches avons-nous r\u00e9solues\/r\u00e9solvons-nous<\/h3>\n<p>\nAu cours de la mise en \u0153uvre du projet, nous avons \u00e9t\u00e9 confront\u00e9s \u00e0 plusieurs t\u00e2ches int\u00e9ressantes que nous avons d\u00fb r\u00e9soudre.<\/p>\n<h4>\u00c9change de donn\u00e9es avec le serveur et entre les fen\u00eatres<\/h4>\n<p>\nIl existe des situations o\u00f9 l'obfuscation du code source peut entraver le fonctionnement du syst\u00e8me. Le code externe par rapport au code ex\u00e9cutable du client web, \u00e0 cause de l'obfuscation, peut avoir des noms de fonctions et de param\u00e8tres diff\u00e9rents de ceux que notre code ex\u00e9cutable attend. Pour nous, le code externe est :<\/p>\n<ul>\n<li>Le code qui arrive du serveur sous forme de structures de donn\u00e9es<\/li>\n<li>Le code d'une autre fen\u00eatre de l'application<\/li>\n<\/ul>\n<p>\nPour \u00e9viter l'obfuscation lors de l'interaction avec le serveur, nous utilisons la balise @expose :<\/p>\n<pre><code class=\"javascript\">\/**\n * @constructor\n * @extends {Base.SrvObject}\n *\/\nSrv.Core.GenericException = function ()\n{\n    \/**\n     * @type {string}\n     * @expose\n     *\/\n    this.descr;\n\n    \/**\n     * @type {Srv.Core.GenericException}\n     * @expose\n     *\/\n    this.inner;\n\n    \/**\n     * @type {string}\n     * @expose\n     *\/\n    this.clsid;\n\n    \/**\n     * @type {boolean}\n     * @expose\n     *\/\n    this.encoded;\n}<\/code><\/pre>\n<p>\nEt pour \u00e9viter l'obfuscation lors de l'interaction avec d'autres fen\u00eatres, nous utilisons ce que l'on appelle des interfaces exportables (interfaces dont toutes les m\u00e9thodes sont exportables).<\/p>\n<pre><code class=\"javascript\">\/**\n * \u042d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u043c\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u0430 DropDownWindow\n *\n * @interface\n * @struct\n *\/\nWebUI.IDropDownWindowExp = function(){}\n\n\/**\n * \u041f\u0435\u0440\u0435\u043c\u0435\u0449\u0430\u0435\u0442 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043d\u0430 1 \u0432\u043f\u0435\u0440\u0435\u0434 \u0438\u043b\u0438 \u043d\u0430\u0437\u0430\u0434\n *\n * @param {boolean} isForward\n * @param {boolean} checkOnly\n * @return {boolean}\n * @expose\n *\/\nWebUI.IDropDownWindowExp.prototype.moveMarker = function (isForward, checkOnly){}\n\n\/**\n * \u041f\u0435\u0440\u0435\u043c\u0435\u0449\u0430\u0435\u0442 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0432 \u043d\u0430\u0447\u0430\u043b\u043e \u0438\u043b\u0438 \u043a\u043e\u043d\u0435\u0446\n *\n * @param {boolean} isFirst\n * @param {boolean} checkOnly\n * @return {boolean}\n * @expose\n *\/\nWebUI.IDropDownWindowExp.prototype.moveMarkerTo = function (isFirst, checkOnly){}\n\n\/**\n * @return {boolean}\n * @expose\n *\/\nWebUI.IDropDownWindowExp.prototype.selectValue = function (){}<\/code><\/pre>\n<h4>Nous avons utilis\u00e9 le Virtual DOM avant qu'il ne devienne courant)<\/h4>\n<p>\nComme tous les d\u00e9veloppeurs traitant avec des interfaces utilisateur web complexes, nous avons rapidement compris que le DOM ne convient pas au travail avec une interface utilisateur dynamique. Tr\u00e8s rapidement, un \u00e9quivalent du Virtual DOM a \u00e9t\u00e9 mis en \u0153uvre pour optimiser le travail avec l'UI. Lors du traitement d'un \u00e9v\u00e9nement, toutes les modifications du DOM sont enregistr\u00e9es en m\u00e9moire et, seulement \u00e0 la fin de toutes les op\u00e9rations, les modifications accumul\u00e9es sont appliqu\u00e9es \u00e0 l'arbre DOM.<\/p>\n<h4>Optimisation de l'efficacit\u00e9 du client web<\/h4>\n<p>\nPour que notre client web fonctionne plus rapidement, nous essayons d'exploiter au maximum les capacit\u00e9s natives du navigateur (CSS, etc.). Ainsi, la barre de commande du formulaire (pr\u00e9sente dans presque tous les formulaires de l'application) est rendue exclusivement avec les outils du navigateur, gr\u00e2ce \u00e0 une mise en page dynamique bas\u00e9e sur CSS.<\/p>\n<p><img decoding=\"async\" alt=\"\u00c0 propos du client Web 1C\" src=\"\/wp-content\/uploads\/2019\/04\/116261ca79218eaa2bee9a4f5104092b.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h4>Test<\/h4>\n<p>\nPour les tests fonctionnels et de performance, nous utilisons un outil d\u00e9velopp\u00e9 en interne (\u00e9crit en Java et C++), ainsi qu'un ensemble de tests bas\u00e9 sur <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/Selenium\">Selenium<\/a><\/noindex>.<\/p>\n<p>Notre outil est polyvalent : il permet de tester pratiquement toutes les applications de bureau, ce qui le rend adapt\u00e9 pour tester \u00e0 la fois les clients lourds et les clients web. L'outil enregistre les actions de l'utilisateur ayant lanc\u00e9 l'application \u00ab 1C \u00bb dans un fichier de script. En m\u00eame temps, des images de l'interface utilisateur sont captur\u00e9es \u2013 les r\u00e9f\u00e9rences. Lors du contr\u00f4le des nouvelles versions du client web, les sc\u00e9narios sont ex\u00e9cut\u00e9s sans intervention de l'utilisateur. En cas de non-conformit\u00e9 entre la capture d'\u00e9cran et la r\u00e9f\u00e9rence \u00e0 un moment donn\u00e9, le test est consid\u00e9r\u00e9 comme \u00e9chou\u00e9, apr\u00e8s quoi un sp\u00e9cialiste qualit\u00e9 enqu\u00eate \u2013 il s'agit d'une erreur ou d'un changement de comportement pr\u00e9vu du syst\u00e8me. En cas de comportement pr\u00e9vu, les r\u00e9f\u00e9rences sont automatiquement remplac\u00e9es par de nouvelles.<\/p>\n<p>L'outil mesure \u00e9galement la performance des applications avec une pr\u00e9cision de 25 millisecondes. Dans certains cas, nous r\u00e9p\u00e9tons des parties du sc\u00e9nario (par exemple, la saisie d'une commande plusieurs fois) pour analyser la d\u00e9gradation des temps d'ex\u00e9cution au fil du temps. Tous les r\u00e9sultats des mesures sont enregistr\u00e9s dans un journal pour analyse.<\/p>\n<p><img decoding=\"async\" alt=\"\u00c0 propos du client Web 1C\" src=\"\/wp-content\/uploads\/2019\/04\/058bab976becf6fd38b2ec668492043b.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<b>Notre outil de test et l'application test\u00e9e<\/b><\/p>\n<p>Notre outil et Selenium se compl\u00e8tent ; par exemple, si un bouton sur l'un des \u00e9crans change de position, Selenium peut ne pas le d\u00e9tecter, mais notre outil le remarquera, car il effectue une comparaison pixel par pixel de la capture d'\u00e9cran avec la r\u00e9f\u00e9rence. De plus, l'outil est capable de d\u00e9tecter des probl\u00e8mes de traitement des entr\u00e9es au clavier ou \u00e0 la souris, puisqu'il les reproduit.<\/p>\n<p>Les tests sur les deux outils (le n\u00f4tre et Selenium) ex\u00e9cutent des sc\u00e9narios types de fonctionnement \u00e0 partir de nos solutions applicatives. Les tests sont automatiquement lanc\u00e9s apr\u00e8s la compilation quotidienne de la plateforme \u00ab 1C:Enterprise \u00bb. En cas de ralentissement des sc\u00e9narios (par rapport \u00e0 la compilation pr\u00e9c\u00e9dente), nous menons une enqu\u00eate et \u00e9liminons la cause de ce ralentissement. Notre crit\u00e8re est simple : la nouvelle compilation ne doit pas \u00eatre plus lente que la pr\u00e9c\u00e9dente.<\/p>\n<p>Pour enqu\u00eater sur les incidents de ralentissement, les d\u00e9veloppeurs utilisent diff\u00e9rents outils ; principalement, il est utilis\u00e9 <noindex><a rel=\"nofollow\" href=\"http:\/\/apmblog.dynatrace.com\/2014\/12\/11\/dynatrace-ajax-edition-4-5-last-page-chapter-yet-story-continues\/\">Dynatrace AJAX Edition<\/a><\/noindex> de la soci\u00e9t\u00e9 <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Dynatrace\">DynaTrace<\/a><\/noindex>. L'enregistrement des journaux des op\u00e9rations probl\u00e9matiques est effectu\u00e9 \u00e0 la fois sur l'ancienne et la nouvelle version, puis les journaux sont analys\u00e9s. Dans ce cas, le temps d'ex\u00e9cution des op\u00e9rations individuelles (en millisecondes) peut ne pas \u00eatre un facteur d\u00e9cisif \u2013 le navigateur ex\u00e9cute p\u00e9riodiquement des processus de maintenance comme le nettoyage, ce qui peut interf\u00e9rer avec le temps d'ex\u00e9cution des fonctions et fausser les r\u00e9sultats. Les param\u00e8tres plus pertinents dans ce cas seront le nombre d'instructions JavaScript ex\u00e9cut\u00e9es, le nombre d'op\u00e9rations atomiques sur le DOM, etc. Si le nombre d'instructions\/op\u00e9rations dans le m\u00eame sc\u00e9nario augmente dans la nouvelle version, cela signifie presque toujours une d\u00e9gradation des performances qui doit \u00eatre corrig\u00e9e.<\/p>\n<p>Une autre raison de la baisse des performances peut \u00eatre le fait que Google Closure Compiler n'a pas pu effectuer le remplacement en ligne de la fonction (par exemple, parce que la fonction est r\u00e9cursive ou virtuelle). Dans ce cas, nous essayons de r\u00e9soudre le probl\u00e8me en r\u00e9\u00e9crivant le code source.<\/p>\n<h3>Extensions de navigateur<\/h3>\n<p>\nLorsque l'application n\u00e9cessite une fonctionnalit\u00e9 qui n'est pas disponible dans JavaScript, nous utilisons des extensions de navigateur :<\/p>\n<ul>\n<li>pour travailler avec des fichiers<\/li>\n<li>pour travailler avec la cryptographie<\/li>\n<li>interagir avec <noindex><a rel=\"nofollow\" href=\"http:\/\/v8.1c.ru\/overview\/Term_000000545.htm\">composants externes<\/a><\/noindex><\/li>\n<\/ul>\n<p>\nNos extensions se composent de deux parties. La premi\u00e8re partie est ce que l'on appelle une extension de navigateur (g\u00e9n\u00e9ralement des extensions \u00e9crites en JavaScript pour Chrome et Firefox), qui interagit avec la seconde partie \u2014 l'extension binaire, r\u00e9alisant la fonctionnalit\u00e9 dont nous avons besoin. Il convient de mentionner que nous \u00e9crivons 3 versions d'extensions binaires \u2013 pour Windows, Linux et MacOS. L'extension binaire est fournie avec la plateforme 1C:Entreprise et se trouve sur le serveur des applications 1C. Lors de la premi\u00e8re invocation depuis le client web, elle est t\u00e9l\u00e9charg\u00e9e sur l'ordinateur client et install\u00e9e dans le navigateur.<\/p>\n<p>Lors de l'utilisation de Safari, nos extensions utilisent NPAPI, tandis qu'avec Internet Explorer, elles utilisent la technologie ActiveX. <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/Microsoft_Edge\">Microsoft Edge<\/a><\/noindex> ne prend pas encore en charge les extensions, donc le client web fonctionne avec des limitations.<\/p>\n<h3>D\u00e9veloppement futur<\/h3>\n<p>\nUn des groupes de t\u00e2ches pour l'\u00e9quipe de d\u00e9veloppement du client web est d'am\u00e9liorer les fonctionnalit\u00e9s. Les fonctionnalit\u00e9s du client web doivent \u00eatre identiques \u00e0 celles du client l\u00e9ger, toutes les nouvelles fonctionnalit\u00e9s \u00e9tant mises en \u0153uvre simultan\u00e9ment dans les deux versions.<\/p>\n<p>D'autres t\u00e2ches consistent \u00e0 d\u00e9velopper l'architecture, refactoriser, am\u00e9liorer les performances et la fiabilit\u00e9. Par exemple, l'une des directions est de s'orienter davantage vers un mod\u00e8le de travail asynchrone. Une partie des fonctionnalit\u00e9s du client web est actuellement bas\u00e9e sur un mod\u00e8le d'interaction synchrone avec le serveur. Le mod\u00e8le asynchrone devient de plus en plus pertinent dans les navigateurs (et pas seulement dans les navigateurs), ce qui nous pousse \u00e0 modifier le client web en rempla\u00e7ant les appels synchrones par des appels asynchrones (et \u00e0 refactoriser le code en cons\u00e9quence). La transition progressive vers le mod\u00e8le asynchrone s'explique par la n\u00e9cessit\u00e9 de supporter les solutions d\u00e9j\u00e0 publi\u00e9es et leur adaptation progressive.<br \/>\n<br \/>Source : <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/1c\/blog\/315414\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041e\u0434\u043d\u043e\u0439 \u0438\u0437 \u043f\u0440\u0438\u044f\u0442\u043d\u044b\u0445 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0435\u0439 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0438 1\u0421:\u041f\u0440\u0435\u0434\u043f\u0440\u0438\u044f\u0442\u0438\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0442\u043e, \u0447\u0442\u043e \u043f\u0440\u0438\u043a\u043b\u0430\u0434\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435, \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u043e\u0435 \u043f\u043e \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c\u044b\u0445 \u0444\u043e\u0440\u043c, \u043c\u043e\u0436\u0435\u0442 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c\u0441\u044f \u043a\u0430\u043a \u0432 \u0442\u043e\u043d\u043a\u043e\u043c (\u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u043c\u043e\u043c) \u043a\u043b\u0438\u0435\u043d\u0442\u0435 \u043f\u043e\u0434 Windows, Linux, MacOS X, \u0442\u0430\u043a \u0438 \u043a\u0430\u043a \u0432\u0435\u0431-\u043a\u043b\u0438\u0435\u043d\u0442 \u043f\u043e\u0434 5 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u043e\u0432 \u2013 Chrome, Internet Explorer, Firefox, Safari, Edge, \u0438 \u0432\u0441\u0435 \u044d\u0442\u043e \u2013 \u0431\u0435\u0437 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u0411\u043e\u043b\u0435\u0435 \u0442\u043e\u0433\u043e \u2013 \u0432\u043d\u0435\u0448\u043d\u0435 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":24269,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-32465","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.2 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041e\u0434\u043d\u043e\u0439 \u0438\u0437 \u043f\u0440\u0438\u044f\u0442\u043d\u044b\u0445 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0435\u0439 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0438 1\u0421:\u041f\u0440\u0435\u0434\u043f\u0440\u0438\u044f\u0442\u0438\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0442\u043e, \u0447\u0442\u043e \u043f\u0440\u0438\u043a\u043b\u0430\u0434\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435, \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u043e\u0435 \u043f\u043e \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c\u044b\u0445 \u0444\u043e\u0440\u043c, \u043c\u043e\u0436\u0435\u0442 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c\u0441\u044f \u043a\u0430\u043a \u0432 \u0442\u043e\u043d\u043a\u043e\u043c (\u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u043c\u043e\u043c) \u043a\u043b\u0438\u0435\u043d\u0442\u0435 \u043f\u043e\u0434 Windows, Linux, MacOS.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/pro-veb-klient-1s__trashed\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2\" \/>\n\t\t<meta property=\"og:locale\" content=\"fr_FR\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u041f\u0440\u043e \u0432\u0435\u0431-\u043a\u043b\u0438\u0435\u043d\u0442 1\u0421 | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041e\u0434\u043d\u043e\u0439 \u0438\u0437 \u043f\u0440\u0438\u044f\u0442\u043d\u044b\u0445 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0435\u0439 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0438 1\u0421:\u041f\u0440\u0435\u0434\u043f\u0440\u0438\u044f\u0442\u0438\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0442\u043e, \u0447\u0442\u043e \u043f\u0440\u0438\u043a\u043b\u0430\u0434\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435, \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u043e\u0435 \u043f\u043e \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c\u044b\u0445 \u0444\u043e\u0440\u043c, \u043c\u043e\u0436\u0435\u0442 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c\u0441\u044f \u043a\u0430\u043a \u0432 \u0442\u043e\u043d\u043a\u043e\u043c (\u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u043c\u043e\u043c) \u043a\u043b\u0438\u0435\u043d\u0442\u0435 \u043f\u043e\u0434 Windows, Linux, MacOS.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/pro-veb-klient-1s__trashed\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2019-10-31T18:47:12+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2026-05-20T17:17:21+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47\u00c0 propos du client web 1C | ProHoster","description":"L'un des avantages int\u00e9ressants de la technologie 1C:Enterprise est que la solution applicative d\u00e9velopp\u00e9e selon la technologie des formulaires g\u00e9r\u00e9s peut \u00eatre lanc\u00e9e \u00e0 la fois dans le client l\u00e9ger (ex\u00e9cutable) sous Windows, Linux, MacOS.","canonical_url":"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/pro-veb-klient-1s__trashed","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"fr_FR","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u041f\u0440\u043e \u0432\u0435\u0431-\u043a\u043b\u0438\u0435\u043d\u0442 1\u0421 | ProHoster","og:description":"\u041e\u0434\u043d\u043e\u0439 \u0438\u0437 \u043f\u0440\u0438\u044f\u0442\u043d\u044b\u0445 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0435\u0439 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0438 1\u0421:\u041f\u0440\u0435\u0434\u043f\u0440\u0438\u044f\u0442\u0438\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0442\u043e, \u0447\u0442\u043e \u043f\u0440\u0438\u043a\u043b\u0430\u0434\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435, \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u043e\u0435 \u043f\u043e \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c\u044b\u0445 \u0444\u043e\u0440\u043c, \u043c\u043e\u0436\u0435\u0442 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c\u0441\u044f \u043a\u0430\u043a \u0432 \u0442\u043e\u043d\u043a\u043e\u043c (\u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u043c\u043e\u043c) \u043a\u043b\u0438\u0435\u043d\u0442\u0435 \u043f\u043e\u0434 Windows, Linux, MacOS.","og:url":"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/pro-veb-klient-1s__trashed","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2019-10-31T18:47:12+00:00","article:modified_time":"2026-05-20T17:17:21+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"32465","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":"2026-01-21 11:00:20","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-03-01 02:58:23","updated":"2026-01-21 11:00:20","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts\/32465","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/comments?post=32465"}],"version-history":[{"count":1,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts\/32465\/revisions"}],"predecessor-version":[{"id":173305,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts\/32465\/revisions\/173305"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/media\/24269"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/media?parent=32465"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/categories?post=32465"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/tags?post=32465"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}