{"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\/it\/blog\/administrirovanie\/pro-veb-klient-1s__trashed","title":{"rendered":"Sul web client 1C","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Una delle caratteristiche piacevoli della tecnologia 1C:Enterprise \u00e8 che la soluzione applicativa, sviluppata con la tecnologia delle forme gestite, pu\u00f2 essere eseguita sia nel client leggero (eseguibile) su Windows, Linux, MacOS X, sia come web client su 5 browser \u2013 Chrome, Internet Explorer, Firefox, Safari, Edge, e tutto ci\u00f2 senza modificare il codice sorgente dell'applicazione. Inoltre, l'applicazione nel client leggero e nel browser funziona e appare praticamente identica.<br \/>\nTrova 10 differenze (sotto ci sono 2 immagini):<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nFinestra del client leggero su Linux:<\/p>\n<p><img decoding=\"async\" alt=\"Sul web client 1C\" src=\"\/wp-content\/uploads\/2019\/04\/6a836d01f80f447302e04d1827d5eebb.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nLa stessa finestra nel web client (nel browser Chrome):<\/p>\n<p><img decoding=\"async\" alt=\"Sul web client 1C\" src=\"\/wp-content\/uploads\/2019\/04\/1cab8bdf0d9d1c9d6601219c3ae6018c.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nPerch\u00e9 abbiamo creato il web client? Parlando in modo un po' retorico, questa esigenza ci \u00e8 stata imposta dal tempo. Da tempo il lavoro tramite Internet \u00e8 diventato un requisito necessario per le applicazioni aziendali. Inizialmente, abbiamo aggiunto la possibilit\u00e0 di lavorare tramite Internet per il nostro client leggero (alcuni dei nostri concorrenti, tra l'altro, si sono fermati a questo; altri, al contrario, hanno abbandonato il client leggero e si sono limitati all'implementazione del web client). Noi abbiamo deciso di dare ai nostri utenti la possibilit\u00e0 di scegliere la soluzione che meglio si adatta alle loro esigenze.<\/p>\n<p><img decoding=\"async\" alt=\"Sul web client 1C\" src=\"\/wp-content\/uploads\/2019\/04\/345d070d695cfc4854c485148d22d24c.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nL'aggiunta della possibilit\u00e0 di lavorare tramite Internet per il client leggero \u00e8 stato un grande progetto con un completo cambio di architettura dell'interazione client-server. La creazione del web client \u00e8 stata, invece, un progetto completamente nuovo, iniziato da zero.<\/p>\n<h3>Definizione del compito<\/h3>\n<p>\nPertanto, i requisiti per il progetto: il web client deve fare le stesse cose del client leggero, vale a dire:<\/p>\n<ol>\n<li>Visualizzare l'interfaccia utente<\/li>\n<li>Eseguire codice client scritto nel linguaggio 1C<\/li>\n<\/ol>\n<p>\nL'interfaccia utente in 1C \u00e8 descritta in un editor visivo, ma in modo dichiarativo, senza il posizionamento pixel-to-pixel degli elementi; vengono utilizzati circa trenta tipi di elementi dell'interfaccia \u2013 pulsanti, campi di input (testo, numerico, data\/ora), elenchi, tabelle, grafici, ecc. <\/p>\n<p>Il codice client nel linguaggio 1C pu\u00f2 includere chiamate al server, lavoro con risorse locali (file, ecc.), stampa e molto altro.<\/p>\n<p>Sia il client leggero (quando si lavora tramite web) che il web client utilizzano lo stesso insieme di servizi web per comunicare con il server delle applicazioni 1C. L'implementazione nei client, ovviamente, \u00e8 diversa: il client leggero \u00e8 scritto in C++, il web client \u2013 in JavaScript.<\/p>\n<h3>Un po' di storia<\/h3>\n<p>\nIl progetto di creazione del client web \u00e8 iniziato nel 2006, con il coinvolgimento di una squadra di 5 persone in media. In fasi specifiche del progetto sono stati coinvolti sviluppatori per implementare funzionalit\u00e0 specifiche (documenti tabellari, diagrammi, ecc.); in genere, si trattava degli stessi sviluppatori che avevano realizzato quelle funzionalit\u00e0 nel client leggero. Cio\u00e8, gli sviluppatori hanno riscritto componenti in JavaScript che erano stati creati precedentemente in C++.<\/p>\n<p>Sin dall'inizio, abbiamo scartato l'idea di una qualsiasi conversione automatica (anche parziale) del codice C++ del client leggero in JavaScript per il client web, a causa delle forti differenze concettuali tra questi due linguaggi; il client web \u00e8 stato scritto in JavaScript da zero.<\/p>\n<p>Nelle prime iterazioni del progetto, il client web convertiva il codice del client in linguaggio integrato 1C direttamente in JavaScript. Il client leggero opera in modo diverso: il codice in linguaggio integrato 1C viene compilato in bytecode e poi questo bytecode viene interpretato sul client. Successivamente, anche il client web ha fatto lo stesso \u2013 in primo luogo, questo ha portato a un guadagno di prestazioni, in secondo luogo ha permesso di unificare l'architettura del client leggero e del client web.<\/p>\n<p>La prima versione della piattaforma 1C:Enterprise con supporto per il client web \u00e8 stata rilasciata nel 2009. A quel tempo, il client web supportava 2 browser: Internet Explorer e Firefox. Nei piani iniziali era prevista la supporto per Opera, ma a causa di problemi insormontabili con i gestori di chiusura dell'applicazione in Opera (non era possibile tracciare con il 100% di certezza che l'applicazione stesse chiudendo e in quel momento effettuare la procedura di disconnessione dal server delle applicazioni 1C) si \u00e8 dovuto rinunciare a tali piani.<\/p>\n<h3>Struttura del progetto<\/h3>\n<p>\nIn totale, nella piattaforma 1C:Enterprise ci sono 4 progetti scritti in JavaScript:<\/p>\n<ol>\n<li>WebTools \u2013 librerie comuni utilizzate dagli altri progetti (includiamo qui anche <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Google_Closure_Tools#Closure_Library\">Google Closure Library<\/a><\/noindex>).<\/li>\n<li>Controllo dell'elemento <noindex><a rel=\"nofollow\" href=\"http:\/\/v8.1c.ru\/overview\/Term_000000785.htm\">Documento formattato<\/a><\/noindex> (realizzato in JavaScript sia nel client leggero che nel client web)<\/li>\n<li>Controllo dell'elemento <noindex><a rel=\"nofollow\" href=\"https:\/\/wonderland.v8.1c.ru\/blog\/planirovshchik\/\">Pianificatore<\/a><\/noindex> (realizzato in JavaScript sia nel client leggero che nel client web)<\/li>\n<li>Client web<\/li>\n<\/ol>\n<p>\nLa struttura di ciascun progetto ricorda la struttura dei progetti Java (o dei progetti .NET \u2013 a chi sta pi\u00f9 a cuore); abbiamo namespace, e ciascun namespace si trova in una cartella separata. All'interno della cartella ci sono file e classi del namespace. Nel progetto del client web ci sono circa 1000 file.<\/p>\n<p>Strutturalmente, il client web \u00e8 essenzialmente diviso nelle seguenti sottosistemi:<\/p>\n<ul>\n<li>Interfaccia controllata dell'applicazione client\n<ul>\n<li>Interfaccia generale dell'applicazione (menu di sistema, pannelli)<\/li>\n<li>Interfaccia di moduli gestiti, che include, tra l'altro, circa 30 elementi di controllo (pulsanti, vari tipi di campi di input \u2013 testuali, numerici, data\/ora, ecc., tabelle, elenchi, grafici, ecc.)<\/li>\n<\/ul>\n<p>\n<\/li>\n<li>Modello ad oggetti disponibile per gli sviluppatori lato client (oltre 400 tipi: modello ad oggetti dell'interfaccia gestita, impostazioni di layout dati, formattazione condizionale, ecc.)<\/li>\n<li>Interpretatore del linguaggio integrato 1C<\/li>\n<li>Estensioni del browser (utilizzate per funzionalit\u00e0 non supportate in JavaScript)\n<ul>\n<li>Lavorare con la crittografia<\/li>\n<li>Gestione dei file<\/li>\n<li>Tecnologia dei componenti esterni, che consente di utilizzarli sia nel client leggero che nel web client<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p><\/p>\n<h3>Caratteristiche dello sviluppo<\/h3>\n<p>\nL'implementazione di tutto quanto sopra in JavaScript \u00e8 un compito complesso. \u00c8 possibile che il web client 1C sia una delle pi\u00f9 grandi applicazioni client-side scritte in JavaScript, con circa 450.000 righe. Utilizziamo attivamente nell codice del web client un approccio orientato agli oggetti, che semplifica il lavoro con un progetto di tali dimensioni.<\/p>\n<p>Per ridurre la dimensione del codice client, inizialmente abbiamo utilizzato il nostro obfuscator, e a partire dalla versione della piattaforma 8.3.6 (ottobre 2014) abbiamo iniziato a utilizzare <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Google_Closure_Tools#Closure_Compiler\">Google Closure Compiler<\/a><\/noindex>. L'effetto dell'uso in cifre \u2013 dimensione del framework del web client dopo obfuscazione:<\/p>\n<ul>\n<li>Proprio obfuscator \u2013 1556 kB<\/li>\n<li>Google Closure Compiler \u2013 1073 kB<\/li>\n<\/ul>\n<p>\nL'utilizzo di Google Closure Compiler ci ha aiutato a migliorare le prestazioni del web client del 30% rispetto al nostro obfuscator. Inoltre, il consumo di memoria dell'applicazione \u00e8 diminuito del 15-25% (a seconda del browser).<\/p>\n<p>Google Closure Compiler funziona molto bene con codice orientato agli oggetti, quindi la sua efficacia per il web client \u00e8 massima. Closure Compiler fa per noi diverse ottime cose:<\/p>\n<ul>\n<li>Controllo statico dei tipi durante la fase di compilazione del progetto (garantito dal fatto che copriamo il codice con annotazioni JSDoc). Ne risulta una tipizzazione statica molto vicina al livello di tipizzazione in C++. Questo aiuta a catturare una percentuale significativa di errori nella fase di compilazione del progetto.<\/li>\n<li>Riduzione della dimensione del codice tramite obfuscazione<\/li>\n<li>Una serie di ottimizzazioni del codice eseguito, ad esempio, come:\n<ul>\n<li>sostituzioni inline delle funzioni. Chiamare una funzione in JavaScript \u00e8 un'operazione piuttosto costosa e le sostituzioni inline di metodi brevi e frequentemente utilizzati accelerano notevolmente l'esecuzione del codice.<\/li>\n<li>Conteggio delle costanti in fase di compilazione. Se l'espressione dipende da una costante, verr\u00e0 inserito il valore effettivo della costante<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>\nCome ambiente di sviluppo per il web client utilizziamo WebStorm.<\/p>\n<p>Per l'analisi del codice utilizziamo <noindex><a rel=\"nofollow\" href=\"http:\/\/www.sonarqube.org\/\">SonarQube<\/a><\/noindex>, in cui integriamo analizzatori statici del codice. Attraverso gli analizzatori monitoriamo il degrado della qualit\u00e0 del codice sorgente in JavaScript e cerchiamo di evitarlo.<\/p>\n<p><img decoding=\"async\" alt=\"Sul web client 1C\" src=\"\/wp-content\/uploads\/2019\/04\/886fe89a8c12d29d940b6b59316ea627.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3>Quali problemi abbiamo risolto\/risolviamo<\/h3>\n<p>\nDurante l'implementazione del progetto ci siamo imbattuti in una serie di problemi interessanti che abbiamo dovuto risolvere.<\/p>\n<h4>Scambio di dati con il server e tra finestre<\/h4>\n<p>\nEsistono situazioni in cui l\u2019oscuramento del codice sorgente pu\u00f2 ostacolare il funzionamento del sistema. Il codice esterno rispetto al codice eseguibile del web client, a causa dell\u2019oscuramento, pu\u00f2 avere nomi di funzioni e parametri diversi da quelli attesi dal nostro codice eseguibile. Il codice esterno per noi \u00e8:<\/p>\n<ul>\n<li>Codice ricevuto dal server sotto forma di strutture dati<\/li>\n<li>Codice di un'altra finestra dell'applicazione<\/li>\n<\/ul>\n<p>\nPer evitare l\u2019oscuramento durante l'interazione con il server utilizziamo il 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>\nE per evitare l\u2019oscuramento durante l'interazione con altre finestre utilizziamo i cosiddetti interfacce esportabili (interfacce in cui tutti i metodi sono esportabili).<\/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>Abbiamo utilizzato il Virtual DOM prima che diventasse mainstream)<\/h4>\n<p>\nCome tutti gli sviluppatori che si occupano di complessi UI web, abbiamo capito rapidamente che il DOM \u00e8 poco adatto per lavorare con interfacce utente dinamiche. Praticamente subito \u00e8 stato implementato un analogo del Virtual DOM per ottimizzare il lavoro con l'UI. Durante il processo di gestione dell'evento, tutte le modifiche al DOM vengono memorizzate in memoria e, solo al termine di tutte le operazioni, le modifiche accumulate vengono applicate all'albero DOM.<\/p>\n<h4>Ottimizzazione del funzionamento del web client<\/h4>\n<p>\nPer rendere il nostro web client pi\u00f9 veloce, cerchiamo di sfruttare al massimo le capacit\u00e0 native del browser (CSS e simili). Cos\u00ec, la barra comandi del modulo (posizionata praticamente in ogni modulo dell'applicazione) viene disegnata utilizzando esclusivamente le funzionalit\u00e0 del browser, con layout dinamico basato su CSS.<\/p>\n<p><img decoding=\"async\" alt=\"Sul web client 1C\" src=\"\/wp-content\/uploads\/2019\/04\/116261ca79218eaa2bee9a4f5104092b.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h4>Test<\/h4>\n<p>\nPer i test funzionali e i test delle prestazioni utilizziamo uno strumento di nostra produzione (scritto in Java e C++), oltre a un insieme di test basati su <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/Selenium\">Selenium<\/a><\/noindex>.<\/p>\n<p>Il nostro strumento \u00e8 universale: consente di testare praticamente qualsiasi programma per finestre, rendendolo adatto per testare sia il client aziendale che il client web. Lo strumento registra le azioni dell\u2019utente che avvia l\u2019applicazione \u20181C\u2019 in un file di script. Contemporaneamente, viene effettuata la registrazione delle immagini dell'area di lavoro dello schermo - i riferimenti. Durante il controllo delle nuove versioni del client web, gli script vengono eseguiti senza l'intervento dell'utente. In caso di incongruenza tra lo screenshot e il riferimento in uno qualsiasi dei passaggi, il test viene considerato fallito; successivamente, uno specialista della qualit\u00e0 esegue un'indagine per determinare se si tratta di un errore o di un cambiamento pianificato nel comportamento del sistema. In caso di comportamento pianificato, i riferimenti vengono automaticamente sostituiti con nuovi.<\/p>\n<p>Lo strumento misura anche le prestazioni delle applicazioni con un'accuratezza di 25 millisecondi. In alcuni casi, cicliamo parti dello script (ad esempio, ripetendo pi\u00f9 volte l'inserimento di un ordine) per analizzare il degrado del tempo di esecuzione nel tempo. I risultati di tutte le misurazioni vengono registrati in un log per analisi.<\/p>\n<p><img decoding=\"async\" alt=\"Sul web client 1C\" src=\"\/wp-content\/uploads\/2019\/04\/058bab976becf6fd38b2ec668492043b.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<b>Il nostro strumento di test e l'applicazione testata<\/b><\/p>\n<p>Il nostro strumento e Selenium si integrano a vicenda; ad esempio, se un pulsante su uno degli schermi cambia posizione, Selenium potrebbe non rilevarlo, ma il nostro strumento lo noter\u00e0, poich\u00e9 esegue un confronto pixel per pixel tra lo screenshot e il riferimento. Inoltre, lo strumento \u00e8 in grado di rilevare problemi con l'elaborazione degli input da tastiera o mouse, in quanto \u00e8 proprio questo che riproduce.<\/p>\n<p>I test su entrambi gli strumenti (il nostro e Selenium) eseguono scenari di lavoro standard dalle nostre soluzioni applicative. I test vengono avviati automaticamente dopo la compilazione giornaliera della piattaforma \u20181C:Enterprise\u2019. In caso di rallentamenti negli scenari (rispetto alla compilazione precedente), conduciamo un'indagine e risolviamo la causa del rallentamento. Il nostro criterio \u00e8 semplice: la nuova compilazione deve funzionare non pi\u00f9 lentamente della precedente.<\/p>\n<p>Per indagare sugli incidenti di rallentamento, gli sviluppatori utilizzano diversi strumenti; nella maggior parte dei casi viene utilizzato <noindex><a rel=\"nofollow\" href=\"http:\/\/apmblog.dynatrace.com\/2014\/12\/11\/dynatrace-ajax-edition-4-5-last-page-chapter-yet-story-continues\/\">Edizione AJAX di Dynatrace<\/a><\/noindex> produzione della societ\u00e0 <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Dynatrace\">DynaTrace<\/a><\/noindex>. Viene registrata l'esecuzione dei log dell'operazione problematica sia sulla precedente che sulla nuova versione, dopodich\u00e9 i log vengono analizzati. In questo caso, il tempo di esecuzione delle singole operazioni (in millisecondi) potrebbe non essere un fattore decisivo: nel browser vengono eseguiti periodicamente processi di servizio come la pulizia della memoria, che possono sovrapporsi al tempo di esecuzione delle funzioni e distorcere l'immagine. Parametri pi\u00f9 rilevanti in questo caso sono il numero di istruzioni JavaScript eseguite, il numero di operazioni atomiche sul DOM, ecc. Se il numero di istruzioni\/operazioni nello stesso scenario nella nuova versione \u00e8 aumentato, questo significa quasi sempre un rallentamento delle prestazioni che deve essere corretto.<\/p>\n<p>Un'altra causa del calo delle prestazioni pu\u00f2 essere che Google Closure Compiler non \u00e8 riuscito per qualche motivo a effettuare la sostituzione inline della funzione (ad esempio perch\u00e9 la funzione \u00e8 ricorsiva o virtuale). In questo caso cerchiamo di risolvere il problema riscrivendo il codice sorgente.<\/p>\n<h3>Estensioni del browser<\/h3>\n<p>\nQuando una soluzione applicativa necessita di funzionalit\u00e0 non disponibili in JavaScript, utilizziamo estensioni del browser:<\/p>\n<ul>\n<li>per la gestione dei file<\/li>\n<li>per la gestione della crittografia<\/li>\n<li>lavoro con <noindex><a rel=\"nofollow\" href=\"http:\/\/v8.1c.ru\/overview\/Term_000000545.htm\">componenti esterni<\/a><\/noindex><\/li>\n<\/ul>\n<p>\nLe nostre estensioni sono composte da due parti. La prima parte \u00e8 ci\u00f2 che viene chiamato estensione del browser (di solito estensioni scritte in JavaScript per Chrome e Firefox), che interagiscono con la seconda parte - un'estensione binaria che implementa la funzionalit\u00e0 di cui abbiamo bisogno. Vale la pena menzionare che scriviamo 3 versioni di estensioni binarie - per Windows, Linux e MacOS. L'estensione binaria viene fornita con la piattaforma 1C:Enterprise e si trova sul server delle applicazioni 1C. Al primo avvio dal client web, viene caricata sul computer client e installata nel browser.<\/p>\n<p>Quando si lavora in Safari, le nostre estensioni utilizzano NPAPI, mentre in Internet Explorer utilizzano la tecnologia ActiveX. <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/Microsoft_Edge\">Microsoft Edge<\/a><\/noindex> ancora non supporta le estensioni, quindi il client web funziona con limitazioni.<\/p>\n<h3>Sviluppo futuro<\/h3>\n<p>\nUno dei gruppi di compiti per il team di sviluppo del client web \u00e8 l'ulteriore sviluppo delle funzionalit\u00e0. Le funzionalit\u00e0 del client web devono essere identiche a quelle del client leggero; tutte le nuove funzionalit\u00e0 vengono implementate contemporaneamente sia nel client leggero che nel client web.<\/p>\n<p>Altri compiti includono lo sviluppo dell'architettura, il refactoring, l'aumento delle prestazioni e dell'affidabilit\u00e0. Ad esempio, una delle direzioni \u00e8 continuare a spostarsi verso un modello di lavoro asincrono. Una parte delle funzionalit\u00e0 del client web \u00e8 attualmente costruita su un modello di interazione sincrona con il server. Il modello asincrono sta diventando ora pi\u00f9 attuale nei browser (e non solo nei browser), e ci\u00f2 ci costringe a modificare il client web sostituendo le chiamate sincrone con chiamate asincrone (e un corrispondente refactoring del codice). La transizione graduale verso un modello asincrono \u00e8 spiegata dalla necessit\u00e0 di supportare le soluzioni rilasciate e di adattarle progressivamente.<br \/>\n<br \/>Fonte: <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.1.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\/it\/blog\/administrirovanie\/pro-veb-klient-1s__trashed\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"it_IT\" \/>\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\/it\/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\udd47Sul client web 1\u0421 | ProHoster","description":"Una delle caratteristiche piacevoli della tecnologia 1\u0421:Enterprise \u00e8 che la soluzione applicativa, sviluppata con la tecnologia delle forme gestite, pu\u00f2 essere eseguita sia nel client leggero (eseguibile) su Windows, Linux, MacOS.","canonical_url":"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/pro-veb-klient-1s__trashed","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"it_IT","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\/it\/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\/it\/wp-json\/wp\/v2\/posts\/32465","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/comments?post=32465"}],"version-history":[{"count":1,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts\/32465\/revisions"}],"predecessor-version":[{"id":173305,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts\/32465\/revisions\/173305"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/media\/24269"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/media?parent=32465"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/categories?post=32465"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/tags?post=32465"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}