{"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\/sl\/blog\/administrirovanie\/pro-veb-klient-1s__trashed","title":{"rendered":"O spletnem odjemalcu 1C","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Ena od prijetnih lastnosti tehnologije 1C:Podjetje je, da lahko aplikativna re\u0161itev, razvita na podlagi upravljanih obrazcev, deluje tako v tankem (izvr\u0161nem) odjemalcu pod Windows, Linux, MacOS X, kot tudi kot spletni odjemalec v 5 brskalnikih \u2013 Chrome, Internet Explorer, Firefox, Safari, Edge, vse to pa brez spremembe izvorne kode aplikacije. Poleg tega aplikacija v tankem odjemalcu in brskalniku deluje in izgleda skoraj identi\u010dno.<br \/>\nNajdite 10 razlik (pod katom 2 sliki):<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nOkno tanke stranke na Linuxu:<\/p>\n<p><img decoding=\"async\" alt=\"O spletnem odjemalcu 1C\" src=\"\/wp-content\/uploads\/2019\/04\/6a836d01f80f447302e04d1827d5eebb.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nEnako okno v spletnem odjemalcu (v brskalniku Chrome):<\/p>\n<p><img decoding=\"async\" alt=\"O spletnem odjemalcu 1C\" src=\"\/wp-content\/uploads\/2019\/04\/1cab8bdf0d9d1c9d6601219c3ae6018c.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nZakaj smo ustvarili spletni odjemalec? Z nekaj patosa lahko re\u010demo, da je to nalogo postavil \u010das. \u017de dolgo je delo preko interneta postalo nujna zahteva za poslovne aplikacije. Na za\u010detku smo dodali mo\u017enost dela preko interneta za na\u0161 tanki odjemalec (nekateri na\u0161i konkurenti so se mimogrede ustavili pri tem; drugi so se, nasprotno, odpovedali tankemu odjemalcu in se omejili na implementacijo spletnega odjemalca). Odlo\u010dili smo se, da na\u0161im uporabnikom omogo\u010dimo izbiro tiste mo\u017enosti odjemalca, ki najbolje ustreza njihovim potrebam.<\/p>\n<p><img decoding=\"async\" alt=\"O spletnem odjemalcu 1C\" src=\"\/wp-content\/uploads\/2019\/04\/345d070d695cfc4854c485148d22d24c.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDodajanje mo\u017enosti dela preko interneta za tankega odjemalca je bil velik projekt s popolno spremembo arhitekture odjemalec-stre\u017enik. Ustvarjanje spletnega odjemalca pa je povsem nov projekt, ki se je za\u010del iz ni\u010d.<\/p>\n<h3>Definisanje zadatka<\/h3>\n<p>\nTorej, zahteve za projekt: spletni odjemalec mora delovati enako kot tanki odjemalec, torej:<\/p>\n<ol>\n<li>Prikazati uporabni\u0161ki vmesnik<\/li>\n<li>Izvajati odjemalsko kodo, napisano v jeziku 1C<\/li>\n<\/ol>\n<p>\nUporabni\u0161ki vmesnik v 1C je opisan v vizualnem urejevalniku, vendar deklarativno, brez natan\u010dne razporeditve elementov; uporablja se pribli\u017eno trideset vrst elementov vmesnika \u2013 gumbi, vnosi (besedilni, digitalni, datum\/\u010das), seznami, tabele, grafi itd. <\/p>\n<p>Odjemalska koda v jeziku 1C lahko vsebuje stre\u017eni\u0161ke klice, delo z lokalnimi viri (datotekami itd.), tiskanje in \u0161e marsikaj drugega.<\/p>\n<p>Tako tanki odjemalec (pri delu preko spleta) kot tudi spletni odjemalec uporabljata isti nabor spletnih storitev za komunikacijo s stre\u017enikom aplikacij 1C. Implementacija pri odjemalcih je seveda razli\u010dna \u2013 tanki odjemalec je napisan v C++, spletni odjemalec pa v JavaScript.<\/p>\n<h3>Nekaj zgodovine<\/h3>\n<p>\nProjekt za tvorbo spletnega odjemalca se je za\u010del leta 2006, v povpre\u010dju pa je sodelovala ekipa petih oseb. V razli\u010dnih fazah projekta so bili vklju\u010deni razvijalci za izvajanje specifi\u010dne funkcionalnosti (kot so tabelarni dokumenti, diagrami itd.); obi\u010dajno so to bili isti razvijalci, ki so realizirali to funkcionalnost v tankem odjemalcu. To pomeni, da so razvijalci znova napisali komponente v JavaScriptu, ki so jih prej ustvarili v C++.<\/p>\n<p>\u017de na za\u010detku smo zavrnili idejo o kakr\u0161ni koli avtomatski (\u010deprav delni) konverziji C++ kode tankega odjemalca v JavaScript spletnega odjemalca zaradi izrazitih konceptualnih razlik med obema jezikoma; spletni odjemalec je bil pisan v JavaScriptu na praznem listu.<\/p>\n<p>V prvih iteracijah projekta je spletni odjemalec konvertiral odjemalsko kodo v vgrajenem jeziku 1C neposredno v JavaScript. Tanki odjemalec ravna druga\u010de \u2014 koda v vgrajenem jeziku 1C se prevede v bajtno kodo, ki jo nato interpretira odjemalec. Kasneje je tudi spletni odjemalec za\u010del to po\u010deti - najprej je to prineslo zmago v zmogljivosti, drugi\u010d - omogo\u010dilo je poenotenje arhitekture tankega in spletnega odjemalca.<\/p>\n<p>Prva razli\u010dica platforme 1C:Podjetje s podporo za spletni odjemalec je iz\u0161la leta 2009. Spletni odjemalec je takrat podpiral dva brskalnika - Internet Explorer in Firefox. V prvotnih na\u010drtih je bila vklju\u010dena podpora za Opero, vendar smo se zaradi neprehodnih te\u017eav s procesorji zapiranja aplikacij v Operi (ni bilo mogo\u010de z 100% gotovostjo izslediti, kdaj se aplikacija zapre, in v tem trenutku izvesti postopek odklopa od stre\u017enika aplikacij 1C) morali odpovedati tem na\u010drtom.<\/p>\n<h3>Struktura projekta<\/h3>\n<p>\nSkupaj ima platforma 1C:Podjetje 4 projekte, napisane v JavaScriptu:<\/p>\n<ol>\n<li>WebTools \u2013 skupne knji\u017enice, ki jih uporabljajo drugi projekti (sem spada tudi <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Google_Closure_Tools#Closure_Library\">Google Closure Library<\/a><\/noindex>).<\/li>\n<li>Nadzorna komponenta <noindex><a rel=\"nofollow\" href=\"http:\/\/v8.1c.ru\/overview\/Term_000000785.htm\">FormatiranDokument<\/a><\/noindex> (izvedeno v JavaScriptu tako v tankem kot tudi v spletnem odjemalcu)<\/li>\n<li>Nadzorna komponenta <noindex><a rel=\"nofollow\" href=\"https:\/\/wonderland.v8.1c.ru\/blog\/planirovshchik\/\">Planer<\/a><\/noindex> (izvedeno v JavaScriptu tako v tankem kot tudi v spletnem odjemalcu)<\/li>\n<li>Spletni odjemalec<\/li>\n<\/ol>\n<p>\nStruktura vsakega projekta spominja na strukturo Java projektov (ali .NET projektov \u2013 kar je komu bli\u017eje); imamo imenske prostore, vsak imenski prostor se nahaja v lo\u010deni mapi. Znotraj mape so datoteke in razredi imenskega prostora. V projektu spletnega odjemalca je okoli 1000 datotek.<\/p>\n<p>Struktura spletnega odjemalca se na splo\u0161no deli na naslednje podsisteme:<\/p>\n<ul>\n<li>Upravljen vmesnik odjemalske aplikacije\n<ul>\n<li>Splo\u0161ni vmesnik aplikacije (sistemski meniji, panoji)<\/li>\n<li>Vmesnik upravljanih obrazcev, ki vklju\u010duje pribli\u017eno 30 nadzornih elementov (gumbi, razli\u010dne vrste vnosnih polj \u2013 besedilni, digitalni, datum\/\u010das itd., tabele, sezname, grafikone itd.)<\/li>\n<\/ul>\n<p>\n<\/li>\n<li>Objektni model, dostopen razvijalcem na odjemalski strani (skupaj preko 400 tipov: objektni model upravljanega vmesnika, nastavitve razporeditve podatkov, pogojno oblikovanje itd.)<\/li>\n<li>Interpreter vgrajenega jezika 1C<\/li>\n<li>Raz\u0161iritve brskalnikov (zagotavljajo funkcionalnost, ki ni podprta v JavaScriptu)\n<ul>\n<li>Delo s kriptografijo<\/li>\n<li>Delo s datotekami<\/li>\n<li>Tehnologija zunanjih komponent, ki omogo\u010da njihovo uporabo tako v tankem kot tudi spletnem odjemalcu<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p><\/p>\n<h3>Posebnosti razvoja<\/h3>\n<p>\nIzvedba vsega zgoraj opisanega v JavaScriptu \u2013 je precej zahtevna naloga. Morda je spletni odjemalec 1C eno najve\u010djih odjemalskih aplikacij, napisanih v JavaScriptu \u2013 pribli\u017eno 450.000 vrstic. Aktivno uporabljamo objektno usmerjen pristop v kodi spletnega odjemalca, kar poenostavi delo z tako obse\u017enim projektom.<\/p>\n<p>Za zmanj\u0161anje velikosti odjemalske kode smo najprej uporabili svoj lasten obfuskator, od razli\u010dice platforme 8.3.6 (oktober 2014) pa za\u010deli uporabljati <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Google_Closure_Tools#Closure_Compiler\">Google Closure Compiler<\/a><\/noindex>. U\u010dinek uporabe v \u0161tevilkah \u2013 velikost ogrodja spletnega odjemalca po obfuskaciji:<\/p>\n<ul>\n<li>Lasten obfuskator \u2013 1556 kB<\/li>\n<li>Google Closure Compiler \u2013 1073 kB<\/li>\n<\/ul>\n<p>\nUporaba Google Closure Compiler nam je pomagala pove\u010dati hitrost spletnega odjemalca za 30% v primerjavi z na\u0161im lastnim obfuskatorjem. Poleg tega se je za 15-25% (odvisno od brskalnika) zmanj\u0161ala koli\u010dina pomnilnika, ki ga aplikacija zahteva.<\/p>\n<p>Google Closure Compiler zelo dobro deluje z objektno usmerjeno kodo, zato je njegova u\u010dinkovitost za spletni odjemalec izjemno visoka. Closure Compiler za nas izvaja ve\u010d dobrih stvari:<\/p>\n<ul>\n<li>Stati\u010dna preverba tipov v fazi zbiranja projekta (to zagotavljamo z ozna\u010devanjem kode z JSDoc). Na koncu dobimo stati\u010dno tipizacijo, zelo blizu tipizaciji v C++. To pomaga zajeti precej\u0161en dele\u017e napak v fazi prevajanja projekta.<\/li>\n<li>Zmanj\u0161anje velikosti kode preko obfuskacije<\/li>\n<li>Vrsta optimizacij izvr\u0161ilne kode, na primer:\n<ul>\n<li>inline nadomestitve funkcij. Klic funkcije v JavaScriptu je dokaj draga operacija, inline nadomestitve pogosto uporabljenih manj\u0161ih metod pa znatno pospe\u0161ijo delovanje kode.<\/li>\n<li>\u0160tetje konstant v \u010dasu prevajanja. \u010ce izraz temelji na konstantni vrednosti, bo vanj vstavljeno dejansko stanje konstante.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>\nKot okolje za razvoj spletnega odjemalca uporabljamo WebStorm.<\/p>\n<p>Za analizo kode uporabljamo <noindex><a rel=\"nofollow\" href=\"http:\/\/www.sonarqube.org\/\">SonarQube<\/a><\/noindex>, kamor integriramo stati\u010dne analizatorje kode. S pomo\u010djo analizatorjev spremljamo degradacijo kakovosti izvorne kode v JavaScriptu in si prizadevamo, da do tega ne pride.<\/p>\n<p><img decoding=\"async\" alt=\"O spletnem odjemalcu 1C\" src=\"\/wp-content\/uploads\/2019\/04\/886fe89a8c12d29d940b6b59316ea627.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3>Katere naloge smo re\u0161evali\/re\u0161ujemo<\/h3>\n<p>\nMed izvajanjem projekta smo se soo\u010dili z vrsto zanimivih nalog, ki smo jih morali re\u0161iti.<\/p>\n<h4>Izmenjava podatkov s stre\u017enikom in med okni<\/h4>\n<p>\nObstajajo situacije, kjer lahko obfuskacija izvorne kode ovira delovanje sistema. Koda, zunanja glede na izvr\u0161no kodo spletnega odjemalca, lahko zaradi obfuskacije vsebuje imena funkcij in parametrov, ki se razlikujejo od tistih, ki jih na\u0161a izvr\u0161na koda pri\u010dakuje. Zunanja koda za nas vklju\u010duje:<\/p>\n<ul>\n<li>Koda, ki prihaja s stre\u017enika v obliki strukturiranih podatkov<\/li>\n<li>Koda drugega okna aplikacije<\/li>\n<\/ul>\n<p>\nDa bi se izognili obfuskaciji pri interakciji s stre\u017enikom, uporabljamo oznako @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>\nIn da bi se izognili obfuskaciji pri interakciji z drugimi okni, uporabljamo tako imenovane eksportne vmesnike (vmesniki, katerih vse metode so izvozene).<\/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>Preden je bil Virtual DOM splo\u0161no sprejet, smo ga \u017ee uporabljali)<\/h4>\n<p>\nKot vsi razvijalci, ki se ukvarjajo s zapletenimi spletnimi UI, smo hitro spoznali, da DOM ni primeren za delo z dinami\u010dnim uporabni\u0161kim vmesnikom. Takoj smo uvedli analog Virtual DOM za optimizacijo dela z UI. V \u010dasu obdelave dogodkov se vse spremembe DOM shranijo v pomnilnik, in \u0161ele ob zaklju\u010dku vseh operacij se akumulirane spremembe uporabijo na DOM drevesu.<\/p>\n<h4>Optimizacija delovanja spletnega odjemalca<\/h4>\n<p>\nDa bi na\u0161 spletni odjemalec deloval hitreje, se trudimo maksimalno izkoristiti vgrajene mo\u017enosti brskalnika (CSS itd.). Tako se nadzorna plo\u0161\u010da obrazca (postavljena prakti\u010dno na vsakem obrazcu aplikacije) risuje izklju\u010dno s sredstvi brskalnika, z dinami\u010dnim oblikovanjem na osnovi CSS.<\/p>\n<p><img decoding=\"async\" alt=\"O spletnem odjemalcu 1C\" src=\"\/wp-content\/uploads\/2019\/04\/116261ca79218eaa2bee9a4f5104092b.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h4>Testiranje<\/h4>\n<p>\nZa funkcionalno testiranje in testiranje zmogljivosti uporabljamo orodje lastne izdelave (napisano v Javi in C++), pa tudi niz testov, zgrajenih na osnovi <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/Selenium\">Selenium<\/a><\/noindex>.<\/p>\n<p>Na\u0161e orodje je univerzalno \u2013 omogo\u010da testiranje prakti\u010dno vseh namiznih programov, zato je primerno za testiranje tako tankega odjemalca kot tudi spletnega odjemalca. Orodje zabele\u017ei dejanja uporabnika, ki je zagnal aplikacijo \u201e1C\u201c, v datoteko-skripto. Hkrati se posnamejo slike delovnega obmo\u010dja zaslona \u2013 etalonov. Pri nadzoru novih razli\u010dic spletnega odjemalca se skripte predvajajo brez sodelovanja uporabnika. V primeru, da se posnetek zaslona ne ujema z etalonskim v katerem koli koraku, se test \u0161teje za neuspe\u0161nega, po \u010demer strokovnjak za kakovost izvede preiskavo \u2013 ali gre za napako ali na\u010drtovano spremembo obna\u0161anja sistema. V primeru na\u010drtovanega obna\u0161anja se etaloni avtomatsko zamenjajo z novimi.<\/p>\n<p>Orodje prav tako meri zmogljivost aplikacij natan\u010dno do 25 milisekund. V nekaterih primerih ponavljamo dele skripte (na primer ve\u010dkrat ponavljamo vnos naro\u010dila) za analizo degradacije \u010dasa izvajanja skozi \u010das. Rezultati vseh meritev se bele\u017eijo v dnevnik za analizo.<\/p>\n<p><img decoding=\"async\" alt=\"O spletnem odjemalcu 1C\" src=\"\/wp-content\/uploads\/2019\/04\/058bab976becf6fd38b2ec668492043b.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<b>Na\u0161e testno orodje in testirana aplikacija<\/b><\/p>\n<p>Na\u0161e orodje in Selenium se medsebojno dopolnjujeta; na primer, \u010de se je kak\u0161na gumb na enem od zaslonov premaknila, Selenium tega morda ne zazna, a na\u0161e orodje to opazi, saj opravi primerjavo zaslona piksel za piksel. Orodje je tudi sposobno zaznati te\u017eave z obdelavo vhodov s tipkovnice ali mi\u0161ke, saj jih prav to tudi reproducira.<\/p>\n<p>Testi na obeh orodjih (na\u0161em in Selenium) izvajajo tipi\u010dne delovne scenarije iz na\u0161ih aplikativnih re\u0161itev. Testi se samodejno izvr\u0161ijo po dnevni gradnji platforme \u201e1C:Preduze\u0107e\u201c. V primeru upo\u010dasnitve izvajanja skript (v primerjavi s prej\u0161njo gradnjo) izvedemo preiskavo in odpravimo vzrok za upo\u010dasnitev. Na\u0161 kriterij je preprost \u2013 nova gradnja mora delovati vsaj tako hitro kot prej\u0161nja.<\/p>\n<p>Za preiskovanje incidentov upo\u010dasnitve izvajanja razvijalci uporabljajo razli\u010dna orodja; ve\u010dinoma se uporablja <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> proizvodnje podjetja <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Dynatrace\">DynaTrace<\/a><\/noindex>. Zbirajo se logi izvajanja te\u017eavnega postopka na prej\u0161nji in novi razli\u010dici, nato se logi analizirajo. Pri tem \u010das izvajanja posameznih operacij (v milisekundah) morda ni odlu\u010dno merilo \u2013 v brskalniku se ob\u010dasno izvajajo upravljalni procesi, kot je \u010di\u0161\u010denje pomnilnika, ki lahko vplivajo na \u010das izvajanja funkcij in izkrivijo sliko. Bolj relevantni parametri v tem primeru bodo \u0161tevilo izvedenih JavaScript instrukcij, \u0161tevilo atomarnih operacij nad DOM-om itd. \u010ce se \u0161tevilo instrukcij\/operacij v istem scenariju v novi verziji pove\u010da \u2013 to skoraj vedno pomeni upad zmogljivosti, ki ga je treba odpraviti.<\/p>\n<p>Prav tako lahko ena od vzrokov za upad zmogljivosti povzro\u010di to, da Google Closure Compiler iz nekega razloga ni mogel izvesti inline zamenjave funkcije (na primer, ker je funkcija rekurzivna ali virtualna). V tem primeru posku\u0161amo te\u017eavo odpraviti z ponovnim pisanjem izvorne kode.<\/p>\n<h3>Raz\u0161iritve brskalnikov<\/h3>\n<p>\nV primeru, da aplikativni re\u0161itvi manjka funkcionalnost, ki je ne zagotavlja JavaScript, uporabljamo raz\u0161iritve brskalnikov:<\/p>\n<ul>\n<li>za delo s datotekami<\/li>\n<li>za delo s kriptografijo<\/li>\n<li>delo z <noindex><a rel=\"nofollow\" href=\"http:\/\/v8.1c.ru\/overview\/Term_000000545.htm\">zunanjimi komponentami<\/a><\/noindex><\/li>\n<\/ul>\n<p>\nNa\u0161e raz\u0161iritve so sestavljene iz dveh delov. Prvi del \u2013 to, kar imenujemo raz\u0161iritev brskalnika (navadno raz\u0161iritve napisane v JavaScript za Chrome in Firefox), ki komunicira z drugim delom \u2014 binarno raz\u0161iritvijo, ki implementira potrebno funkcionalnost. Pomembno je omeniti, da pi\u0161emo 3 razli\u010dice binarnih raz\u0161iritev \u2013 za Windows, Linux in MacOS. Binarna raz\u0161iritev je del platforme 1C:Enterprise in se nahaja na stre\u017eniku aplikacij 1C. Ob prvem klicu iz spletnega odjemalca se nalo\u017ei na odjemalski ra\u010dunalnik in namesti v brskalniku.<\/p>\n<p>Pri delu v Safariju na\u0161e raz\u0161iritve uporabljajo NPAPI, pri delu v Internet Explorerju pa tehnologijo ActiveX. <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/Microsoft_Edge\">Microsoft Edge<\/a><\/noindex> zaenkrat ne podpira raz\u0161iritev, zato deluje spletni odjemalec z omejitvami.<\/p>\n<h3>Dale\u010d razvoj<\/h3>\n<p>\nEna od skupin nalog za ekipo razvijalcev spletnega odjemalca je nadaljnji razvoj funkcionalnosti. Funkcionalnost spletnega odjemalca mora biti enaka funkcionalnosti<\/p>\n<p>Druge naloge vklju\u010dujejo razvoj arhitekture, refaktorizacijo, izbolj\u0161anje zmogljivosti in zanesljivosti. Na primer, ena od smeri je nadaljnje gibanje proti asinhronemu modelu dela. Del funkcionalnosti spletnega odjemalca je trenutno zasnovan na sinhronem modelu interakcije s stre\u017enikom. Asinhroni model postaja v brskalnikih (in ne le v brskalnikih) vse bolj aktualen in to nas sili, da spremenimo spletnega odjemalca z zamenjavo sinhronih klicev z asinhronimi (in ustrezno refaktorizacijo kode). Postopen prehod na asinhroni model je pojasnjen z nujnostjo podpore za izdane re\u0161itve in njihovo postopno prilagajanje.<br \/>\n<br \/>Izvor: <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\/sl\/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=\"sl_SI\" \/>\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\/sl\/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\udd47O spletnem odjemalcu 1C | ProHoster","description":"Ena od prijetnih zna\u010dilnosti tehnologije 1C:Podjetje je, da lahko aplikacijska re\u0161itev, razvita po tehnologiji upravljanih obrazcev, deluje tako v tankem (izvr\u0161ljivem) odjemalcu pod Windows, Linux, MacOS.","canonical_url":"https:\/\/prohoster.info\/sl\/blog\/administrirovanie\/pro-veb-klient-1s__trashed","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"sl_SI","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\/sl\/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\/sl\/wp-json\/wp\/v2\/posts\/32465","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/comments?post=32465"}],"version-history":[{"count":1,"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/posts\/32465\/revisions"}],"predecessor-version":[{"id":173305,"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/posts\/32465\/revisions\/173305"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/media\/24269"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/media?parent=32465"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/categories?post=32465"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/tags?post=32465"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}