{"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\/ro\/blog\/administrirovanie\/pro-veb-klient-1s__trashed","title":{"rendered":"Despre clientul web 1C","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Una dintre tr\u0103s\u0103turile pl\u0103cute ale tehnologiei 1C:Enterprise este c\u0103 solu\u021bia aplica\u021bional\u0103, dezvoltat\u0103 pe baza tehnologiei formelor gestionate, poate fi rulat\u0103 at\u00e2t \u00een clientul sub\u021bire (executabil) pe Windows, Linux, MacOS X, c\u00e2t \u0219i ca client web pe 5 browsere \u2013 Chrome, Internet Explorer, Firefox, Safari, Edge, toate acestea f\u0103r\u0103 a modifica codul surs\u0103 al aplica\u021biei. Mai mult dec\u00e2t at\u00e2t \u2013 vizual, aplica\u021bia \u00een clientul sub\u021bire \u0219i \u00een browser se comport\u0103 \u0219i arat\u0103 practic identic.<br \/>\nG\u0103si\u021bi 10 diferen\u021be (sub cat, 2 imagini):<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nFereastra clientului sub\u021bire pe Linux:<\/p>\n<p><img decoding=\"async\" alt=\"Despre clientul web 1C\" src=\"\/wp-content\/uploads\/2019\/04\/6a836d01f80f447302e04d1827d5eebb.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nAceea\u0219i fereastr\u0103 \u00een clientul web (\u00een browserul Chrome):<\/p>\n<p><img decoding=\"async\" alt=\"Despre clientul web 1C\" src=\"\/wp-content\/uploads\/2019\/04\/1cab8bdf0d9d1c9d6601219c3ae6018c.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDe ce am creat clientul web? Spus ceva mai pompos, aceast\u0103 sarcin\u0103 ne-a fost impus\u0103 de vremuri. De mult timp, lucrul prin Internet a devenit o condi\u021bie necesar\u0103 pentru aplica\u021biile de afaceri. La \u00eenceput, am ad\u0103ugat posibilitatea de a lucra prin Internet pentru clientul nostru sub\u021bire (unii dintre concuren\u021bii no\u0219tri, de altfel, s-au oprit la acest punct; al\u021bii, dimpotriv\u0103, au renun\u021bat la clientul sub\u021bire \u0219i s-au limitat la implementarea clientului web). Noi am decis s\u0103 oferim utilizatorilor no\u0219tri posibilitatea de a alege varianta de client care li se potrive\u0219te cel mai bine.<\/p>\n<p><img decoding=\"async\" alt=\"Despre clientul web 1C\" src=\"\/wp-content\/uploads\/2019\/04\/345d070d695cfc4854c485148d22d24c.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nAd\u0103ugarea posibilit\u0103\u021bii de a lucra prin Internet pentru clientul sub\u021bire a fost un proiect mare, av\u00e2nd o schimbare complet\u0103 a arhitecturii interac\u021biunii client-server. Crearea clientului web a fost un proiect complet nou, \u00eenceput de la zero.<\/p>\n<h3>Formularea problemei<\/h3>\n<p>\nA\u0219adar, cerin\u021bele pentru proiect sunt: clientul web trebuie s\u0103 \u00eendeplineasc\u0103 acelea\u0219i func\u021bii ca \u0219i clientul sub\u021bire, mai precis:<\/p>\n<ol>\n<li>Afi\u0219area interfe\u021bei utilizatorului<\/li>\n<li>Executarea codului clientului, scris \u00een limbajul 1C<\/li>\n<\/ol>\n<p>\nInterfa\u021ba utilizatorului \u00een 1C este descris\u0103 \u00een editorul vizual, dar declarativ, f\u0103r\u0103 a plasa elementele pixel cu pixel; se utilizeaz\u0103 aproximativ trei zeci de tipuri de elemente de interfa\u021b\u0103 \u2013 butoane, c\u00e2mpuri de introducere (text, numerice, dat\u0103\/timp), liste, tabele, grafice etc. <\/p>\n<p>Codul clientului \u00een limbajul 1C poate con\u021bine apeluri c\u0103tre server, lucrul cu resurse locale (fi\u0219iere etc.), imprimare \u0219i multe altele.<\/p>\n<p>At\u00e2t clientul sub\u021bire (c\u00e2nd lucreaz\u0103 prin web), c\u00e2t \u0219i clientul web folosesc acela\u0219i set de servicii web pentru a comunica cu serverul aplica\u021biilor 1C. Implementarea la clien\u021bi este, desigur, diferit\u0103 \u2013 clientul sub\u021bire este scris \u00een C++, iar clientul web \u2013 \u00een JavaScript.<\/p>\n<h3>Pu\u021bin istorie<\/h3>\n<p>\nProiectul de creare a clientului web a \u00eenceput \u00een 2006, av\u00e2nd o echip\u0103 medie de 5 persoane. \u00cen anumite etape ale proiectului, au fost implica\u021bi dezvoltatori pentru implementarea unor func\u021bionalit\u0103\u021bi specifice (documente tabelare, diagrame etc.); de obicei, ace\u0219tia erau aceia\u0219i dezvoltatori care realizau acele func\u021bionalit\u0103\u021bi \u00een clientul sub\u021bire. Deci, dezvoltatorii au scris din nou \u00een JavaScript componentele pe care le creaser\u0103 anterior \u00een C++.<\/p>\n<p>\u00cenc\u0103 de la \u00eenceput, am respins ideea oric\u0103rei conversii automate (chiar \u0219i par\u021biale) a codului C++ al clientului sub\u021bire \u00een JavaScript pentru clientul web din cauza diferentelor conceptuale semnificative dintre cele dou\u0103 limbaje; clientul web a fost scris \u00een JavaScript de la zero.<\/p>\n<p>\u00cen primele itera\u021bii ale proiectului, clientul web convertit codul clientului scris \u00een limbajul \u00eencorporat 1C direct \u00een JavaScript. Clientul sub\u021bire func\u021bioneaz\u0103 diferit \u2014 codul \u00een limbajul \u00eencorporat 1C este compilat \u00een bytecode \u0219i apoi acest bytecode este interpretat pe client. Ulterior, clientul web a \u00eenceput s\u0103 fac\u0103 la fel \u2013 mai \u00eent\u00e2i, acest lucru a adus un c\u00e2\u0219tig \u00een performan\u021b\u0103, iar \u00een al doilea r\u00e2nd \u2013 a permis unificarea arhitecturii clientului sub\u021bire \u0219i a clientului web.<\/p>\n<p>Prima versiune a platformei 1C:Enterprise cu suport pentru clientul web a fost lansat\u0103 \u00een 2009. La acel moment, clientul web suporta 2 browsere \u2013 Internet Explorer \u0219i Firefox. \u00cen planurile ini\u021biale era inclus\u0103 \u0219i suportul pentru Opera, dar din cauza unor probleme insurmontabile la acel moment cu gestionarii de \u00eenchidere a aplica\u021biei \u00een Opera (nu se reu\u0219ea cu o siguran\u021b\u0103 de 100% s\u0103 se urm\u0103reasc\u0103 \u00eenchiderea aplica\u021biei \u0219i \u00een acel moment s\u0103 se efectueze procedura de deconectare de la serverul de aplica\u021bii 1C) a fost necesar s\u0103 renun\u021b\u0103m la aceste planuri.<\/p>\n<h3>Structura proiectului<\/h3>\n<p>\n\u00cen total, platforma 1C:Enterprise are 4 proiecte scrise \u00een JavaScript:<\/p>\n<ol>\n<li>WebTools \u2013 biblioteci comune utilizate de celelalte proiecte (aici includem <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Google_Closure_Tools#Closure_Library\">Google Closure Library<\/a><\/noindex>).<\/li>\n<li>Element de control <noindex><a rel=\"nofollow\" href=\"http:\/\/v8.1c.ru\/overview\/Term_000000785.htm\">DocumentFormatat<\/a><\/noindex> (implementat at\u00e2t \u00een JavaScript, c\u00e2t \u0219i \u00een clientul sub\u021bire, c\u00e2t \u0219i \u00een clientul web)<\/li>\n<li>Element de control <noindex><a rel=\"nofollow\" href=\"https:\/\/wonderland.v8.1c.ru\/blog\/planirovshchik\/\">Planificatorul de sarcini din Airflow este construit pe<\/a><\/noindex> (implementat at\u00e2t \u00een JavaScript, c\u00e2t \u0219i \u00een clientul sub\u021bire, c\u00e2t \u0219i \u00een clientul web)<\/li>\n<li>Client web<\/li>\n<\/ol>\n<p>\nStructura fiec\u0103rui proiect se aseam\u0103n\u0103 cu structura proiectelor Java (sau a proiectelor .NET \u2013 fiecare cu ceea ce \u00eei este mai familiar); avem spa\u021bii de nume, iar fiecare spa\u021biu de nume se afl\u0103 \u00eentr-un folder separat. \u00cen interiorul folderului se afl\u0103 fi\u0219ierele \u0219i clasele spa\u021biului de nume. \u00cen proiectul clientului web sunt aproximativ 1000 de fi\u0219iere.<\/p>\n<p>Structura clientului web este \u00eemp\u0103r\u021bit\u0103 \u00een urm\u0103toarele subsisteme:<\/p>\n<ul>\n<li>Interfa\u021ba gestionat\u0103 a aplica\u021biei client\n<ul>\n<li>Interfa\u021ba general\u0103 a aplica\u021biei (meniuri de sistem, panouri)<\/li>\n<li>Interfa\u021ba formularelor gestionate, inclusiv aproximativ 30 de elemente de control (buton, diverse tipuri de c\u00e2mpuri de introducere \u2013 text, numeric, dat\u0103\/or\u0103 etc., tabele, liste, grafice etc.)<\/li>\n<\/ul>\n<p>\n<\/li>\n<li>Modelul obiectual disponibil pentru dezvoltatori pe client (\u00een total peste 400 de tipuri: modelul obiectual al interfe\u021bei gestionate, configura\u021biile aranjamentului de date, formatarea condi\u021bionat\u0103 etc.)<\/li>\n<li>Interpretul limbajului \u00eencorporat 1C<\/li>\n<li>Extensii de browser (utilizate pentru func\u021bionalit\u0103\u021bi care nu sunt suportate \u00een JavaScript)\n<ul>\n<li>Lucrul cu criptografia<\/li>\n<li>Lucrul cu fi\u0219ierele<\/li>\n<li>Tehnologia componentelor externe, care permite utilizarea lor at\u00e2t \u00een clientul sub\u021bire, c\u00e2t \u0219i \u00een cel web<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p><\/p>\n<h3>Caracteristici de dezvoltare<\/h3>\n<p>\nImplementarea tuturor celor descrise mai sus \u00een JavaScript este o sarcin\u0103 complex\u0103. Probabil c\u0103 web clientul 1C este una dintre cele mai mari aplica\u021bii client-side scrise \u00een JavaScript \u2013 aproximativ 450.000 de linii. Folosim activ \u00een codul web-clientului o abordare orientat\u0103 pe obiect, care simplific\u0103 lucrul cu un astfel de proiect mare.<\/p>\n<p>Pentru a minimiza dimensiunea codului client, am folosit ini\u021bial propriul nostru obfuscator, iar \u00eencep\u00e2nd cu versiunea platformei 8.3.6 (octombrie 2014), am \u00eenceput s\u0103 folosim <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Google_Closure_Tools#Closure_Compiler\">Google Closure Compiler<\/a><\/noindex>. Efectul utiliz\u0103rii \u00een cifre \u2013 dimensiunea framework-ului clientului web dup\u0103 obfuscare:<\/p>\n<ul>\n<li>Obfuscatorul propriu \u2013 1556 kB<\/li>\n<li>Google Closure Compiler \u2013 1073 kB<\/li>\n<\/ul>\n<p>\nUtilizarea Google Closure Compiler ne-a ajutat s\u0103 \u00eembun\u0103t\u0103\u021bim performan\u021ba clientului web cu 30% \u00een compara\u021bie cu obfuscatorul nostru propriu. \u00cen plus, cu 15-25% (\u00een func\u021bie de browser) a sc\u0103zut volumul de memorie consumat de aplica\u021bie.<\/p>\n<p>Google Closure Compiler func\u021bioneaz\u0103 foarte bine cu codul orientat pe obiect, de aceea eficien\u021ba sa pentru clientul web este maxim\u0103. Closure Compiler face pentru noi c\u00e2teva lucruri bune:<\/p>\n<ul>\n<li>Verificarea static\u0103 a tipurilor \u00een timpul compil\u0103rii proiectului (asigurat\u0103 prin faptul c\u0103 acoperim codul cu anota\u021bii JSDoc). Rezultatul este o tipizare static\u0103, foarte asem\u0103n\u0103toare cu tipizarea din C++. Acest lucru ajut\u0103 la depistarea unui procent semnificativ de erori \u00een etapa de compilare a proiectului.<\/li>\n<li>Reducerea dimensiunii codului prin obfuscare<\/li>\n<li>O serie de optimiz\u0103ri ale codului executat, de exemplu, cele precum:\n<ul>\n<li>substitu\u021biile inline ale func\u021biilor. Apelul unei func\u021bii \u00een JavaScript este o opera\u021biune destul de costisitoare, iar substitu\u021biile inline ale metodelor mici utilizate frecvent accelereaz\u0103 semnificativ execu\u021bia codului.<\/li>\n<li>Calculul constantelor \u00een timpul compil\u0103rii. Dac\u0103 expresia depinde de o constant\u0103, acesta va fi \u00eenlocuit cu valoarea real\u0103 a constantei.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>\nCa mediu de dezvoltare pentru clientul web, folosim WebStorm.<\/p>\n<p>Pentru analiza codului folosim <noindex><a rel=\"nofollow\" href=\"http:\/\/www.sonarqube.org\/\">SonarQube<\/a><\/noindex>, unde integr\u0103m analyzer-uri statice de cod. Folosind aceste analiza\u0306ri, monitoriz\u0103m degradarea calit\u0103\u021bii codului surs\u0103 \u00een JavaScript \u0219i \u00eencerc\u0103m s\u0103 o evit\u0103m.<\/p>\n<p><img decoding=\"async\" alt=\"Despre clientul web 1C\" src=\"\/wp-content\/uploads\/2019\/04\/886fe89a8c12d29d940b6b59316ea627.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3>Ce probleme am rezolvat\/rezolv\u0103m<\/h3>\n<p>\n\u00cen timpul implement\u0103rii proiectului, ne-am confruntat cu o serie de probleme interesante pe care a trebuit s\u0103 le rezolv\u0103m.<\/p>\n<h4>Schimbul de date cu serverul \u0219i \u00eentre ferontele<\/h4>\n<p>\nExist\u0103 situa\u021bii \u00een care obfusca\u021bia codului surs\u0103 poate \u00eempiedica func\u021bionarea sistemului. Codul extern fa\u021b\u0103 de codul executabil al clientului web, ca urmare a obfusc\u0103rii, poate avea denumiri de func\u021bii \u0219i parametri diferite de cele a\u0219teptate de codul nostru executabil. Codul extern pentru noi este:<\/p>\n<ul>\n<li>Codul care vine de pe server sub form\u0103 de structuri de date<\/li>\n<li>Codul dintr-o alt\u0103 fereastr\u0103 a aplica\u021biei<\/li>\n<\/ul>\n<p>\nPentru a evita obfusca\u021bia \u00een timpul interac\u021biunii cu serverul, folosim tag-ul @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>\nIar pentru a evita obfusca\u021bia \u00een timpul interac\u021biunii cu alte ferontele, folosim a\u0219a-numitele interfe\u021be exportabile (interfe\u021be ale c\u0103ror metode sunt complet exportabile).<\/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>Am folosit Virtual DOM \u00eenainte de a deveni mainstream)<\/h4>\n<p>\nCa to\u021bi dezvoltatorii care se ocup\u0103 de UI web complex, ne-am dat seama rapid c\u0103 DOM nu este potrivit pentru interfe\u021be de utilizator dinamice. Practic, imediat a fost implementat un analog al Virtual DOM pentru optimizarea lucrului cu UI. \u00cen procesul de gestionare a evenimentelor, toate modific\u0103rile DOM sunt memorate \u00een memorie \u0219i, abia dup\u0103 finalizarea tuturor opera\u021biunilor, modific\u0103rile acumulate sunt aplicate arborelui DOM.<\/p>\n<h4>Optimizarea func\u021bion\u0103rii clientului web<\/h4>\n<p>\nPentru ca clientul nostru web s\u0103 func\u021bioneze mai repede, ne str\u0103duim s\u0103 maximiz\u0103m utilizarea capacit\u0103\u021bilor native ale browserului (CSS etc.). Astfel, panoul de comenzi al formularului (situat practic pe fiecare formular al aplica\u021biei) este redat exclusiv prin intermediul browserului, cu design dinamic bazat pe CSS.<\/p>\n<p><img decoding=\"async\" alt=\"Despre clientul web 1C\" src=\"\/wp-content\/uploads\/2019\/04\/116261ca79218eaa2bee9a4f5104092b.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h4>Testare<\/h4>\n<p>\nPentru testarea func\u021bional\u0103 \u0219i a performan\u021bei, folosim un instrument dezvoltat intern (scris \u00een Java \u0219i C++), precum \u0219i un set de teste bazate pe <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/Selenium\">Selenium<\/a><\/noindex>.<\/p>\n<p>Instrumentul nostru este versatil \u2013 permite testarea aproape oric\u0103ror aplica\u021bii de tip desktop, fiind astfel potrivit at\u00e2t pentru testarea clien\u021bilor sub\u021biri, c\u00e2t \u0219i pentru clien\u021bii web. Instrumentul \u00eenregistreaz\u0103 ac\u021biunile utilizatorului care a rulat aplica\u021bia \"1C\" \u00eentr-un fi\u0219ier-scenariu. \u00cen acela\u0219i timp, se realizeaz\u0103 \u00eenregistrarea imaginilor zonei de lucru a ecranului \u2013 etaloanele. C\u00e2nd se controleaz\u0103 noile versiuni ale clientului web, scenariile sunt rulate f\u0103r\u0103 interven\u021bia utilizatorului. \u00cen caz de neconcordan\u021b\u0103 a ecranului cu etalonul la orice pas, testul este considerat e\u0219uat, dup\u0103 care un specialist \u00een calitate efectueaz\u0103 o investiga\u021bie \u2013 este o eroare sau o modificare planificat\u0103 a comportamentului sistemului. \u00cen cazul unui comportament planificat, etaloanele sunt \u00eenlocuite automat cu altele noi.<\/p>\n<p>Instrumentul efectueaz\u0103, de asemenea, m\u0103sur\u0103tori ale performan\u021bei aplica\u021biilor cu o precizie de 25 de milisecunde. \u00cen anumite situa\u021bii, recircul\u0103m p\u0103r\u021bi ale scenariului (de exemplu, rul\u00e2nd de mai multe ori introducerea unei comenzi) pentru a analiza degradarea timpului de execu\u021bie \u00een timp. Rezultatele tuturor m\u0103sur\u0103torilor sunt \u00eenregistrate \u00eentr-un jurnal pentru analiz\u0103.<\/p>\n<p><img decoding=\"async\" alt=\"Despre clientul web 1C\" src=\"\/wp-content\/uploads\/2019\/04\/058bab976becf6fd38b2ec668492043b.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<b>Instrumentul nostru de testare \u0219i aplica\u021bia testat\u0103<\/b><\/p>\n<p>Instrumentul nostru \u0219i Selenium se completeaz\u0103 reciproc; de exemplu, dac\u0103 un buton de pe unul dintre ecrane \u0219i-a schimbat loca\u021bia \u2013 Selenium nu poate monitoriza acest lucru, dar instrumentul nostru va observa, deoarece efectueaz\u0103 o compara\u021bie pixel cu pixel a ecranului cu etalonul. De asemenea, instrumentul este capabil s\u0103 detecteze probleme cu procesarea input-ului de la tastatur\u0103 sau mouse, dat fiind c\u0103 acestea sunt exact ce reproduce.<\/p>\n<p>Testele din ambele instrumente (al nostru \u0219i Selenium) ruleaz\u0103 scenarii tipice de func\u021bionare din solu\u021biile noastre aplica\u021bionale. Testele sunt lansate automat dup\u0103 construirea zilnic\u0103 a platformei \"1C:Enterprise\". \u00cen cazul \u00eencetinirii execu\u021biei scenariilor (comparativ cu construc\u021bia anterioar\u0103), efectu\u0103m o investiga\u021bie \u0219i remediem cauza \u00eencetinirii. Criteriul nostru este simplu \u2013 noua construc\u021bie trebuie s\u0103 func\u021bioneze nu mai lent dec\u00e2t cea anterioar\u0103.<\/p>\n<p>Pentru investigarea incidentelor de \u00eencetinire a func\u021bion\u0103rii, dezvoltatorii utilizeaz\u0103 diferite instrumente; \u00een principal se utilizeaz\u0103 <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> produc\u021bie a companiei <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Dynatrace\">DynaTrace<\/a><\/noindex>. Se realizeaz\u0103 \u00eenregistrarea jurnalelor de execu\u021bie pentru opera\u021biunea problematic\u0103 \u00een versiunea anterioar\u0103 \u0219i \u00een noua versiune, apoi jurnalele sunt analizate. \u00cen acest caz, timpul de execu\u021bie al opera\u021biunilor individuale (\u00een milisecunde) poate s\u0103 nu fie un factor decisiv \u2013 \u00een browser se lanseaz\u0103 periodic procese de \u00eentre\u021binere cum ar fi cur\u0103\u021barea memoriei, care pot influen\u021ba timpul de execu\u021bie al func\u021biilor \u0219i deforma imaginea. Parametrii mai relevan\u021bi \u00een acest caz vor fi num\u0103rul de instruc\u021biuni JavaScript executate, num\u0103rul de opera\u021bii atomice asupra DOM etc. Dac\u0103 num\u0103rul de instruc\u021biuni\/opera\u021bii \u00eentr-un acela\u0219i scenariu \u00een noua versiune a crescut \u2013 aceasta \u00eenseamn\u0103 aproape \u00eentotdeauna o c\u0103dere a performan\u021bei, care trebuie corectat\u0103.<\/p>\n<p>De asemenea, una dintre cauzele sc\u0103derii performan\u021bei poate fi c\u0103 Google Closure Compiler nu a reu\u0219it dintr-un anumit motiv s\u0103 fac\u0103 substitu\u021bia inline a func\u021biei (de exemplu, deoarece func\u021bia este recursiv\u0103 sau virtual\u0103). \u00cen acest caz, \u00eencerc\u0103m s\u0103 corect\u0103m situa\u021bia, rescriind codul surs\u0103.<\/p>\n<h3>Extensii de browser<\/h3>\n<p>\n\u00cen cazul \u00een care solu\u021bia aplica\u021biei are nevoie de func\u021bionalitate care nu este disponibil\u0103 \u00een JavaScript, folosim extensii de browser:<\/p>\n<ul>\n<li>pentru lucrul cu fi\u0219iere<\/li>\n<li>pentru lucrul cu criptografie<\/li>\n<li>lucreaz\u0103 cu <noindex><a rel=\"nofollow\" href=\"http:\/\/v8.1c.ru\/overview\/Term_000000545.htm\">componente externe<\/a><\/noindex><\/li>\n<\/ul>\n<p>\nExtensiile noastre constau \u00een dou\u0103 p\u0103r\u021bi. Prima parte \u2013 ceea ce se nume\u0219te extensie de browser (de obicei, extensii scrise \u00een JavaScript pentru Chrome \u0219i Firefox), care interac\u021bioneaz\u0103 cu a doua parte \u2013 extensia binary, care realizeaz\u0103 func\u021bionalitatea necesar\u0103. Trebuie men\u021bionat c\u0103 scriem 3 versiuni ale extensiilor binare \u2013 pentru Windows, Linux \u0219i MacOS. Extensia binar\u0103 este livrat\u0103 \u00eempreun\u0103 cu platforma 1C:Enterprise \u0219i se afl\u0103 pe serverul aplica\u021biei 1C. La prima apelare din clientul web, aceasta este desc\u0103rcat\u0103 pe computerul client \u0219i instalat\u0103 \u00een browser.<\/p>\n<p>C\u00e2nd lucr\u0103m \u00een Safari, extensiile noastre folosesc NPAPI, \u00een timp ce \u00een Internet Explorer folosesc tehnologia ActiveX. <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/Microsoft_Edge\">Microsoft Edge<\/a><\/noindex> pentru c\u0103 nu suport\u0103 extensii, astfel \u00eenc\u00e2t clientul web \u00een acesta func\u021bioneaz\u0103 cu restric\u021bii.<\/p>\n<h3>Dezvoltarea ulterioar\u0103<\/h3>\n<p>\nUnul dintre grupurile de sarcini pentru echipa de dezvoltare a clientului web este extinderea func\u021bionalit\u0103\u021bii. Func\u021bionalitatea clientului web trebuie s\u0103 fie identic\u0103 cu cea a clientului sub\u021bire, toat\u0103 noua func\u021bionalitate fiind implementat\u0103 simultan at\u00e2t \u00een clientul sub\u021bire, c\u00e2t \u0219i \u00een cel web.<\/p>\n<p>Alte sarcini includ dezvoltarea arhitecturii, refactorizarea, cre\u0219terea performan\u021bei \u0219i fiabilit\u0103\u021bii. De exemplu, o direc\u021bie este avansarea c\u0103tre un model de lucru asincron. O parte din func\u021bionalitatea clientului web este construit\u0103 \u00een prezent pe un model de interac\u021biune sincron cu serverul. Modelul asincron devine acum mai relevant \u00een browsere (\u0219i nu doar \u00een browsere), impun\u00e2ndu-ne s\u0103 modific\u0103m clientul web prin \u00eenlocuirea apelurilor sincrone cu cele asincrone (\u0219i s\u0103 efectu\u0103m refactorizarea corespunz\u0103toare a codului). Trecerea treptat\u0103 la modelul asincron este justificat\u0103 de necesitatea de a sus\u021bine solu\u021biile lansate \u0219i de adaptarea lor treptat\u0103.<br \/>\n<br \/>Sursa: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/1c\/blog\/315414\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041e\u0434\u043d\u043e\u0439 \u0438\u0437 \u043f\u0440\u0438\u044f\u0442\u043d\u044b\u0445 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0435\u0439 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0438 1\u0421:\u041f\u0440\u0435\u0434\u043f\u0440\u0438\u044f\u0442\u0438\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0442\u043e, \u0447\u0442\u043e \u043f\u0440\u0438\u043a\u043b\u0430\u0434\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435, \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u043e\u0435 \u043f\u043e \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c\u044b\u0445 \u0444\u043e\u0440\u043c, \u043c\u043e\u0436\u0435\u0442 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c\u0441\u044f \u043a\u0430\u043a \u0432 \u0442\u043e\u043d\u043a\u043e\u043c (\u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u043c\u043e\u043c) \u043a\u043b\u0438\u0435\u043d\u0442\u0435 \u043f\u043e\u0434 Windows, Linux, MacOS X, \u0442\u0430\u043a \u0438 \u043a\u0430\u043a \u0432\u0435\u0431-\u043a\u043b\u0438\u0435\u043d\u0442 \u043f\u043e\u0434 5 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u043e\u0432 \u2013 Chrome, Internet Explorer, Firefox, Safari, Edge, \u0438 \u0432\u0441\u0435 \u044d\u0442\u043e \u2013 \u0431\u0435\u0437 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u0411\u043e\u043b\u0435\u0435 \u0442\u043e\u0433\u043e \u2013 \u0432\u043d\u0435\u0448\u043d\u0435 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":24269,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-32465","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.2.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041e\u0434\u043d\u043e\u0439 \u0438\u0437 \u043f\u0440\u0438\u044f\u0442\u043d\u044b\u0445 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0435\u0439 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0438 1\u0421:\u041f\u0440\u0435\u0434\u043f\u0440\u0438\u044f\u0442\u0438\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0442\u043e, \u0447\u0442\u043e \u043f\u0440\u0438\u043a\u043b\u0430\u0434\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435, \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u043e\u0435 \u043f\u043e \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c\u044b\u0445 \u0444\u043e\u0440\u043c, \u043c\u043e\u0436\u0435\u0442 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c\u0441\u044f \u043a\u0430\u043a \u0432 \u0442\u043e\u043d\u043a\u043e\u043c (\u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u043c\u043e\u043c) \u043a\u043b\u0438\u0435\u043d\u0442\u0435 \u043f\u043e\u0434 Windows, Linux, MacOS.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/ro\/blog\/administrirovanie\/pro-veb-klient-1s__trashed\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"ro_RO\" \/>\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\/ro\/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\udd47Despre clientul web 1C | ProHoster","description":"Una dintre caracteristicile pl\u0103cute ale tehnologiei 1C:Enterprise este c\u0103 solu\u021bia aplica\u021biei, dezvoltat\u0103 pe baza tehnologiei formularelor gestionate, poate fi rulat\u0103 at\u00e2t \u00een clientul sub\u021bire (executabil) pe Windows, Linux, MacOS.","canonical_url":"https:\/\/prohoster.info\/ro\/blog\/administrirovanie\/pro-veb-klient-1s__trashed","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"ro_RO","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\/ro\/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\/ro\/wp-json\/wp\/v2\/posts\/32465","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/comments?post=32465"}],"version-history":[{"count":1,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts\/32465\/revisions"}],"predecessor-version":[{"id":173305,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts\/32465\/revisions\/173305"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/media\/24269"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/media?parent=32465"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/categories?post=32465"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/tags?post=32465"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}