{"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\/de\/blog\/administrirovanie\/pro-veb-klient-1s__trashed","title":{"rendered":"\u00dcber den Web-Client 1C","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Eine der angenehmen Besonderheiten der Technologie 1C:Unternehmen ist, dass die Anwendungsl\u00f6sung, die mit der Technologie der gesteuerten Formate entwickelt wurde, sowohl im d\u00fcnnen (ausf\u00fchrbaren) Client unter Windows, Linux, MacOS X als auch als Web-Client unter 5 Browsern \u2013 Chrome, Internet Explorer, Firefox, Safari, Edge \u2013 gestartet werden kann, und das alles ohne \u00c4nderung des Quellcodes der Anwendung. Dar\u00fcber hinaus funktioniert die Anwendung im d\u00fcnnen Client und im Browser optisch nahezu identisch.<br \/>\nFinden Sie 10 Unterschiede (unter dem Schnitt 2 Bilder):<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nFenster des d\u00fcnnen Clients unter Linux:<\/p>\n<p><img decoding=\"async\" alt=\"\u00dcber den Web-Client 1C\" src=\"\/wp-content\/uploads\/2019\/04\/6a836d01f80f447302e04d1827d5eebb.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDas gleiche Fenster im Web-Client (im Browser Chrome):<\/p>\n<p><img decoding=\"async\" alt=\"\u00dcber den Web-Client 1C\" src=\"\/wp-content\/uploads\/2019\/04\/1cab8bdf0d9d1c9d6601219c3ae6018c.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nWarum haben wir den Web-Client entwickelt? Etwas pathetisch gesagt, stellte uns die Zeit diese Aufgabe. Schon lange ist die Arbeit \u00fcber das Internet eine notwendige Voraussetzung f\u00fcr Gesch\u00e4ftsanwendungen geworden. Zun\u00e4chst haben wir die M\u00f6glichkeit geschaffen, \u00fcber das Internet mit unserem d\u00fcnnen Client zu arbeiten (einige unserer Konkurrenten haben sich \u00fcbrigens darauf beschr\u00e4nkt; andere hingegen haben den d\u00fcnnen Client ganz aufgegeben und sich ausschlie\u00dflich auf die Implementierung des Web-Clients konzentriert). Wir hingegen haben uns entschieden, unseren Nutzern die Wahl dieses Clients zu erm\u00f6glichen, der am besten zu ihnen passt.<\/p>\n<p><img decoding=\"async\" alt=\"\u00dcber den Web-Client 1C\" src=\"\/wp-content\/uploads\/2019\/04\/345d070d695cfc4854c485148d22d24c.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDie Hinzuf\u00fcgung der M\u00f6glichkeit, \u00fcber das Internet mit dem d\u00fcnnen Client zu arbeiten, war ein gro\u00dfes Projekt mit einer vollst\u00e4ndigen \u00c4nderung der Architektur der Client-Server-Interaktion. Die Erstellung des Web-Clients ist ein ganz neues Projekt, das von Grund auf neu begann.<\/p>\n<h3>Aufgabenstellung<\/h3>\n<p>\nAlso, die Anforderungen an das Projekt: der Web-Client muss das Gleiche tun wie der d\u00fcnne Client, n\u00e4mlich:<\/p>\n<ol>\n<li>Die Benutzeroberfl\u00e4che anzeigen<\/li>\n<li>Client-Code ausf\u00fchren, der in der 1C-Sprache geschrieben ist<\/li>\n<\/ol>\n<p>\nDie Benutzeroberfl\u00e4che in 1C wird im visuellen Editor beschrieben, jedoch deklarativ, ohne pixelgenaue Anordnung der Elemente; es werden etwa drei Dutzend Typen von Benutzeroberfl\u00e4chenelementen verwendet \u2013 Schaltfl\u00e4chen, Eingabefelder (Text, Zahlen, Datum\/Zeit), Listen, Tabellen, Diagramme usw. <\/p>\n<p>Der Client-Code in der 1C-Sprache kann Serveraufrufe, Arbeiten mit lokalen Ressourcen (Dateien usw.), Drucken und vieles mehr enthalten.<\/p>\n<p>Sowohl der d\u00fcnne Client (bei der Nutzung \u00fcber das Web) als auch der Web-Client verwenden dasselbe Set von Webdiensten zur Kommunikation mit dem 1C-Anwendungsserver. Die Implementierung bei den Clients ist nat\u00fcrlich unterschiedlich \u2013 der d\u00fcnne Client ist in C++ geschrieben, der Web-Client in JavaScript.<\/p>\n<h3>Ein wenig Geschichte<\/h3>\n<p>\nDas Projekt zur Erstellung eines Web-Clients begann im Jahr 2006, wobei im Durchschnitt ein Team von 5 Personen daran beteiligt war. In bestimmten Phasen des Projekts wurden Entwickler zur Umsetzung spezifischer Funktionen (Tabellendokumente, Diagramme usw.) hinzugezogen; in der Regel waren dies dieselben Entwickler, die diese Funktionalit\u00e4ten im Thin Client implementiert hatten. Das bedeutet, dass die Entwickler die Komponenten, die sie zuvor in C++ erstellt hatten, erneut in JavaScript schrieben.<\/p>\n<p>Von Anfang an lehnten wir die Idee einer automatischen (auch nur teilweisen) Konversion des C++-Codes des Thin Clients in den JavaScript-Web-Client aufgrund der erheblichen konzeptionellen Unterschiede zwischen diesen beiden Sprachen ab; der Web-Client wurde von Grund auf neu in JavaScript entwickelt.<\/p>\n<p>In den ersten Iterationen des Projekts konvertierte der Web-Client den Client-Code in der integrierten 1C-Sprache direkt in JavaScript. Der Thin Client funktioniert anders \u2013 der Code in der integrierten 1C-Sprache wird in Bytecode kompiliert, der dann auf dem Client interpretiert wird. Sp\u00e4ter begann auch der Web-Client, dies zu tun \u2013 erstens f\u00fchrte dies zu einer Leistungssteigerung, zweitens erm\u00f6glichte es die Vereinheitlichung der Architektur des Thin Clients und des Web-Clients.<\/p>\n<p>Die erste Version der Plattform 1C:Unternehmen mit Unterst\u00fctzung f\u00fcr den Web-Client wurde 2009 ver\u00f6ffentlicht. Zu diesem Zeitpunkt unterst\u00fctzte der Web-Client 2 Browser \u2013 Internet Explorer und Firefox. In den urspr\u00fcnglichen Pl\u00e4nen war die Unterst\u00fctzung von Opera vorgesehen, aber aufgrund un\u00fcberwindbarer Probleme zum damaligen Zeitpunkt mit den Schlie\u00dfhandlern der Anwendung in Opera (es war nicht m\u00f6glich, mit 100%-iger Sicherheit nachzuverfolgen, dass die Anwendung geschlossen wird, und in diesem Moment den Trennungsprozess vom 1C-Anwendungsserver durchzuf\u00fchren) mussten wir von diesen Pl\u00e4nen Abstand nehmen.<\/p>\n<h3>Projektstruktur<\/h3>\n<p>\nIn der Plattform 1C:Unternehmen gibt es insgesamt 4 Projekte, die in JavaScript geschrieben sind:<\/p>\n<ol>\n<li>WebTools \u2013 allgemeine Bibliotheken, die von den anderen Projekten verwendet werden (hierzu z\u00e4hlen wir auch <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Google_Closure_Tools#Closure_Library\">Google Closure Library<\/a><\/noindex>).<\/li>\n<li>Steuerelement <noindex><a rel=\"nofollow\" href=\"http:\/\/v8.1c.ru\/overview\/Term_000000785.htm\">FormatiertesDokument<\/a><\/noindex> (wurde sowohl im JavaScript als auch im Thin Client und im Web-Client implementiert)<\/li>\n<li>Steuerelement <noindex><a rel=\"nofollow\" href=\"https:\/\/wonderland.v8.1c.ru\/blog\/planirovshchik\/\">Scheduler<\/a><\/noindex> (wurde sowohl im JavaScript als auch im Thin Client und im Web-Client implementiert)<\/li>\n<li>Web-Client<\/li>\n<\/ol>\n<p>\nDie Struktur jedes Projekts \u00e4hnelt der Struktur von Java-Projekten (oder .NET-Projekten \u2013 je nach Vorliebe); wir haben Namensr\u00e4ume, und jeder Namensraum befindet sich in einem separaten Ordner. Innerhalb des Ordners befinden sich die Dateien und Klassen des Namensraums. Im Projekt des Web-Clients gibt es etwa 1000 Dateien.<\/p>\n<p>Strukturell wird der Web-Client grob in die folgenden Teilsysteme unterteilt:<\/p>\n<ul>\n<li>Verwaltete Schnittstelle der Client-Anwendung\n<ul>\n<li>Allgemeine Benutzeroberfl\u00e4che der Anwendung (Systemmen\u00fcs, Panels)<\/li>\n<li>Benutzeroberfl\u00e4che der verwalteten Formulare, die unter anderem etwa 30 Steuerelemente umfasst (Schaltfl\u00e4chen, verschiedene Arten von Eingabefeldern \u2013 Text-, Zahlen-, Datum\/Zeit und mehr, Tabellen, Listen, Diagramme usw.)<\/li>\n<\/ul>\n<p>\n<\/li>\n<li>Objektmodell, das Entwicklern auf der Client-Seite zur Verf\u00fcgung steht (insgesamt mehr als 400 Typen: Objektmodell der verwalteten Benutzeroberfl\u00e4che, Datenlayout-Einstellungen, bedingte Formatierungen usw.)<\/li>\n<li>Interpreter der integrierten 1C-Sprache<\/li>\n<li>Browsererweiterungen (werden f\u00fcr Funktionen verwendet, die in JavaScript nicht unterst\u00fctzt werden)\n<ul>\n<li>Arbeit mit Kryptographie<\/li>\n<li>Arbeit mit Dateien<\/li>\n<li>Technologie externer Komponenten, die eine Nutzung sowohl im Thin- als auch im Web-Client erm\u00f6glicht<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p><\/p>\n<h3>Besonderheiten der Entwicklung<\/h3>\n<p>\nDie Implementierung all dessen, was oben beschrieben wurde, in JavaScript \u2013 ist keine einfache Aufgabe. M\u00f6glicherweise ist der 1C-Web-Client eine der gr\u00f6\u00dften Client-Seit-Anwendungen, die in JavaScript geschrieben wurden \u2013 etwa 450.000 Zeilen. Wir verwenden aktiv den objektorientierten Ansatz im Code des Web-Clients, der die Arbeit mit einem so gro\u00dfen Projekt vereinfacht.<\/p>\n<p>Um die Gr\u00f6\u00dfe des Client-Codes zu minimieren, haben wir zun\u00e4chst unseren eigenen Obfuskator verwendet, und ab Version 8.3.6 der Plattform (Oktober 2014) haben wir begonnen, <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Google_Closure_Tools#Closure_Compiler\">Google Closure Compiler<\/a><\/noindex>. Der Effekt der Verwendung in Zahlen \u2013 die Gr\u00f6\u00dfe des Frameworks des Web-Clients nach der Obfuskation:<\/p>\n<ul>\n<li>Eigener Obfuskator \u2013 1556 kB<\/li>\n<li>Google Closure Compiler \u2013 1073 kB<\/li>\n<\/ul>\n<p>\nDie Verwendung des Google Closure Compilers hat uns geholfen, die Leistung des Web-Clients um 30 % im Vergleich zu unserem eigenen Obfuskator zu steigern. Dar\u00fcber hinaus wurde der Speicherbedarf des Programms um 15-25 % (je nach Browser) reduziert.<\/p>\n<p>Google Closure Compiler funktioniert sehr gut mit objektorientiertem Code, daher ist seine Effizienz gerade f\u00fcr den Web-Client maximal hoch. Der Closure Compiler macht f\u00fcr uns mehrere gute Dinge:<\/p>\n<ul>\n<li>Statische Typpr\u00fcfung w\u00e4hrend der Projektkompilierung (erreicht durch die Verwendung von JSDoc-Anmerkungen im Code). Am Ende ergibt sich eine statische Typisierung, die in der N\u00e4he des Niveaus von C++ liegt. Dadurch k\u00f6nnen wir einen erheblichen Prozentsatz der Fehler w\u00e4hrend der Kompilation des Projekts aufdecken.<\/li>\n<li>Reduzierung der Codegr\u00f6\u00dfe durch Obfuskation<\/li>\n<li>Eine Reihe von Optimierungen des ausf\u00fchrbaren Codes, zum Beispiel:\n<ul>\n<li>Inline-Ersatzfunktionen. Der Funktionsaufruf in JavaScript ist eine relativ teure Operation, und Inline-Ersatz f\u00fcr oft verwendete kleine Methoden beschleunigt die Ausf\u00fchrung des Codes erheblich.<\/li>\n<li>Berechnung von Konstanten zur Compile-Zeit. Wenn der Ausdruck von einer Konstante abh\u00e4ngt, wird dessen tats\u00e4chlicher Wert eingesetzt.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>\nAls Entwicklungsumgebung f\u00fcr den Web-Client verwenden wir WebStorm.<\/p>\n<p>F\u00fcr die Analyse des Codes verwenden wir <noindex><a rel=\"nofollow\" href=\"http:\/\/www.sonarqube.org\/\">SonarQube<\/a><\/noindex>, in die wir statische Code-Analysatoren integrieren. Mit Hilfe der Analysatoren \u00fcberwachen wir die Verschlechterung der Qualit\u00e4t des Quellcodes in JavaScript und versuchen, dies zu vermeiden.<\/p>\n<p><img decoding=\"async\" alt=\"\u00dcber den Web-Client 1C\" src=\"\/wp-content\/uploads\/2019\/04\/886fe89a8c12d29d940b6b59316ea627.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3>Welche Aufgaben haben wir gel\u00f6st\/ l\u00f6sen wir<\/h3>\n<p>\nIm Laufe der Projektdurchf\u00fchrung sind wir auf eine Reihe interessanter Aufgaben gesto\u00dfen, die wir l\u00f6sen mussten.<\/p>\n<h4>Datenkommunikation mit dem Server und zwischen Fenstern<\/h4>\n<p>\nEs gibt Situationen, in denen die Obfuskierung des Quellcodes die Funktionalit\u00e4t des Systems beeintr\u00e4chtigen kann. Der Code, der extern zum ausf\u00fchrbaren Code des Web-Clients ist, kann aufgrund der Obfuskierung Funktions- und Parameterbezeichnungen haben, die sich von denjenigen unterscheiden, die unser ausf\u00fchrbarer Code erwartet. Externer Code f\u00fcr uns ist:<\/p>\n<ul>\n<li>Der Code, der vom Server in Form von Datenstrukturen kommt<\/li>\n<li>Der Code eines anderen Anwendungsfensters<\/li>\n<\/ul>\n<p>\nUm Obfuskierung bei der Interaktion mit dem Server zu vermeiden, verwenden wir das Tag @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>\nUnd um Obfuskierung bei der Interaktion mit anderen Fenstern zu vermeiden, nutzen wir sogenannte exportierte Schnittstellen (Schnittstellen, bei denen alle Methoden exportiert sind).<\/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>Wir haben das Virtual DOM verwendet, bevor es allgemein bekannt wurde)<\/h4>\n<p>\nWie alle Entwickler, die mit komplexen Web-UIs umgehen, haben wir schnell erkannt, dass der DOM schlecht f\u00fcr die Arbeit mit dynamischen Benutzeroberfl\u00e4chen geeignet ist. Fast sofort wurde ein Analogon zum Virtual DOM zur Optimierung der Arbeit mit der UI implementiert. W\u00e4hrend der Verarbeitung von Ereignissen werden alle DOM-\u00c4nderungen im Speicher festgehalten und erst nach Abschluss aller Operationen werden die gesammelten \u00c4nderungen auf den DOM-Baum angewendet.<\/p>\n<h4>Optimierung der Funktionsweise des Web-Clients<\/h4>\n<p>\nDamit unser Web-Client schneller arbeitet, versuchen wir, die Standardfunktionen des Browsers (CSS usw.) bestm\u00f6glich zu nutzen. So wird die Befehlsleiste des Formulars (die praktisch in jedem Formular der Anwendung zu finden ist) ausschlie\u00dflich mit Mitteln des Browsers und dynamischem Layout auf der Basis von CSS gerendert.<\/p>\n<p><img decoding=\"async\" alt=\"\u00dcber den Web-Client 1C\" src=\"\/wp-content\/uploads\/2019\/04\/116261ca79218eaa2bee9a4f5104092b.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h4>Tests<\/h4>\n<p>\nF\u00fcr funktionale Tests und Leistungstests verwenden wir ein hauseigenes Tool (geschrieben in Java und C++), sowie eine Testreihe, die auf <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/Selenium\">Selenium<\/a><\/noindex>.<\/p>\n<p>Unser Tool ist vielseitig \u2013 es erlaubt das Testen nahezu aller Desktop-Anwendungen und eignet sich sowohl f\u00fcr die \u00dcberpr\u00fcfung von Thin Clients als auch von Web-Clients. Das Tool zeichnet die Aktionen des Benutzers, der die Applikation \u201e1C\u201c gestartet hat, in eine Skriptdatei auf. Gleichzeitig werden Bilder des Bildschirminhalts \u2013 der Referenzen \u2013 aufgezeichnet. Bei der Kontrolle neuer Versionen des Web-Clients werden die Skripte ohne Benutzerinteraktion abgespielt. Bei einer Abweichung des Screenshots von der Referenz an irgendeinem Punkt wird der Test als fehlgeschlagen betrachtet, woraufhin ein Qualit\u00e4tsspezialist eine Untersuchung durchf\u00fchrt \u2013 ob es sich um einen Fehler oder eine geplante \u00c4nderung des Systemverhaltens handelt. Bei geplanten Ver\u00e4nderungen werden die Referenzen automatisch durch neue ersetzt.<\/p>\n<p>Das Tool misst auch die Leistungsdaten von Anwendungen mit einer Genauigkeit von bis zu 25 Millisekunden. In bestimmten F\u00e4llen wiederholen wir Teile des Skripts (zum Beispiel geben wir die Bestellung mehrmals ein), um die Verschlechterung der Ausf\u00fchrungszeit im Laufe der Zeit zu analysieren. Alle Messwerte werden in einem Protokoll festgehalten und analysiert.<\/p>\n<p><img decoding=\"async\" alt=\"\u00dcber den Web-Client 1C\" src=\"\/wp-content\/uploads\/2019\/04\/058bab976becf6fd38b2ec668492043b.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<b>Unser Testtool und die getestete Anwendung<\/b><\/p>\n<p>Unser Tool und Selenium erg\u00e4nzen sich; zum Beispiel, wenn eine Schaltfl\u00e4che auf einem Bildschirm ihre Position ge\u00e4ndert hat \u2013 Selenium kann das m\u00f6glicherweise nicht verfolgen, aber unser Tool wird es bemerken, da es pixelgenaue Vergleiche des Screenshots mit der Referenz anstellt. Zudem ist das Tool in der Lage, Probleme bei der Verarbeitung von Tastatureingaben oder Mausbewegungen zu erkennen, da es genau diese eingibt.<\/p>\n<p>Tests in beiden Tools (unserem und Selenium) f\u00fchren typischen Arbeitsszenarien aus unseren Anwendungsl\u00f6sungen durch. Tests werden automatisch nach dem t\u00e4glichen Build der Plattform \u201e1C:Enterprise\u201c gestartet. Bei einer Verlangsamung der Skriptausf\u00fchrungen (im Vergleich zum vorherigen Build) f\u00fchren wir eine Untersuchung durch und beheben die Ursache der Verlangsamung. Unser Kriterium ist einfach \u2013 der neue Build muss nicht langsamer arbeiten als der vorherige.<\/p>\n<p>Zur Untersuchung von Vorf\u00e4llen der Verlangsamung verwenden die Entwickler verschiedene Tools; haupts\u00e4chlich wird <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> des Unternehmens <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Dynatrace\">DynaTrace<\/a><\/noindex>. Es werden Protokolle der Ausf\u00fchrung der problematischen Operationen in der alten und der neuen Version aufgezeichnet, die dann analysiert werden. Dabei kann die Ausf\u00fchrungszeit einzelner Operationen (in Millisekunden) nicht der entscheidende Faktor sein \u2013 im Browser werden regelm\u00e4\u00dfig Hintergrundprozesse wie die Speicherbereinigung gestartet, die die Ausf\u00fchrungszeit der Funktionen \u00fcberlagern und das Bild verzerren k\u00f6nnen. Relevantere Parameter in diesem Fall sind die Anzahl der ausgef\u00fchrten JavaScript-Anweisungen, die Anzahl atomarer DOM-Operationen usw. Wenn die Anzahl der Anweisungen\/Operationen im selben Szenario in der neuen Version gestiegen ist, bedeutet das fast immer einen R\u00fcckgang der Leistung, der behoben werden muss.<\/p>\n<p>Eine weitere Ursache f\u00fcr die Leistungsabf\u00e4lle kann sein, dass der Google Closure Compiler aus irgendeinem Grund keine Inline-Substitution der Funktion durchf\u00fchren konnte (zum Beispiel, weil die Funktion rekursiv oder virtuell ist). In diesem Fall versuchen wir, die Situation zu beheben, indem wir den Quellcode umschreiben.<\/p>\n<h3>Browsererweiterungen<\/h3>\n<p>\nWenn die Anwendung bestimmte Funktionalit\u00e4ten ben\u00f6tigt, die nicht in JavaScript vorhanden sind, nutzen wir Browsererweiterungen:<\/p>\n<ul>\n<li>zum Arbeiten mit Dateien<\/li>\n<li>zum Arbeiten mit Kryptografie<\/li>\n<li>arbeiten mit <noindex><a rel=\"nofollow\" href=\"http:\/\/v8.1c.ru\/overview\/Term_000000545.htm\">externen Komponenten<\/a><\/noindex><\/li>\n<\/ul>\n<p>\nUnsere Erweiterungen bestehen aus zwei Teilen. Der erste Teil ist das, was als Browsererweiterung bezeichnet wird (in der Regel in JavaScript f\u00fcr Chrome und Firefox geschriebene Erweiterungen), die mit dem zweiten Teil \u2014 der bin\u00e4ren Erweiterung, die die ben\u00f6tigte Funktionalit\u00e4t implementiert \u2014 interagiert. Es sei erw\u00e4hnt, dass wir 3 Versionen der bin\u00e4ren Erweiterungen f\u00fcr Windows, Linux und MacOS schreiben. Die bin\u00e4re Erweiterung wird zusammen mit der Plattform 1C:Enterprise bereitgestellt und befindet sich auf dem Server der 1C-Anwendung. Bei der ersten Aufruf von einem Web-Client wird sie auf den Client-Computer geladen und im Browser installiert.<\/p>\n<p>Bei der Arbeit in Safari verwenden unsere Erweiterungen NPAPI, im Internet Explorer kommt die ActiveX-Technologie zum Einsatz. <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/Microsoft_Edge\">Microsoft Edge<\/a><\/noindex> unterst\u00fctzt derzeit keine Erweiterungen, weshalb der Web-Client eingeschr\u00e4nkt funktioniert.<\/p>\n<h3>Weiterentwicklung<\/h3>\n<p>\nEine der Aufgaben f\u00fcr das Entwicklungsteam des Web-Clients besteht darin, die Funktionalit\u00e4t weiterzuentwickeln. Die Funktionalit\u00e4t des Web-Clients sollte identisch mit der des dicken Clients sein, und alle neuen Funktionen werden sowohl im dicken als auch im Web-Client gleichzeitig implementiert.<\/p>\n<p>Weitere Aufgaben sind die Entwicklung der Architektur, Refactoring, Leistungs- und Zuverl\u00e4ssigkeitssteigerung. Ein Beispiel f\u00fcr einen Bereich ist der \u00dcbergang zu einem asynchronen Arbeitsmodell. Ein Teil der Funktionalit\u00e4t des Web-Clients basiert derzeit auf einem synchronen Modell der Interaktion mit dem Server. Das asynchrone Modell wird in Browsern (und nicht nur in Browsern) zunehmend relevanter, was uns zwingt, den Web-Client durch den Austausch synchroner Aufrufe gegen asynchrone (und entsprechendes Refactoring des Codes) zu modifizieren. Der schrittweise \u00dcbergang zu einem asynchronen Modell wird durch die Notwendigkeit erkl\u00e4rt, die ver\u00f6ffentlichten L\u00f6sungen zu unterst\u00fctzen und sie allm\u00e4hlich anzupassen.<br \/>\n<br \/>Quelle: <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.1.1 - 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\/de\/blog\/administrirovanie\/pro-veb-klient-1s__trashed\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"de_DE\" \/>\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\/de\/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\u00dcber den 1C Web-Client | ProHoster","description":"Eine der angenehmen Eigenschaften der 1C:Unternehmens-Technologie ist, dass eine Anwendungsl\u00f6sung, die mit der Technologie f\u00fcr verwaltete Formulare entwickelt wurde, sowohl im dicken (ausf\u00fchrbaren) Client unter Windows, Linux, MacOS ausgef\u00fchrt werden kann.","canonical_url":"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/pro-veb-klient-1s__trashed","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"de_DE","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\/de\/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\/de\/wp-json\/wp\/v2\/posts\/32465","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/comments?post=32465"}],"version-history":[{"count":1,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts\/32465\/revisions"}],"predecessor-version":[{"id":173305,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts\/32465\/revisions\/173305"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media\/24269"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media?parent=32465"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/categories?post=32465"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/tags?post=32465"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}