{"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\/da\/blog\/administrirovanie\/pro-veb-klient-1s__trashed","title":{"rendered":"Om webklienten 1C","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>En af de behagelige funktioner ved 1C:Enterprise-teknologi er, at applikationsl\u00f8sningen, der er udviklet ved hj\u00e6lp af teknologien med styrede former, kan k\u00f8re b\u00e5de som en tynd klient p\u00e5 Windows, Linux, MacOS X og som en webklient i 5 browsere \u2013 Chrome, Internet Explorer, Firefox, Safari, Edge, alt sammen uden at \u00e6ndre kildekoden til applikationen. Desuden fungerer applikationen i den tynde klient og i browseren n\u00e6sten identisk i b\u00e5de funktion og udseende.<br \/>\nFind 10 forskelle (under kattebilledet 2 billeder):<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nVindue til den tynde klient p\u00e5 Linux:<\/p>\n<p><img decoding=\"async\" alt=\"Om webklienten 1C\" src=\"\/wp-content\/uploads\/2019\/04\/6a836d01f80f447302e04d1827d5eebb.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDet samme vindue i webklienten (i browseren Chrome):<\/p>\n<p><img decoding=\"async\" alt=\"Om webklienten 1C\" src=\"\/wp-content\/uploads\/2019\/04\/1cab8bdf0d9d1c9d6601219c3ae6018c.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nHvorfor lavede vi webklienten? For at sige det lidt dramatisk, var dette en opgave, som tiden har stillet os. Det er l\u00e6nge siden, at arbejde over internettet er blevet en n\u00f8dvendig betingelse for forretningsapplikationer. F\u00f8rst tilf\u00f8jede vi muligheden for at arbejde over internettet for vores tynde klient (nogle af vores konkurrenter stoppede faktisk hier; andre, derimod, opgav den tynde klient og begr\u00e6nsede sig til implementeringen af webklienten). Vi besluttede at give vores brugere mulighed for at v\u00e6lge den klienttype, der passer dem bedst.<\/p>\n<p><img decoding=\"async\" alt=\"Om webklienten 1C\" src=\"\/wp-content\/uploads\/2019\/04\/345d070d695cfc4854c485148d22d24c.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nTilf\u00f8jelsen af muligheden for at arbejde over internettet for den tynde klient var et stort projekt med en fuldst\u00e6ndig \u00e6ndring af arkitekturen for klient-server-interaktionen. Oprettelsen af webklienten er derimod et helt nyt projekt, der startede fra bunden.<\/p>\n<h3>Problemformulering<\/h3>\n<p>\nS\u00e5 kravene til projektet: webklienten skal kunne udf\u00f8re det samme som den tynde klient, nemlig:<\/p>\n<ol>\n<li>Vise brugergr\u00e6nsefladen<\/li>\n<li>Udf\u00f8re klientskode skrevet i 1C-sprog<\/li>\n<\/ol>\n<p>\nBrugergr\u00e6nsefladen i 1C beskrives i en visuel editor, men deklarativt, uden pixel-for-pixel placering af elementer; der anvendes omkring tre dusin typer af interfaceelementer \u2013 knapper, indtastningsfelter (tekst, tal, dato\/tid), lister, tabeller, grafer osv. <\/p>\n<p>Klientskoden i 1C-sprog kan indeholde serveropkald, arbejde med lokale ressourcer (filer osv.), udskrivning og meget andet.<\/p>\n<p>B\u00e5de den tynde klient (ved arbejde via web) og webklienten bruger det samme s\u00e6t webtjenester til kommunikation med 1C-applikationsserveren. Implementeringen hos klienterne er selvf\u00f8lgelig forskellig \u2013 den tynde klient er skrevet i C++, mens webklienten er skrevet i JavaScript.<\/p>\n<h3>Lidt historie<\/h3>\n<p>\nProjektet om at skabe en webklient blev startet i 2006, og i gennemsnit deltog et hold p\u00e5 5 personer. P\u00e5 bestemte stadier af projektet blev der tilknyttet udviklere for at implementere specifik funktionalitet (regneark, diagrammer osv.); som regel var det de samme udviklere, der havde skabt denne funktionalitet i den tynde klient. Dvs. at udviklerne genprogrammerede JavaScript-komponenter, som de tidligere havde lavet i C++.<\/p>\n<p>Fra begyndelsen forkastede vi id\u00e9en om en eller anden automatisk (om end delvis) konvertering af C++-koden fra den tynde klient til JavaScript-webklienten p\u00e5 grund af de st\u00e6rke konceptuelle forskelle mellem disse to sprog; webklienten blev skrevet i JavaScript fra bunden.<\/p>\n<p>I de tidlige iterationer af projektet konverterede webklienten klientkoden p\u00e5 det indbyggede 1C-sprog direkte til JavaScript. Den tynde klient fungerer anderledes - koden p\u00e5 det indbyggede 1C-sprog kompileres til bytekode, og derefter bliver denne bytekode fortolket p\u00e5 klienten. Senere begyndte webklienten ogs\u00e5 at g\u00f8re det samme \u2013 for det f\u00f8rste gav det en pr\u00e6stationsfordel, for det andet gjorde det det muligt at ensrette arkitekturen mellem den tynde og web-klient.<\/p>\n<p>Den f\u00f8rste version af 1C:Enterprise-platformen med st\u00f8tte til webklienten blev udgivet i 2009. P\u00e5 det tidspunkt underst\u00f8ttede webklienten 2 browsere - Internet Explorer og Firefox. I de oprindelige planer var der st\u00f8tte til Opera, men p\u00e5 grund af uovervindelige problemer med h\u00e5ndteringen af lukning af applikationen i Opera (det var ikke muligt at spore med 100% sikkerhed, hvorn\u00e5r applikationen lukkede, og p\u00e5 det tidspunkt gennemf\u00f8re proceduren for at afbryde forbindelsen til 1C-applikationsserveren) m\u00e5tte disse planer opgives.<\/p>\n<h3>Project structure<\/h3>\n<p>\nI alt er der 4 projekter i 1C:Enterprise-platformen, der er skrevet i JavaScript:<\/p>\n<ol>\n<li>WebTools \u2013 generiske biblioteker, der anvendes af de \u00f8vrige projekter (herunder) <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Google_Closure_Tools#Closure_Library\">Google Closure Library<\/a><\/noindex>).<\/li>\n<li>Brugergr\u00e6nseelement <noindex><a rel=\"nofollow\" href=\"http:\/\/v8.1c.ru\/overview\/Term_000000785.htm\">FormatteretDokument<\/a><\/noindex> (implementeret i b\u00e5de JavaScript og i den tynde klient og i webklienten)<\/li>\n<li>Brugergr\u00e6nseelement <noindex><a rel=\"nofollow\" href=\"https:\/\/wonderland.v8.1c.ru\/blog\/planirovshchik\/\">Scheduler<\/a><\/noindex> (implementeret i b\u00e5de JavaScript og i den tynde klient og i webklienten)<\/li>\n<li>A web client<\/li>\n<\/ol>\n<p>\nStrukturen af hvert projekt minder om strukturen af Java-projekter (eller .NET-projekter - alt efter hvad der er n\u00e6rmest for \u00e9n); vi har navneomr\u00e5der, og hvert navneomr\u00e5de ligger i en separat mappe. Inde i mappen findes filer og klasser af navneomr\u00e5det. I webklientens projekt er der omkring 1000 filer.<\/p>\n<p>Strukturelt er webklienten groft opdelt i f\u00f8lgende delsystemer:<\/p>\n<ul>\n<li>H\u00e5ndteret brugergr\u00e6nseflade til klientapplikationen\n<ul>\n<li>Brugergr\u00e6nseflade til applikationen (systemmenuer, paneler)<\/li>\n<li>Gr\u00e6nseflade til administrerede formularer, herunder cirka 30 kontrolelementer (knapper, forskellige typer indtastningsfelter \u2013 tekst, tal, dato\/tid osv., tabeller, lister, grafer osv.)<\/li>\n<\/ul>\n<p>\n<\/li>\n<li>Objektmodel tilg\u00e6ngelig for udviklere p\u00e5 klientsiden (over 400 typer: objektmodel for den administrerede gr\u00e6nseflade, dataopstillingsindstillinger, betinget formatering osv.)<\/li>\n<li>Fortolker til det indbyggede sprog 1C<\/li>\n<li>Browserudvidelser (bruges til funktionalitet, der ikke underst\u00f8ttes i JavaScript)\n<ul>\n<li>Arbejder med kryptografi<\/li>\n<li>Arbejde med filer<\/li>\n<li>Teknologi til eksterne komponenter, der g\u00f8r det muligt at bruge dem i b\u00e5de den tynde og webklient<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p><\/p>\n<h3>Funktioner ved udvikling<\/h3>\n<p>\nImplementeringen af alt det ovenfor beskrevne i JavaScript er en udfordrende opgave. M\u00e5ske er 1C webklient en af de st\u00f8rste client-side applikationer skrevet i JavaScript \u2013 omkring 450.000 linjer. Vi bruger en objektorienteret tilgang i vores webklientkode, hvilket forenkler arbejdet med et s\u00e5 stort projekt.<\/p>\n<p>For at minimere st\u00f8rrelsen af klientskoden brugte vi oprindeligt vores egen obfuskator, og fra version 8.3.6 (oktober 2014) begyndte vi at bruge <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Google_Closure_Tools#Closure_Compiler\">Google Closure Compiler<\/a><\/noindex>. Effekten af anvendelsen i tal \u2013 st\u00f8rrelsen af webklientens ramme efter obfuskation:<\/p>\n<ul>\n<li>Egen obfuskator \u2013 1556 kB<\/li>\n<li>Google Closure Compiler \u2013 1073 kB<\/li>\n<\/ul>\n<p>\nBrugen af Google Closure Compiler har hjulpet os med at \u00f8ge hastigheden p\u00e5 webklienten med 30% sammenlignet med vores egen obfuskator. Desuden er m\u00e6ngden af hukommelse, der bruges af applikationen, reduceret med 15-25% (afh\u00e6ngigt af browseren).<\/p>\n<p>Google Closure Compiler fungerer meget godt med objektorienteret kode, hvilket g\u00f8r dens effektivitet til webklienten maksimal. Closure Compiler g\u00f8r flere gode ting for os:<\/p>\n<ul>\n<li>Statisk typekontrol p\u00e5 tidspunktet for projektbygning (sikret ved at vi d\u00e6kker koden med JSDoc-annoteringer). Dette resulterer i statisk typificering, der er meget t\u00e6t p\u00e5 typificeringen i C++. Det hj\u00e6lper med at fange et ret stort procentdel af fejlene p\u00e5 kompileringstidspunktet.<\/li>\n<li>Reduceret kodel\u00e6ngde gennem obfuskation<\/li>\n<li>R\u00e6kken af optimeringer af den udf\u00f8rte kode, for eksempel som:\n<ul>\n<li>Inline-funktioner. At kalde en funktion i JavaScript er en relativt omkostningstung operation, og inline-implementering af ofte brugte sm\u00e5 metoder kan betydeligt fremskynde kodek\u00f8rslen.<\/li>\n<li>Konstantberegning ved kompilering. Hvis et udtryk afh\u00e6nger af en konstant, vil den faktiske v\u00e6rdi af konstanten blive indsat.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>\nSom udviklingsmilj\u00f8 for webklienten bruger vi WebStorm.<\/p>\n<p>Til kodeanalyse anvender vi <noindex><a rel=\"nofollow\" href=\"http:\/\/www.sonarqube.org\/\">SonarQube<\/a><\/noindex>, hvor vi integrerer statiske kodeanalysatorer. Ved hj\u00e6lp af analysatorerne overv\u00e5ger vi forringelsen af kvaliteten af kildekoden i JavaScript og fors\u00f8ger at undg\u00e5 det.<\/p>\n<p><img decoding=\"async\" alt=\"Om webklienten 1C\" src=\"\/wp-content\/uploads\/2019\/04\/886fe89a8c12d29d940b6b59316ea627.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3>Hvilke opgaver har vi l\u00f8st\/ l\u00f8ser?<\/h3>\n<p>\nUnder projektets gennemf\u00f8relse st\u00f8dte vi p\u00e5 en r\u00e6kke interessante opgaver, som vi m\u00e5tte l\u00f8se.<\/p>\n<h4>Dataudveksling med serveren og mellem vinduerne.<\/h4>\n<p>\nDer er situationer, hvor obfuskeret kildekode kan forstyrre systemets funktion. Koden, der er ekstern i forhold til den udf\u00f8rende kode i webklienten, kan p\u00e5 grund af obfuskering have funktions- og parameter-navne, der adskiller sig fra dem, som vores udf\u00f8rende kode forventer. Den eksterne kode for os er:<\/p>\n<ul>\n<li>Koden, der kommer fra serveren i form af datakonstruktioner.<\/li>\n<li>Koden fra et andet vindue i applikationen.<\/li>\n<\/ul>\n<p>\nFor at undg\u00e5 obfuskering ved interaktion med serveren bruger vi 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>\nOg for at undg\u00e5 obfuskering ved interaktion med andre vinduer bruger vi s\u00e5kaldte eksporterede gr\u00e6nseflader (gr\u00e6nseflader, hvor alle metoder er eksporterede).<\/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 brugte Virtual DOM, f\u00f8r det blev mainstream.<\/h4>\n<p>\nSom alle udviklere, der arbejder med komplekse web-UI'er, inds\u00e5 vi hurtigt, at DOM ikke er velegnet til at arbejde med dynamiske brugergr\u00e6nseflader. N\u00e6sten med det samme blev der implementeret en analog til Virtual DOM for at optimere arbejdet med UI. Under behandlingen af begivenheden gemmes alle DOM-\u00e6ndringer i hukommelsen, og f\u00f8rst ved afslutningen af alle operationer anvendes de akkumulerede \u00e6ndringer p\u00e5 DOM-tr\u00e6et.<\/p>\n<h4>Optimering af webklientens ydeevne.<\/h4>\n<p>\nFor at f\u00e5 vores webklient til at fungere hurtigere, str\u00e6ber vi efter at udnytte de indbyggede funktioner i browseren (CSS osv.) s\u00e5 meget som muligt. S\u00e5ledes tegnes kontrolpanelet i formularen (placeres praktisk talt p\u00e5 hver formular i applikationen) udelukkende ved hj\u00e6lp af browserens funktioner, med dynamisk layout baseret p\u00e5 CSS.<\/p>\n<p><img decoding=\"async\" alt=\"Om webklienten 1C\" src=\"\/wp-content\/uploads\/2019\/04\/116261ca79218eaa2bee9a4f5104092b.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h4>Testning<\/h4>\n<p>\nTil funktionel test og ydelsestest bruger vi et v\u00e6rkt\u00f8j, vi selv har udviklet (skrevet i Java og C++), samt en testsamling baseret p\u00e5 <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/Selenium\">Selenium<\/a><\/noindex>.<\/p>\n<p>Vores v\u00e6rkt\u00f8j er alsidigt \u2013 det g\u00f8r det muligt at teste n\u00e6sten enhver desktop-applikation og er derfor egnet til b\u00e5de test af tynde klienter og webklienter. V\u00e6rkt\u00f8jet optager handlingerne fra brugeren, der har startet applikationen \"1C\", i en scriptfil. Samtidig optages billeder af skrivebordets arbejdsomr\u00e5de som referencebilleder. N\u00e5r der kontrolleres nye versioner af webklienten, afspilles scripts uden brugerens deltagelse. Hvis sk\u00e6rmbilledet ikke stemmer overens med referencen p\u00e5 et hvilket som helst trin, betragtes testen som mislykket, hvorefter en kvalitetsansvarlig foretager en unders\u00f8gelse \u2013 for at afg\u00f8re, om det er en fejl eller en planlagt \u00e6ndring af systemets adf\u00e6rd. I tilf\u00e6lde af planlagt adf\u00e6rd erstattes referencen automatisk med nye.<\/p>\n<p>V\u00e6rkt\u00f8jet udf\u00f8rer ogs\u00e5 ydelsesm\u00e5linger af applikationerne med en n\u00f8jagtighed p\u00e5 25 millisekunder. I visse tilf\u00e6lde cirkulerer vi dele af scriptet (f.eks. gentager vi ordreindl\u00e6g flere gange) for at analysere forringelsen af udf\u00f8relsestiden over tid. Resultaterne af alle m\u00e5linger registreres i en log til analyse.<\/p>\n<p><img decoding=\"async\" alt=\"Om webklienten 1C\" src=\"\/wp-content\/uploads\/2019\/04\/058bab976becf6fd38b2ec668492043b.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<b>Vores testv\u00e6rkt\u00f8j og den testede applikation<\/b><\/p>\n<p>Vores v\u00e6rkt\u00f8j og Selenium supplerer hinanden; for eksempel, hvis en knap p\u00e5 en af sk\u00e6rmene har \u00e6ndret position, kan Selenium muligvis ikke registrere dette, men vores v\u00e6rkt\u00f8j vil l\u00e6gge m\u00e6rke til det, da det udf\u00f8rer pixel-til-pixel sammenligning mellem sk\u00e6rmbilledet og referencen. V\u00e6rkt\u00f8jet kan ogs\u00e5 opdage problemer med behandlingen af input fra tastatur eller mus, da det netop reproducerer disse.<\/p>\n<p>Testene p\u00e5 begge v\u00e6rkt\u00f8jer (vores og Selenium) k\u00f8rer standard arbejdsflows fra vores applikationsl\u00f8sninger. Testene startes automatisk efter den daglige bygning af platformen \"1C:Enterprise\". Hvis der er en forsinkelse i workflows (sammenlignet med den tidligere bygning), gennemf\u00f8rer vi en unders\u00f8gelse og fjerner \u00e5rsagen til forsinkelsen. Vores kriterium er simpelt \u2013 den nye bygning skal ikke v\u00e6re langsommere end den forrige.<\/p>\n<p>Til unders\u00f8gelse af h\u00e6ndelser med forsinket arbejde bruger udviklerne forskellige v\u00e6rkt\u00f8jer; prim\u00e6rt anvendes <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> produktionsselskab <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Dynatrace\">DynaTrace<\/a><\/noindex>. Der foretages optagelse af logs for udf\u00f8relsen af den problematiske operation i den tidligere og den nye version, hvorefter loggene analyseres. Her kan udf\u00f8relsestiden for enkelte operationer (i millisekunder) muligvis ikke v\u00e6re en afg\u00f8rende faktor \u2013 i browseren k\u00f8rer der periodisk serviceprocesser som oprydning, der kan p\u00e5virke udf\u00f8relsestiden for funktioner og forvride billedet. De mere relevante parametre i dette tilf\u00e6lde vil v\u00e6re antallet af udf\u00f8rte JavaScript-kommandoer, antallet af atomiske operationer p\u00e5 DOM osv. Hvis antallet af kommandoer\/operationer i det samme scenarie i den nye version er steget \u2013 betyder det n\u00e6sten altid en reduktion i ydeevne, som skal rettes.<\/p>\n<p>En anden \u00e5rsag til reduktionen i ydeevne kan v\u00e6re, at Google Closure Compiler af en eller anden grund ikke kunne udf\u00f8re inline-udskiftningen af en funktion (f.eks. fordi funktionen er rekursiv eller virtuel). I dette tilf\u00e6lde fors\u00f8ger vi at rette situationen ved at omskrive kildekoden.<\/p>\n<h3>Browserudvidelser<\/h3>\n<p>\nN\u00e5r den applikationsm\u00e6ssige l\u00f8sning har brug for funktionalitet, som ikke findes i JavaScript, bruger vi browserudvidelser:<\/p>\n<ul>\n<li>til h\u00e5ndtering af filer<\/li>\n<li>til arbejde med kryptografi<\/li>\n<li>arbejde med <noindex><a rel=\"nofollow\" href=\"http:\/\/v8.1c.ru\/overview\/Term_000000545.htm\">eksterne komponenter<\/a><\/noindex><\/li>\n<\/ul>\n<p>\nVores udvidelser best\u00e5r af to dele. Den f\u00f8rste del er det, der kaldes en browserudvidelse (typisk udvidelser skrevet i JavaScript til Chrome og Firefox), som interagerer med den anden del \u2013 en bin\u00e6r udvidelse, der implementerer den funktionalitet, vi har brug for. Det skal n\u00e6vnes, at vi skriver 3 versioner af de bin\u00e6re udvidelser \u2013 til Windows, Linux og MacOS. Den bin\u00e6re udvidelse leveres som en del af platformen 1C:Enterprise og findes p\u00e5 1C-applikationsserveren. Ved f\u00f8rste opkald fra webklienten indl\u00e6ses den p\u00e5 klientcomputeren og installeres i browseren.<\/p>\n<p>N\u00e5r man arbejder i Safari, bruger vores udvidelser NPAPI, mens de i Internet Explorer bruger ActiveX-teknologien. <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/Microsoft_Edge\">Microsoft Edge<\/a><\/noindex> underst\u00f8tter endnu ikke udvidelser, s\u00e5 webklienten fungerer med begr\u00e6nsninger.<\/p>\n<h3>Fremtidig udvikling<\/h3>\n<p>\nEn af opgavegrupperne for teamet bag webklienten er at videreudvikle funktionaliteten. Funktionaliteten i webklienten skal v\u00e6re identisk med funktionaliteten i den tynde klient, og al ny funktionalitet implementeres samtidig i begge klienter.<\/p>\n<p>Andre opgaver inkluderer udvikling af arkitektur, refactoring, samt forbedring af ydeevne og p\u00e5lidelighed. Et eksempel p\u00e5 dette er den fortsatte bev\u00e6gelse mod en asynkron arbejdsm\u00e5de. En del af funktionaliteten i webklienten er i \u00f8jeblikket bygget p\u00e5 en synkron model for interaktion med serveren. Den asynkrone model bliver nu mere relevant i browsere (og ikke kun i browsere), hvilket tvinger os til at modificere webklienten ved at erstatte synkrone opkald med asynkrone (samt tilh\u00f8rende refactoring af koden). Den gradvise overgang til en asynkron model skyldes behovet for at st\u00f8tte de frigivne l\u00f8sninger og gradvist tilpasse dem.<br \/>\n<br \/>Kilde: <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.3 - 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\/da\/blog\/administrirovanie\/pro-veb-klient-1s__trashed\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"da_DK\" \/>\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\/da\/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 1C-webklienten | ProHoster","description":"En af de behagelige egenskaber ved 1C:Enterprise teknologien er, at den applikation, der er udviklet ved hj\u00e6lp af kontrollerede formularer, kan k\u00f8res b\u00e5de i den tynde (k\u00f8rende) klient p\u00e5 Windows, Linux og MacOS.","canonical_url":"https:\/\/prohoster.info\/da\/blog\/administrirovanie\/pro-veb-klient-1s__trashed","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"da_DK","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\/da\/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\/da\/wp-json\/wp\/v2\/posts\/32465","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/comments?post=32465"}],"version-history":[{"count":1,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/posts\/32465\/revisions"}],"predecessor-version":[{"id":173305,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/posts\/32465\/revisions\/173305"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/media\/24269"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/media?parent=32465"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/categories?post=32465"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/tags?post=32465"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}