{"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 1C-Webclient","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Eine der angenehmen Eigenschaften der Technologie 1C:Unternehmen ist, dass die Anwendung, die mit Managed Forms entwickelt wurde, sowohl als d\u00fcnner (ausf\u00fchrender) Client unter Windows, Linux, MacOS X als auch als Webclient in 5 Browsern \u2013 Chrome, Internet Explorer, Firefox, Safari, Edge \u2013 betrieben werden kann, und das alles ohne \u00c4nderungen am Quellcode der Anwendung. Dar\u00fcber hinaus funktioniert die Anwendung im d\u00fcnnen Client und im Browser praktisch identisch und sieht auch so aus.<br \/>\nFinden Sie 10 Unterschiede (unter dem Link 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 1C-Webclient\" src=\"\/wp-content\/uploads\/2019\/04\/6a836d01f80f447302e04d1827d5eebb.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDasselbe Fenster im Webclient (im Browser Chrome):<\/p>\n<p><img decoding=\"async\" alt=\"\u00dcber den 1C-Webclient\" src=\"\/wp-content\/uploads\/2019\/04\/1cab8bdf0d9d1c9d6601219c3ae6018c.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nWarum haben wir einen Webclient erstellt? Um es etwas pathetisch auszudr\u00fccken, hat uns diese Aufgabe die Zeit gestellt. Schon lange ist die Arbeit \u00fcber das Internet eine Voraussetzung f\u00fcr Gesch\u00e4ftsanwendungen geworden. Zun\u00e4chst haben wir die M\u00f6glichkeit der Internetnutzung f\u00fcr unseren d\u00fcnnen Client hinzugef\u00fcgt (einige unserer Wettbewerber haben \u00fcbrigens dabei halt gemacht; andere hingegen haben auf den d\u00fcnnen Client verzichtet und sich auf die Umsetzung des Webclients beschr\u00e4nkt). Wir haben uns hingegen entschieden, unseren Nutzern die Wahl zu lassen, welche Client-Option f\u00fcr sie am besten geeignet ist.<\/p>\n<p><img decoding=\"async\" alt=\"\u00dcber den 1C-Webclient\" src=\"\/wp-content\/uploads\/2019\/04\/345d070d695cfc4854c485148d22d24c.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDie Implementierung der Internetnutzung f\u00fcr den Thin Client war ein umfassendes Projekt, das eine vollst\u00e4ndige Neugestaltung der Client-Server-Interaktion erforderte. Die Entwicklung eines Web-Clients ist sogar ein ganz neues Projekt, das bei null begann.<\/p>\n<h3>Problemstellung<\/h3>\n<p>\nDie Anforderungen an das Projekt sind: Der Web-Client muss die gleichen Funktionen wie der Thin Client erf\u00fcllen, n\u00e4mlich:<\/p>\n<ol>\n<li>Die Benutzeroberfl\u00e4che anzeigen<\/li>\n<li>Den Client-Code ausf\u00fchren, der in 1C geschrieben ist<\/li>\n<\/ol>\n<p>\nDie Benutzeroberfl\u00e4che in 1C wird in einem visuellen Editor beschrieben, jedoch deklarativ, ohne pixelgenaue Platzierung der Elemente; es stehen etwa drei\u00dfig Typen von Benutzeroberfl\u00e4chenelementen zur Verf\u00fcgung \u2013 Schaltfl\u00e4chen, Eingabefelder (Text, Zahlen, Datum\/Zeit), Listen, Tabellen, Diagramme usw. <\/p>\n<p>Der Client-Code in 1C kann Serveraufrufe enthalten, mit lokalen Ressourcen (Dateien usw.) arbeiten, drucken und vieles mehr.<\/p>\n<p>Sowohl der Thin Client (im Web-Betrieb) als auch der Web-Client nutzen denselben Satz von Web-Services zur Kommunikation mit dem 1C-Anwendungsserver. Die Implementierung bei den Clients ist nat\u00fcrlich unterschiedlich \u2013 der Thin Client ist in C++ geschrieben, der Web-Client in JavaScript.<\/p>\n<h3>Ein wenig Geschichte<\/h3>\n<p>\nDas Projekt zur Erstellung des Web-Clients wurde 2006 gestartet und umfasste im Durchschnitt ein Team von 5 Personen. In bestimmten Phasen des Projekts wurden Entwickler hinzugezogen, um spezifische Funktionen (wie Tabellenkalkulationen, Diagramme usw.) umzusetzen; in der Regel waren dies die gleichen Entwickler, die diese Funktionen bereits im d\u00fcnnen Client realisiert hatten. Das bedeutet, dass die Entwickler die zuvor in C++ erstellten Komponenten erneut in JavaScript schrieben.<\/p>\n<p>Von Anfang an haben wir die Idee einer automatischen (auch nur teilweisen) Konversion von C++-Code des d\u00fcnnen Clients in den JavaScript-Web-Client aufgrund der erheblichen konzeptionellen Unterschiede zwischen diesen beiden Sprachen verworfen; der Web-Client wurde von Grund auf in JavaScript geschrieben.<\/p>\n<p>In den ersten Iterationen des Projekts konvertierte der Web-Client den Client-Code in der eingebetteten Sprache 1C direkt in JavaScript. Der d\u00fcnne Client funktioniert anders \u2013 der Code in der eingebetteten Sprache 1C wird in Bytecode kompiliert, der dann auf dem Client interpretiert wird. Sp\u00e4ter \u00fcbernahm auch der Web-Client dieses Verfahren \u2013 erstens verbesserte es die Leistung, und zweitens erm\u00f6glichte es die Vereinheitlichung der Architektur von d\u00fcnnem und Web-Client.<\/p>\n<p>Die erste Version der 1C:Enterprise-Plattform mit Unterst\u00fctzung f\u00fcr den Web-Client wurde 2009 ver\u00f6ffentlicht. Zu diesem Zeitpunkt unterst\u00fctzte der Web-Client zwei Browser \u2013 Internet Explorer und Firefox. Urspr\u00fcnglich war die Unterst\u00fctzung von Opera geplant, jedoch mussten wir aufgrund un\u00fcberwindbarer Probleme mit den Anwendungsbeendigungs-Handlern in Opera (es war nicht m\u00f6glich, mit 100%iger Sicherheit festzustellen, ob die Anwendung geschlossen wurde, und zu diesem Zeitpunkt das Trennen vom 1C-Anwendungsserver durchzuf\u00fchren) von diesen Pl\u00e4nen absehen.<\/p>\n<h3>Projektstruktur<\/h3>\n<p>\nInsgesamt gibt es auf der 1C:Enterprise-Plattform 4 Projekte, die in JavaScript geschrieben sind:<\/p>\n<ol>\n<li>WebTools \u2013 allgemeine Bibliotheken, die von den anderen Projekten verwendet werden (dazu 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\">FormatierterDokument<\/a><\/noindex> (implementiert in JavaScript sowohl im Thin Client als auch im Web-Client)<\/li>\n<li>Steuerelement <noindex><a rel=\"nofollow\" href=\"https:\/\/wonderland.v8.1c.ru\/blog\/planirovshchik\/\">Scheduler<\/a><\/noindex> (implementiert in JavaScript sowohl im Thin Client als auch im Web-Client)<\/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 Namespaces, und jeder Namespace befindet sich in einem eigenen Ordner. Innerhalb des Ordners befinden sich die Dateien und Klassen des Namespaces. Im Web-Client-Projekt 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 Benutzeroberfl\u00e4che der Client-Anwendung\n<ul>\n<li>Allgemeine Benutzeroberfl\u00e4che der Anwendung (Systemmen\u00fcs, Panels)<\/li>\n<li>Oberfl\u00e4che der verwalteten Formulare, einschlie\u00dflich etwa 30 Steuerelementen (Schaltfl\u00e4chen, verschiedene Eingabefelder \u2013 Text, Zahlen, Datum\/Uhrzeit usw., Tabellen, Listen, Grafiken usw.)<\/li>\n<\/ul>\n<p>\n<\/li>\n<li>Objektmodell, das Entwicklern auf der Client-Seite zur Verf\u00fcgung steht (insgesamt \u00fcber 400 Typen: Objektmodell der verwalteten Benutzeroberfl\u00e4che, Einstellungen zur Datenanordnung, bedingte Formatierung usw.)<\/li>\n<li>Interpreter der eingebetteten Sprache 1C<\/li>\n<li>Browsererweiterungen (werden f\u00fcr Funktionen verwendet, die in JavaScript nicht unterst\u00fctzt werden)\n<ul>\n<li>Arbeiten mit Kryptografie<\/li>\n<li>Arbeiten mit Dateien<\/li>\n<li>Technologie externer Komponenten, die ihre Nutzung sowohl im schlanken als auch im Web-Client erm\u00f6glicht<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p><\/p>\n<h3>Entwicklungsmerkmale<\/h3>\n<p>\nDie Umsetzung all dessen in JavaScript ist eine herausfordernde Aufgabe. M\u00f6glicherweise ist der 1C-Web-Client eine der gr\u00f6\u00dften client-seitigen Anwendungen, die in JavaScript geschrieben wurden \u2013 etwa 450.000 Zeilen. Wir verwenden in unserem Code des Web-Clients aktiv einen objektorientierten Ansatz, 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) den <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Google_Closure_Tools#Closure_Compiler\">Google Closure Compiler<\/a><\/noindex>eingesetzt. Die Auswirkungen der Verwendung in Zahlen \u2013 die Gr\u00f6\u00dfe des Web-Client-Frameworks 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 Speicherverbrauch der Anwendung um 15-25 % (je nach Browser) reduziert.<\/p>\n<p>Der Google Closure Compiler funktioniert sehr gut mit objektorientiertem Code, weshalb seine Effizienz f\u00fcr den Web-Client maximal hoch ist. Der Closure Compiler bietet uns mehrere Vorteile:<\/p>\n<ul>\n<li>Statische Typpr\u00fcfung w\u00e4hrend des Builds des Projekts (erm\u00f6glicht durch die Abdeckung des Codes mit JSDoc-Anmerkungen). Das Ergebnis ist eine statische Typisierung, die in etwa dem Niveau der Typisierung in C++ entspricht. Dies hilft, einen betr\u00e4chtlichen Anteil an Fehlern bereits w\u00e4hrend der Kompilierungsphase des Projekts zu erkennen.<\/li>\n<li>Reduzierung der Codegr\u00f6\u00dfe durch Obfuskation<\/li>\n<li>Eine Reihe von Optimierungen des ausgef\u00fchrten Codes, wie beispielsweise:\n<ul>\n<li>Inline-Ersetzungen von Funktionen. Der Funktionsaufruf in JavaScript ist eine relativ teure Operation, und Inline-Ersetzungen h\u00e4ufig verwendeter kleiner Methoden beschleunigen die Ausf\u00fchrung des Codes erheblich.<\/li>\n<li>Die Berechnung von Konstanten zur Compile-Zeit. Wenn ein Ausdruck von einer Konstanten abh\u00e4ngt, wird der tats\u00e4chliche Wert der Konstanten eingesetzt.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>\nAls Entwicklungsumgebung f\u00fcr den Webclient verwenden wir WebStorm.<\/p>\n<p>F\u00fcr die Codeanalyse nutzen wir <noindex><a rel=\"nofollow\" href=\"http:\/\/www.sonarqube.org\/\">SonarQube<\/a><\/noindex>, in das wir statische Code-Analysatoren integrieren. Mit Hilfe der Analysatoren \u00fcberwachen wir die Qualit\u00e4t des Quellcodes in JavaScript und bem\u00fchen uns, eine Verschlechterung zu vermeiden.<\/p>\n<p><img decoding=\"async\" alt=\"\u00dcber den 1C-Webclient\" src=\"\/wp-content\/uploads\/2019\/04\/886fe89a8c12d29d940b6b59316ea627.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3>Welche Aufgaben wir gel\u00f6st haben \/ l\u00f6sen<\/h3>\n<p>\nW\u00e4hrend der Umsetzung des Projekts sind wir auf eine Reihe interessanter Herausforderungen gesto\u00dfen, die es zu bew\u00e4ltigen galt.<\/p>\n<h4>Datenaustausch mit dem Server und zwischen Fenstern<\/h4>\n<p>\nEs gibt Situationen, in denen das Obfuskieren des Quellcodes die Funktionalit\u00e4t des Systems beeintr\u00e4chtigen kann. Der externe Code im Vergleich zum ausf\u00fchrbaren Code des Webclients k\u00f6nnte aufgrund der Obfuskation Funktionsnamen und Parameter verwenden, die von dem abweichen, was unser ausf\u00fchrbarer Code erwartet. Der externe Code f\u00fcr uns ist:<\/p>\n<ul>\n<li>Der Code, der vom Server in Form von strukturierten Daten kommt<\/li>\n<li>Der Code eines anderen Anwendungsfensters<\/li>\n<\/ul>\n<p>\nUm Obfuskation 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>\nUm Obfuskation bei der Interaktion mit anderen Fenstern zu vermeiden, nutzen wir sogenannte exportierbare Schnittstellen (Schnittstellen, bei denen alle Methoden exportierbar 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 Mainstream wurde<\/h4>\n<p>\nWie alle Entwickler, die mit komplexen Web-UI zu tun haben, haben wir schnell erkannt, dass das DOM nicht gut f\u00fcr die Arbeit mit dynamischen Benutzeroberfl\u00e4chen geeignet ist. Praktisch sofort wurde ein \u00c4quivalent zum Virtual DOM implementiert, um die Arbeit mit der Benutzeroberfl\u00e4che zu optimieren. W\u00e4hrend der Ereignisverarbeitung 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 Web-Client-Performance<\/h4>\n<p>\nUm die Geschwindigkeit unseres Web-Clients zu erh\u00f6hen, nutzen wir so weit wie m\u00f6glich die standardm\u00e4\u00dfigen Funktionen des Browsers (CSS usw.). Die Befehlszeile des Formulars (die sich praktisch in jedem Anwendungsformular befindet) wird ausschlie\u00dflich mit Mitteln des Browsers und dynamischem Layout auf Basis von CSS gerendert.<\/p>\n<p><img decoding=\"async\" alt=\"\u00dcber den 1C-Webclient\" src=\"\/wp-content\/uploads\/2019\/04\/116261ca79218eaa2bee9a4f5104092b.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h4>Testen<\/h4>\n<p>\nF\u00fcr funktionale Tests und Leistungstests nutzen wir ein hauseigenes Tool (entwickelt in Java und C++), sowie eine Testreihe, die auf basiert <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/Selenium\">Selenium<\/a><\/noindex>.<\/p>\n<p>Unser Werkzeug ist universell einsetzbar \u2013 es erm\u00f6glicht das Testen nahezu aller Windows-Anwendungen und eignet sich somit sowohl f\u00fcr das Testen von Desktop- als auch von Web-Clients. Das Tool zeichnet die Aktionen des Benutzers auf, der die Anwendung \u201e1C\u201c gestartet hat, in eine Skriptdatei. Gleichzeitig werden Bilder des Arbeitsbereichs des Bildschirms \u2013 Referenzen \u2013 aufgenommen. Bei der \u00dcberpr\u00fcfung neuer Versionen des Web-Clients werden die Skripte ohne Benutzereingriff wiedergegeben. Bei einer Diskrepanz zwischen dem Screenshot und der Referenz zu einem bestimmten Zeitpunkt gilt der Test als fehlgeschlagen, woraufhin ein Qualit\u00e4tsspezialist eine Untersuchung einleitet \u2013 ob es sich um einen Fehler oder um eine geplante \u00c4nderung des Systemverhaltens handelt. Bei einem geplanten Verhalten werden die Referenzen automatisch durch neue ersetzt.<\/p>\n<p>Das Tool misst auch die Leistungskennzahlen von Anwendungen mit einer Genauigkeit von bis zu 25 Millisekunden. In einigen F\u00e4llen wiederholen wir Teile des Skripts (zum Beispiel die Bestellung mehrfach), um eine Analyse der zeitlichen Verschlechterung \u00fcber die Zeit durchzuf\u00fchren. Alle Messergebnisse werden im Log gespeichert, um sie zu analysieren.<\/p>\n<p><img decoding=\"async\" alt=\"\u00dcber den 1C-Webclient\" 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 sich eine Schaltfl\u00e4che auf einem der Bildschirme verschoben hat \u2013 kann Selenium das m\u00f6glicherweise nicht erkennen, aber unser Tool wird es bemerken, da es einen pixelgenauen Vergleich des Screenshots mit dem Referenzbild durchf\u00fchrt. Zudem kann das Tool Probleme bei der Eingabeverarbeitung \u00fcber die Tastatur oder Maus erkennen, da es genau diese Eingaben simuliert.<\/p>\n<p>Mit beiden Tools (unserem und Selenium) f\u00fchren wir Tests durch, die typische Arbeitsszenarien aus unseren Anwendungen simulieren. Die Tests werden automatisch nach dem t\u00e4glichen Build der Plattform \u201e1C:Enterprise\u201c gestartet. Bei einer Verlangsamung der Abl\u00e4ufe im Vergleich zum vorherigen Build f\u00fchren wir eine Untersuchung durch und beheben die Ursachen der Verlangsamung. Unser Kriterium ist einfach \u2013 der neue Build muss nicht langsamer als der vorherige arbeiten.<\/p>\n<p>F\u00fcr die Untersuchung von Verlangsamungsereignissen nutzen die Entwickler verschiedene Tools; vor allem 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 erfolgt eine Protokollierung der Ausf\u00fchrung von problematischen Operationen in der vorherigen und der neuen Version, gefolgt von einer Analyse der Logs. Dabei kann die Ausf\u00fchrungszeit einzelner Operationen (in Millisekunden) nicht der entscheidende Faktor sein \u2013 im Browser werden sporadisch Hintergrundprozesse wie die M\u00fcllbereinigung gestartet, die die Ausf\u00fchrungszeit von Funktionen beeinflussen und das Bild verzerren k\u00f6nnen. Relevantere Parameter sind in diesem Fall die Anzahl der ausgef\u00fchrten JavaScript-Anweisungen, die Anzahl der atomaren Operationen am DOM usw. Wenn die Anzahl der Anweisungen\/Operationen im gleichen Szenario in der neuen Version gestiegen ist, bedeutet dies fast immer einen Leistungsabfall, den es zu beheben gilt.<\/p>\n<p>Ein weiterer Grund f\u00fcr die Leistungsprobleme k\u00f6nnte sein, dass der Google Closure Compiler aus verschiedenen Gr\u00fcnden die Inline-Ersatzfunktion nicht durchf\u00fchren konnte (zum Beispiel, weil die Funktion rekursiv oder virtuell ist). In diesem Fall versuchen wir, die Situation zu verbessern, indem wir den Quellcode umschreiben.<\/p>\n<h3>Browsererweiterungen<\/h3>\n<p>\nWenn eine Anwendung Funktionalit\u00e4ten ben\u00f6tigt, die JavaScript nicht bietet, verwenden wir Browsererweiterungen:<\/p>\n<ul>\n<li>f\u00fcr die Arbeit mit Dateien<\/li>\n<li>f\u00fcr die Arbeit mit Kryptografie<\/li>\n<li>Arbeit 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 man als Browsererweiterung bezeichnet (in der Regel in JavaScript geschriebene Erweiterungen f\u00fcr Chrome und Firefox), die mit dem zweiten Teil \u2013 einer bin\u00e4ren Erweiterung, die die ben\u00f6tigte Funktionalit\u00e4t implementiert \u2013 interagieren. Es ist erw\u00e4hnenswert, dass wir drei Versionen der bin\u00e4ren Erweiterungen schreiben \u2013 f\u00fcr Windows, Linux und MacOS. Die bin\u00e4re Erweiterung wird als Teil der Plattform 1C:Enterprise bereitgestellt und befindet sich auf dem Server der 1C-Anwendung. Bei der ersten Anforderung vom 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, w\u00e4hrend sie in Internet Explorer die ActiveX-Technologie nutzen. <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 dort mit Einschr\u00e4nkungen funktioniert.<\/p>\n<h3>Weitere Entwicklungen<\/h3>\n<p>\nEine der Aufgabenstellungen f\u00fcr das Team, das f\u00fcr den Web-Client zust\u00e4ndig ist, besteht darin, die Funktionalit\u00e4t weiterzuentwickeln. Die Funktionalit\u00e4t des Web-Clients sollte identisch mit der des Thin Clients sein, wobei alle neuen Funktionen gleichzeitig in beiden Clients implementiert werden.<\/p>\n<p>Weitere Aufgaben umfassen die Weiterentwicklung der Architektur, Refactoring sowie die Verbesserung der Leistung und Zuverl\u00e4ssigkeit. Ein Schwerpunkt liegt beispielsweise auf der schrittweisen Umsetzung eines asynchronen Betriebsmodells. Derzeit basiert ein Teil der Funktionalit\u00e4t des Web-Clients auf einem synchronen Modell der Kommunikation mit dem Server. Asynchrone Modelle gewinnen nicht nur in Browsern zunehmend an Bedeutung, sodass wir gezwungen sind, den Web-Client anzupassen, indem wir synchrone Aufrufe durch asynchrone ersetzen (samt dem entsprechenden Refactoring des Codes). Der schrittweise \u00dcbergang zu einem asynchronen Modell ist notwendig, um die ver\u00f6ffentlichten L\u00f6sungen zu unterst\u00fctzen und diese schrittweise 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 4.9.10 - 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 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\" \/>\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) 4.9.10\" \/>\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 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\" \/>\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 Web-Client 1C | ProHoster","description":"Eine der angenehmen Eigenschaften der Technologie 1C:Unternehmen ist, dass die Anwendungsl\u00f6sung, die auf der Technologie der verwalteten Formulare basiert, sowohl im d\u00fcnnen (ausf\u00fchrbaren) Client unter Windows, Linux, MacOS X als auch als Web-Client in 5 Browsern \u2013 Chrome, Internet Explorer, Firefox, Safari, Edge \u2013 gestartet werden kann, und das alles \u2013 ohne \u00c4nderung des Quellcodes der Anwendung. Dar\u00fcber hinaus \u2013 \u00e4u\u00dferlich","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 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","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"},"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}]}}