{"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\/sv\/blog\/administrirovanie\/pro-veb-klient-1s__trashed","title":{"rendered":"Om webbklienten 1C","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>En av de trevliga egenskaperna med teknologin 1C:Enterprise \u00e4r att applikationsl\u00f6sningen, som utvecklats med hj\u00e4lp av tekniken f\u00f6r hanterade formul\u00e4r, kan k\u00f6ras b\u00e5de i en tunn (exekveringsbar) klient p\u00e5 Windows, Linux, MacOS X och som webbklient i fem webbl\u00e4sare - Chrome, Internet Explorer, Firefox, Safari, Edge, och allt detta - utan att \u00e4ndra k\u00e4llkoden f\u00f6r applikationen. Dessutom fungerar och ser applikationen i den tunna klienten och i webbl\u00e4saren praktiskt taget identiskt ut.<br \/>\nHitta 10 skillnader (under bilden 2 bilder):<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nF\u00f6nstret f\u00f6r den tunna klienten p\u00e5 Linux:<\/p>\n<p><img decoding=\"async\" alt=\"Om webbklienten 1C\" src=\"\/wp-content\/uploads\/2019\/04\/6a836d01f80f447302e04d1827d5eebb.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nSamma f\u00f6nster i webbklienten (i webbl\u00e4saren Chrome):<\/p>\n<p><img decoding=\"async\" alt=\"Om webbklienten 1C\" src=\"\/wp-content\/uploads\/2019\/04\/1cab8bdf0d9d1c9d6601219c3ae6018c.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nVarf\u00f6r skapade vi en webbklient? F\u00f6r att s\u00e4ga det lite pomp\u00f6st, st\u00e4llde tiden en s\u00e5dan uppgift f\u00f6r oss. Det har l\u00e4nge varit n\u00f6dv\u00e4ndigt att arbeta via Internet f\u00f6r aff\u00e4rsapplikationer. Till en b\u00f6rjan tillade vi m\u00f6jligheten att arbeta via Internet f\u00f6r v\u00e5r tunna klient (vissa av v\u00e5ra konkurrenter, f\u00f6r \u00f6vrigt, stannade d\u00e4r; andra, tv\u00e4rtom, \u00f6vergav den tunna klienten och begr\u00e4nsade sig till att implementera webbklienten). Vi best\u00e4mde oss f\u00f6r att ge v\u00e5ra anv\u00e4ndare m\u00f6jlighet att v\u00e4lja den klientversion som passar dem b\u00e4st.<\/p>\n<p><img decoding=\"async\" alt=\"Om webbklienten 1C\" src=\"\/wp-content\/uploads\/2019\/04\/345d070d695cfc4854c485148d22d24c.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nAtt l\u00e4gga till m\u00f6jligheten att arbeta via Internet f\u00f6r den tunna klienten var ett stort projekt med en fullst\u00e4ndig f\u00f6r\u00e4ndring av arkitekturen f\u00f6r klient-server interaktion. Skapandet av webbklienten var en helt ny projekt som b\u00f6rjade fr\u00e5n grunden.<\/p>\n<h3>Uppgiftsst\u00e4llande<\/h3>\n<p>\nS\u00e5, kraven f\u00f6r projektet: webbklienten ska g\u00f6ra samma sak som den tunna klienten, n\u00e4mligen:<\/p>\n<ol>\n<li>Visa anv\u00e4ndargr\u00e4nssnittet<\/li>\n<li>K\u00f6ra klientkod skriven i 1C-spr\u00e5ket<\/li>\n<\/ol>\n<p>\nAnv\u00e4ndargr\u00e4nssnittet i 1C beskrivs i en visuell redigerare, men deklarativt, utan pixel-m\u00e4ssig placering av element; cirka tre dussin typer av gr\u00e4nselement anv\u00e4nds - knappar, inmatningsf\u00e4lt (text, siffra, datum\/tid), listor, tabeller, diagram osv. <\/p>\n<p>Klientkoden i 1C-spr\u00e5ket kan inneh\u00e5lla serveranrop, arbete med lokala resurser (filer etc.), utskrift och mycket mer.<\/p>\n<p>B\u00e5de den tunna klienten (vid arbete via webben) och webbklienten anv\u00e4nder samma upps\u00e4ttning webbservrar f\u00f6r kommunikation med 1C:s applikationsserver. Implementeringen hos klienterna \u00e4r naturligtvis olika - den tunna klienten \u00e4r skriven i C++, webbklienten - i JavaScript.<\/p>\n<h3>Lite historia<\/h3>\n<p>\nProjektet med att skapa en webbkund p\u00e5b\u00f6rjades 2006 och involverade i genomsnitt ett team p\u00e5 5 personer. Vid olika skeden av projektet anlitades utvecklare f\u00f6r att implementera specifik funktionalitet (tabeller, diagram etc.); som regel var det samma utvecklare som hade skapat denna funktionalitet f\u00f6r den tunna klienten. Det vill s\u00e4ga, utvecklarna skrev om komponenter p\u00e5 JavaScript som de tidigare hade skapat i C++.<\/p>\n<p>Redan fr\u00e5n b\u00f6rjan avf\u00e4rdade vi id\u00e9n om n\u00e5gon form av automatisk (\u00e4ven partiell) konvertering av C++-koden fr\u00e5n den tunna klienten till JavaScript-webbkunden med h\u00e4nvisning till de stora konceptuella skillnaderna mellan de tv\u00e5 spr\u00e5ken; webbkunden skrevs i JavaScript fr\u00e5n grunden.<\/p>\n<p>I de f\u00f6rsta iterationerna av projektet konverterade webbkunden klientkoden i det inbyggda spr\u00e5ket 1C direkt till JavaScript. Den tunna klienten fungerar annorlunda \u2013 koden i det inbyggda spr\u00e5ket 1C kompileras till bytekod, och denna bytekod tolkas sedan p\u00e5 klienten. Senare b\u00f6rjade \u00e4ven webbkunden g\u00f6ra likadant \u2013 f\u00f6rst och fr\u00e4mst gav det en prestandaf\u00f6rb\u00e4ttring, f\u00f6r det andra m\u00f6jliggjorde det en enhetlig arkitektur f\u00f6r den tunna och webbkunden.<\/p>\n<p>Den f\u00f6rsta versionen av plattformen 1C:Enterprise med st\u00f6d f\u00f6r webbkunden sl\u00e4pptes 2009. Vid det tillf\u00e4llet st\u00f6dde webbkunden tv\u00e5 webbl\u00e4sare \u2013 Internet Explorer och Firefox. I de ursprungliga planerna fanns st\u00f6d f\u00f6r Opera, men p\u00e5 grund av o\u00f6verkomliga problem med h\u00e4ndelsehanterare f\u00f6r st\u00e4ngning av applikationen i Opera (vi kunde inte med 100% s\u00e4kerhet sp\u00e5ra att applikationen st\u00e4ngdes, och vid den tiden utf\u00f6ra proceduren f\u00f6r att koppla ifr\u00e5n 1C-applikationsservern) var vi tvungna att ge upp dessa planer.<\/p>\n<h3>Projektstruktur<\/h3>\n<p>\nDet finns totalt 4 projekt inom plattformen 1C:Enterprise som \u00e4r skrivna i JavaScript:<\/p>\n<ol>\n<li>WebTools \u2013 allm\u00e4nna bibliotek som anv\u00e4nds av de \u00f6vriga projekten (h\u00e4r inkluderas ocks\u00e5 <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Google_Closure_Tools#Closure_Library\">Google Closure Library<\/a><\/noindex>).<\/li>\n<li>Kontrollelement <noindex><a rel=\"nofollow\" href=\"http:\/\/v8.1c.ru\/overview\/Term_000000785.htm\">FormateradDokument<\/a><\/noindex> (implementerad i b\u00e5de JavaScript och i den tunna klienten och webbkunden)<\/li>\n<li>Kontrollelement <noindex><a rel=\"nofollow\" href=\"https:\/\/wonderland.v8.1c.ru\/blog\/planirovshchik\/\">Schemal\u00e4ggare<\/a><\/noindex> (implementerad i b\u00e5de JavaScript och i den tunna klienten och webbkunden)<\/li>\n<li>Webbkund<\/li>\n<\/ol>\n<p>\nStrukturen f\u00f6r varje projekt p\u00e5minner om strukturen f\u00f6r Java-projekt (eller .NET-projekt \u2013 vad som k\u00e4nns n\u00e4rmare); vi har namnrymder, d\u00e4r varje namnrymd ligger i en egen mapp. Inuti mappen ligger filer och klasser under namnrymden. I webbkundens projekt finns det cirka 1000 filer.<\/p>\n<p>Strukturm\u00e4ssigt delas webbkunden grovt upp i f\u00f6ljande delsystem:<\/p>\n<ul>\n<li>Hantera gr\u00e4nssnittet f\u00f6r kundapplikationen\n<ul>\n<li>Det gemensamma applikationsgr\u00e4nssnittet (systemmenyer, paneler)<\/li>\n<li>Gr\u00e4nssnitt f\u00f6r hanterade formul\u00e4r med cirka 30 kontrollobjekt (knappar, olika typer av inmatningsf\u00e4lt \u2013 text, numeriska, datum\/tid m.m., tabeller, listor, diagram, osv.)<\/li>\n<\/ul>\n<p>\n<\/li>\n<li>Objektmodellen som \u00e4r tillg\u00e4nglig f\u00f6r utvecklare p\u00e5 klienten (\u00f6ver 400 typer: objektmodellen f\u00f6r det hanterade gr\u00e4nssnittet, datalayoutinst\u00e4llningar, villkorlig formatering, osv.)<\/li>\n<li>Tolk f\u00f6r det inbyggda spr\u00e5ket 1C<\/li>\n<li>Webbl\u00e4sartill\u00e4gg (anv\u00e4nds f\u00f6r funktionalitet som inte st\u00f6ds av JavaScript)\n<ul>\n<li>Arbete med kryptografi<\/li>\n<li>Arbete med filer<\/li>\n<li>Teknik f\u00f6r externa komponenter som g\u00f6r det m\u00f6jligt att anv\u00e4nda dem b\u00e5de i tunn och webklient<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p><\/p>\n<h3>Utvecklingsfunktioner<\/h3>\n<p>\nAtt implementera allt ovanst\u00e5ende i JavaScript \u00e4r en utmaning. Kanske \u00e4r webklienten 1C ett av de st\u00f6rsta klientbaserade programmen skrivna i JavaScript \u2013 cirka 450.000 rader. Vi anv\u00e4nder aktivt objektorienterad programmering i koden f\u00f6r webklienten, vilket f\u00f6renklar arbetet med ett s\u00e5 stort projekt.<\/p>\n<p>F\u00f6r att minimera storleken p\u00e5 klientkoden anv\u00e4nde vi f\u00f6rst v\u00e5r egen obfuskator, men fr\u00e5n och med version 8.3.6 (oktober 2014) b\u00f6rjade vi anv\u00e4nda <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Google_Closure_Tools#Closure_Compiler\">Google Closure Compiler<\/a><\/noindex>. Effekten av anv\u00e4ndningen i siffror \u2013 storleken p\u00e5 ramverket f\u00f6r webklienten efter obfuskering:<\/p>\n<ul>\n<li>Egen obfuskator \u2013 1556 kB<\/li>\n<li>Google Closure Compiler \u2013 1073 kB<\/li>\n<\/ul>\n<p>\nAnv\u00e4ndningen av Google Closure Compiler har hj\u00e4lpt oss att \u00f6ka prestandan f\u00f6r webklienten med 30 % j\u00e4mf\u00f6rt med v\u00e5r egen obfuskator. Dessutom minskade minnesanv\u00e4ndningen f\u00f6r applikationen med 15-25 % (beroende p\u00e5 webbl\u00e4sare).<\/p>\n<p>Google Closure Compiler fungerar mycket bra med objektorienterad kod, vilket maximerar dess effektivitet f\u00f6r webklienten. Closure Compiler g\u00f6r flera bra saker f\u00f6r oss:<\/p>\n<ul>\n<li>Statisk typkontroll vid byggfasen av projektet (garanteras genom att vi t\u00e4cker koden med JSDoc-annoteringar). Slutresultatet blir statisk typning som \u00e4r mycket n\u00e4ra den i C++. Detta hj\u00e4lper till att f\u00e5nga en stor andel av felen i projektets kompilering.<\/li>\n<li>Minskning av kodens storlek genom obfuskering<\/li>\n<li>En rad optimeringar av den k\u00f6rda koden, s\u00e5som:\n<ul>\n<li>inline-inb\u00e4ddningar av funktioner. Funktionanrop i JavaScript \u00e4r en ganska kostsam operation, och inline-inb\u00e4ddningar av ofta anv\u00e4nda sm\u00e5 metoder p\u00e5skyndar kodens arbete avsev\u00e4rt.<\/li>\n<li>Ber\u00e4kning av konstanter vid kompilering. Om uttrycket beror p\u00e5 en konstant, kommer det faktiska v\u00e4rdet p\u00e5 konstanten att infogas.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>\nSom utvecklingsmilj\u00f6 f\u00f6r webbkunden anv\u00e4nder vi WebStorm.<\/p>\n<p>F\u00f6r kodanalys anv\u00e4nder vi <noindex><a rel=\"nofollow\" href=\"http:\/\/www.sonarqube.org\/\">SonarQube<\/a><\/noindex>, dit vi integrerar statiska kodanalysatorer. Med hj\u00e4lp av analysatorerna \u00f6vervakar vi nedg\u00e5ngen av kvaliteten p\u00e5 k\u00e4llkoden i JavaScript och f\u00f6rs\u00f6ker undvika det.<\/p>\n<p><img decoding=\"async\" alt=\"Om webbklienten 1C\" src=\"\/wp-content\/uploads\/2019\/04\/886fe89a8c12d29d940b6b59316ea627.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3>Vilka uppgifter har vi l\u00f6st\/l\u00f6ser?<\/h3>\n<p>\nUnder genomf\u00f6randet av projektet st\u00f6tte vi p\u00e5 en rad intressanta uppgifter som vi var tvungna att l\u00f6sa.<\/p>\n<h4>Datakommunikation med servern och mellan f\u00f6nster<\/h4>\n<p>\nDet finns situationer d\u00e4r obfuscering av k\u00e4llkoden kan st\u00f6ra systemets funktion. Koden som \u00e4r extern i f\u00f6rh\u00e5llande till den k\u00f6rbara koden f\u00f6r webbkunden kan p\u00e5 grund av obfusceringen ha funktions- och parameter-namn som skiljer sig fr\u00e5n de som v\u00e5r k\u00f6rbara kod f\u00f6rv\u00e4ntar sig. Den externa koden f\u00f6r oss \u00e4r:<\/p>\n<ul>\n<li>Koden som kommer fr\u00e5n servern i form av datatyper<\/li>\n<li>Koden fr\u00e5n ett annat applikationsf\u00f6nster<\/li>\n<\/ul>\n<p>\nF\u00f6r att undvika obfuscering vid interaktion med servern anv\u00e4nder vi taggen @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>\nOch f\u00f6r att undvika obfuscering vid interaktion med andra f\u00f6nster anv\u00e4nder vi s\u00e5 kallade exporterade gr\u00e4nssnitt (gr\u00e4nssnitt d\u00e4r alla metoder \u00e4r exporterade).<\/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>Vi anv\u00e4nde Virtual DOM innan det blev mainstream)<\/h4>\n<p>\nSom alla utvecklare som arbetar med komplexa webb-UI ins\u00e5g vi snabbt att DOM \u00e4r d\u00e5ligt l\u00e4mpad f\u00f6r att arbeta med dynamiska anv\u00e4ndargr\u00e4nssnitt. N\u00e4stan omedelbart implementerade vi en kopia av Virtual DOM f\u00f6r att optimera arbetet med UI. Under h\u00e4ndelsebehandlingen sparas alla \u00e4ndringar av DOM i minnet och f\u00f6rst efter att alla operationer har slutf\u00f6rts till\u00e4mpas de samlade \u00e4ndringarna p\u00e5 DOM-tr\u00e4det.<\/p>\n<h4>Optimering av webbkundens arbete<\/h4>\n<p>\nF\u00f6r att v\u00e5r webbkund ska fungera snabbare f\u00f6rs\u00f6ker vi utnyttja webbl\u00e4sarens inbyggda funktioner s\u00e5 mycket som m\u00f6jligt (CSS osv.). S\u00e5ledes ritas kommandopanelen f\u00f6r formul\u00e4ret (som \u00e4r placerad p\u00e5 n\u00e4stan varje formul\u00e4r i applikationen) enbart med hj\u00e4lp av webbl\u00e4sarens medel, med dynamisk layout baserad p\u00e5 CSS.<\/p>\n<p><img decoding=\"async\" alt=\"Om webbklienten 1C\" src=\"\/wp-content\/uploads\/2019\/04\/116261ca79218eaa2bee9a4f5104092b.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h4>Testning<\/h4>\n<p>\nF\u00f6r funktionell testning och prestandatestning anv\u00e4nder vi ett in-house verktyg (skapat i Java och C++), samt en testupps\u00e4ttning baserad p\u00e5 <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/Selenium\">Selenium<\/a><\/noindex>.<\/p>\n<p>V\u00e5rt verktyg \u00e4r m\u00e5ngsidigt \u2013 det m\u00f6jligg\u00f6r testning av praktiskt taget alla skrivbordsprogram, vilket g\u00f6r det l\u00e4mpligt f\u00f6r b\u00e5de tunn klient och webbklient. Verktyget registrerar anv\u00e4ndarens \u00e5tg\u00e4rder som startar till\u00e4mpningen \"1C\" i en skriptfil. Samtidigt registreras bilder av skrivbordets arbetsomr\u00e5de \u2013 referenser. N\u00e4r nya versioner av webbklienten kontrolleras, k\u00f6rs skripten utan anv\u00e4ndarens medverkan. Vid avvikelser mellan sk\u00e4rmdumpen och referensen vid n\u00e5got steg anses testet ha misslyckats, och en kvalitetspecialist genomf\u00f6r en utredning \u2013 om det \u00e4r ett fel eller en planerad f\u00f6r\u00e4ndring av systemets beteende. Vid planerat beteende ers\u00e4tts referenserna automatiskt med nya.<\/p>\n<p>Verktyget m\u00e4ter ocks\u00e5 applikationernas prestanda med en noggrannhet p\u00e5 25 millisekunder. I vissa fall slussar vi delar av skriptet (till exempel upprepar vi best\u00e4llningsinmatningen flera g\u00e5nger) f\u00f6r att analysera tidsdegradering \u00f6ver tid. Resultaten av alla m\u00e4tningar loggas f\u00f6r analys.<\/p>\n<p><img decoding=\"async\" alt=\"Om webbklienten 1C\" src=\"\/wp-content\/uploads\/2019\/04\/058bab976becf6fd38b2ec668492043b.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<b>V\u00e5rt testverktyg och den testade applikationen<\/b><\/p>\n<p>V\u00e5rt verktyg och Selenium kompletterar varandra; till exempel kan Selenium ha sv\u00e5rt att sp\u00e5ra om en knapp p\u00e5 en av sk\u00e4rmarna har \u00e4ndrat sin plats \u2013 men v\u00e5rt verktyg kommer att m\u00e4rka det, eftersom det g\u00f6r en pixel-f\u00f6r-pixel-j\u00e4mf\u00f6relse av sk\u00e4rmdumpen med referensen. Dessutom kan verktyget sp\u00e5ra problem med hantering av inmatning fr\u00e5n tangentbord eller mus, eftersom det just reproducerar dessa.<\/p>\n<p>Tester p\u00e5 b\u00e5da verktygen (v\u00e5rt och Selenium) k\u00f6r typiska arbetsfl\u00f6den fr\u00e5n v\u00e5ra applikationer. Tester startas automatiskt efter den dagliga byggningen av plattformen \"1C:Enterprise\". Vid f\u00f6rs\u00e4mrad prestanda i skripten (j\u00e4mf\u00f6rt med f\u00f6reg\u00e5ende byggnad) genomf\u00f6r vi en utredning f\u00f6r att fastst\u00e4lla orsaken till nedg\u00e5ngen. V\u00e5r kriterium \u00e4r enkel \u2013 den nya byggnaden ska inte vara l\u00e5ngsammare \u00e4n den f\u00f6reg\u00e5ende.<\/p>\n<p>F\u00f6r att utreda incidenter av prestandaf\u00f6rs\u00e4mringar anv\u00e4nder utvecklarna olika verktyg; fr\u00e4mst anv\u00e4nds <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> f\u00f6retaget <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Dynatrace\">DynaTrace<\/a><\/noindex>. Loggfiler f\u00f6r problematiska operationer spelas in p\u00e5 b\u00e5de den tidigare och den nya versionen, och loggarna analyseras. I detta fall kan tiden f\u00f6r enskilda operationer (i millisekunder) vara mindre avg\u00f6rande faktorer \u2013 i webbl\u00e4saren k\u00f6rs ibland tj\u00e4nsteprocesser som skr\u00e4pning, som kan p\u00e5verka tiden f\u00f6r funktionsanrop och f\u00f6rvr\u00e4nga bilden. Mer relevanta parametrar i det h\u00e4r fallet \u00e4r antalet utf\u00f6rda JavaScript-instruktioner och antalet atom\u00e4ra operationer p\u00e5 DOM, osv. Om antalet instruktioner\/operationer i samma scenario i den nya versionen \u00f6kar \u2013 inneb\u00e4r det n\u00e4stan alltid en f\u00f6rs\u00e4mring av prestandan som m\u00e5ste \u00e5tg\u00e4rdas.<\/p>\n<p>En annan anledning till prestandaf\u00f6rs\u00e4mringen kan vara att Google Closure Compiler av n\u00e5gon anledning inte kunde utf\u00f6ra inline-substitution av en funktion (till exempel f\u00f6r att funktionen \u00e4r rekursiv eller virtuell). I detta fall f\u00f6rs\u00f6ker vi \u00e5tg\u00e4rda situationen genom att skriva om koden.<\/p>\n<h3>webbl\u00e4sartill\u00e4gg<\/h3>\n<p>\nOm den applikationsl\u00f6sning beh\u00f6ver funktionalitet som inte finns i JavaScript, anv\u00e4nder vi webbl\u00e4sartill\u00e4gg:<\/p>\n<ul>\n<li>f\u00f6r filhantering<\/li>\n<li>f\u00f6r kryptografi<\/li>\n<li>arbete med <noindex><a rel=\"nofollow\" href=\"http:\/\/v8.1c.ru\/overview\/Term_000000545.htm\">externa komponenter<\/a><\/noindex><\/li>\n<\/ul>\n<p>\nV\u00e5ra till\u00e4gg best\u00e5r av tv\u00e5 delar. Den f\u00f6rsta delen \u00e4r det som kallas ett webbl\u00e4sartill\u00e4gg (som vanligtvis \u00e4r skrivna i JavaScript f\u00f6r Chrome och Firefox) som interagerar med den andra delen - ett bin\u00e4rt till\u00e4gg som implementerar den funktionalitet vi beh\u00f6ver. Det b\u00f6r n\u00e4mnas att vi skriver tre versioner av bin\u00e4ra till\u00e4gg \u2013 f\u00f6r Windows, Linux och MacOS. Det bin\u00e4ra till\u00e4gget ing\u00e5r i plattformen 1C:Enterprise och finns p\u00e5 1C-applikationsservern. Vid f\u00f6rsta anropet fr\u00e5n webbklienten laddas det ner till klientdatorn och installeras i webbl\u00e4saren.<\/p>\n<p>Vid arbete i Safari anv\u00e4nder v\u00e5ra till\u00e4gg NPAPI, medan de i Internet Explorer anv\u00e4nder ActiveX-teknologin. <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/Microsoft_Edge\">Microsoft Edge<\/a><\/noindex> st\u00f6der \u00e4nnu inte till\u00e4gg, s\u00e5 webbklienten fungerar med begr\u00e4nsningar.<\/p>\n<h3>Vidare utveckling<\/h3>\n<p>\nEn av uppgiftgrupperna f\u00f6r teamet som utvecklar webbklienten \u00e4r att vidareutveckla funktionaliteten. Funktionaliteten i webbklienten ska vara identisk med funktionaliteten i den tunna klienten; all ny funktionalitet implementeras samtidigt b\u00e5de i den tunna och i webbklienten.<\/p>\n<p>Andra uppgifter \u00e4r att utveckla arkitekturen, refaktorisera, samt f\u00f6rb\u00e4ttra prestanda och tillf\u00f6rlitlighet. Ett exempel p\u00e5 detta \u00e4r att vi r\u00f6r oss mot en asynkron arbetsmodell. Delar av funktionaliteten i webbklienten \u00e4r f\u00f6r n\u00e4rvarande byggda p\u00e5 en synkron interaktionsmodell med servern. Den asynkrona modellen blir nu mer relevant i webbl\u00e4sare (och inte bara i webbl\u00e4sare), och detta tvingar oss att modifiera webbklienten genom att ers\u00e4tta synkrona anrop med asynkrona (och g\u00f6ra motsvarande refaktorisering av koden). Den gradvisa \u00f6verg\u00e5ngen till den asynkrona modellen f\u00f6rklaras av behovet att st\u00f6dja tidigare lanserade l\u00f6sningar och deras gradvisa anpassning.<br \/>\n<br \/>K\u00e4lla: <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.4 - 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\/sv\/blog\/administrirovanie\/pro-veb-klient-1s__trashed\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.4\" \/>\n\t\t<meta property=\"og:locale\" content=\"sv_SE\" \/>\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\/sv\/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\udd47Om webbklienten 1C | ProHoster","description":"En av de trevliga aspekterna av teknologin 1C:Enterprise \u00e4r att applikationsl\u00f6sningen, som utvecklats med hj\u00e4lp av hanterade formul\u00e4r, kan k\u00f6ras b\u00e5de i en tunn (exekverbar) klient p\u00e5 Windows, Linux, MacOS.","canonical_url":"https:\/\/prohoster.info\/sv\/blog\/administrirovanie\/pro-veb-klient-1s__trashed","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"sv_SE","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\/sv\/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\/sv\/wp-json\/wp\/v2\/posts\/32465","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/comments?post=32465"}],"version-history":[{"count":1,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/posts\/32465\/revisions"}],"predecessor-version":[{"id":173305,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/posts\/32465\/revisions\/173305"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/media\/24269"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/media?parent=32465"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/categories?post=32465"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/tags?post=32465"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}