{"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\/nl\/blog\/administrirovanie\/pro-veb-klient-1s__trashed","title":{"rendered":"Over de 1C webclient","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Een van de prettige kenmerken van de 1C:Enterprise-technologie is dat een applicatieoplossing die is ontwikkeld met behulp van de technologie van beheerde formulieren, zowel kan worden uitgevoerd als een dunne (uitvoerende) client op Windows, Linux, MacOS X, als als een webclient in 5 browsers \u2013 Chrome, Internet Explorer, Firefox, Safari, Edge, en dit alles \u2013 zonder de broncode van de applicatie te wijzigen. Sterker nog, visueel functioneert en ziet de applicatie in de dunne client en in de browser er praktisch identiek uit.<br \/>\nVind de 10 verschillen (onder de kat 2 afbeeldingen):<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nHet venster van de dunne client op Linux:<\/p>\n<p><img decoding=\"async\" alt=\"Over de 1C webclient\" src=\"\/wp-content\/uploads\/2019\/04\/6a836d01f80f447302e04d1827d5eebb.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nHetzelfde venster in de webclient (in de browser Chrome):<\/p>\n<p><img decoding=\"async\" alt=\"Over de 1C webclient\" src=\"\/wp-content\/uploads\/2019\/04\/1cab8bdf0d9d1c9d6601219c3ae6018c.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nWaarom hebben we een webclient gemaakt? Wat wat grandioos klinkt, is dat de tijd ons deze uitdaging heeft gesteld. Al geruime tijd is werken via het internet een vereiste geworden voor business applicaties. Eerst hebben we de mogelijkheid toegevoegd om via het internet te werken met onze dunne client (enkele van onze concurrenten zijn hier bijvoorbeeld bij gebleven; andere, daarentegen, hebben de dunne client opgegeven en hebben zich beperkt tot de implementatie van de webclient). Wij hebben echter besloten onze gebruikers de keuze te geven over welke clientvariant het beste bij hen past.<\/p>\n<p><img decoding=\"async\" alt=\"Over de 1C webclient\" src=\"\/wp-content\/uploads\/2019\/04\/345d070d695cfc4854c485148d22d24c.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nHet toevoegen van de mogelijkheid om via het internet te werken met de dunne client was een groot project met een volledige wijziging van de architectuur van de client-serverinteractie. De creatie van de webclient is zelfs een geheel nieuw project dat vanuit het niets is begonnen.<\/p>\n<h3>Taakstelling<\/h3>\n<p>\nDus, de vereisten voor het project: de webclient moet hetzelfde doen als de dunne client, namelijk:<\/p>\n<ol>\n<li>De gebruikersinterface weergeven<\/li>\n<li>Clientcode uitvoeren, geschreven in de 1C-taal<\/li>\n<\/ol>\n<p>\nDe gebruikersinterface in 1C wordt beschreven in een visuele editor, maar declaratief, zonder pixel-perfect positionering van elementen; er worden ongeveer dertig verschillende typen interface-elementen gebruikt \u2013 knoppen, invoervelden (tekst, cijfers, datum\/tijd), lijsten, tabellen, grafieken, enz. <\/p>\n<p>Clientcode in de 1C-taal kan serveraanroepen, werken met lokale resources (bestanden, enz.), afdrukken en nog veel meer bevatten.<\/p>\n<p>Zowel de dunne client (bij gebruik via het web) als de webclient maken gebruik van dezelfde set webservices voor communicatie met de 1C-applicatieserver. De implementatie bij de clients is natuurlijk verschillend \u2013 de dunne client is geschreven in C++, de webclient \u2013 in JavaScript.<\/p>\n<h3>Een beetje geschiedenis<\/h3>\n<p>\nHet project voor de ontwikkeling van een webclient is in 2006 gestart, met gemiddeld een team van 5 personen. Gedurende bepaalde fases van het project werden ontwikkelaars aangetrokken voor de implementatie van specifieke functionaliteiten (zoals spreadsheets, diagrammen, enz.); doorgaans waren dit dezelfde ontwikkelaars die deze functionaliteit ook in de thin client hadden gemaakt. Dat wil zeggen, de ontwikkelaars herschreven de componenten die ze eerder in C++ hadden gemaakt opnieuw in JavaScript.<\/p>\n<p>Vanaf het begin hebben we het idee van enige automatische (zelfs gedeeltelijke) conversie van C++-code van de thin client naar de JavaScript-webclient verworpen, vanwege de sterke conceptuele verschillen tussen deze twee talen; de webclient werd vanaf het begin in JavaScript geschreven.<\/p>\n<p>In de vroege iteraties van het project converteerde de webclient de clientcode in de ingebedde taal 1C direct naar JavaScript. De thin client doet dit anders \u2014 de code in de ingebedde taal 1C wordt gecompileerd naar bytecode, en deze bytecode wordt vervolgens op de client ge\u00efnterpreteerd. Later begon ook de webclient dit te doen \u2014 ten eerste zorgde dit voor prestatieverbeteringen, en ten tweede maakte het mogelijk de architectuur van de thin client en de webclient te uniformiseren.<\/p>\n<p>De eerste versie van het 1C:Enterprise-platform met ondersteuning voor de webclient werd in 2009 uitgebracht. De webclient ondersteunde op dat moment 2 browsers \u2013 Internet Explorer en Firefox. In de oorspronkelijke plannen was er ondersteuning voor Opera, maar door onoverkomelijke problemen met de afhandelingsmechanismen voor het sluiten van de applicatie in Opera (het was niet mogelijk om met 100% zekerheid te traceren wanneer de applicatie werd gesloten, en op dat moment de ontkoppelprocedure van de 1C-applicatieserver uit te voeren) moesten deze plannen worden afgeblazen.<\/p>\n<h3>Projectstructuur<\/h3>\n<p>\nEr zijn in totaal 4 projecten op het 1C:Enterprise-platform geschreven in JavaScript:<\/p>\n<ol>\n<li>WebTools \u2013 algemene bibliotheken die door de andere projecten worden gebruikt (hierbij voegen we ook <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Google_Closure_Tools#Closure_Library\">Google Closure Library<\/a><\/noindex>).<\/li>\n<li>Besturings element <noindex><a rel=\"nofollow\" href=\"http:\/\/v8.1c.ru\/overview\/Term_000000785.htm\">GeformatteerdDocument<\/a><\/noindex> (ge\u00efmplementeerd in zowel de thin client als de webclient)<\/li>\n<li>Besturings element <noindex><a rel=\"nofollow\" href=\"https:\/\/wonderland.v8.1c.ru\/blog\/planirovshchik\/\">Scheduler<\/a><\/noindex> (ge\u00efmplementeerd in zowel de thin client als de webclient)<\/li>\n<li>Webclient<\/li>\n<\/ol>\n<p>\nDe structuur van elk project lijkt op de structuur van Java-projecten (of .NET-projecten \u2013 wat je ook het dichtst bij de hand hebt); we hebben namespaces, en elke namespace ligt in een aparte map. Binnen de map bevinden zich de bestanden en klassen van de namespace. Het webclient-project bevat ongeveer 1000 bestanden.<\/p>\n<p>Structueel wordt de webclient grofweg verdeeld in de volgende subsysteem:<\/p>\n<ul>\n<li>Beheerde interface van de clientapplicatie\n<ul>\n<li>Algemene gebruikersinterface van de applicatie (systeemmenu's, panels)<\/li>\n<li>Interface van beheerde formulieren, met inbegrip van ongeveer 30 besturingselementen (knoppen, verschillende soorten invoervelden - tekst, cijfers, datum\/tijd, enz., tabellen, lijsten, grafieken, enz.)<\/li>\n<\/ul>\n<p>\n<\/li>\n<li>Objectmodel, beschikbaar voor ontwikkelaars aan de clientzijde (meer dan 400 typen: objectmodel van de beheerde interface, gegevenslay-outinstellingen, voorwaardelijke opmaak, enz.)<\/li>\n<li>Interpreter voor de ingebouwde 1C-taal<\/li>\n<li>Browserextensies (gebruikt voor functionaliteit die niet door JavaScript wordt ondersteund)\n<ul>\n<li>Werken met cryptografie<\/li>\n<li>Werken met bestanden<\/li>\n<li>Technologie van externe componenten, waarmee ze zowel in de dunne als de webclient gebruikt kunnen worden<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p><\/p>\n<h3>Kenmerken van ontwikkeling<\/h3>\n<p>\nDe implementatie van alles hierboven beschreven in JavaScript is niet eenvoudig. Mogelijk is de 1C webclient een van de grootste client-side applicaties die in JavaScript zijn geschreven - ongeveer 450.000 regels. We maken actief gebruik van een objectgeori\u00ebnteerde aanpak in de code van de webclient, waardoor het werken met zo'n groot project wordt vergemakkelijkt.<\/p>\n<p>Om de grootte van de clientcode te minimaliseren, hebben we oorspronkelijk onze eigen obfuscator gebruikt, en vanaf versie 8.3.6 van het platform (oktober 2014) zijn we gaan werken met <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Google_Closure_Tools#Closure_Compiler\">Google Closure Compiler<\/a><\/noindex>. Het effect van het gebruik in cijfers - de grootte van het framework van de webclient na obfuscatie:<\/p>\n<ul>\n<li>Eigen obfuscator - 1556 kB<\/li>\n<li>Google Closure Compiler - 1073 kB<\/li>\n<\/ul>\n<p>\nHet gebruik van Google Closure Compiler heeft ons geholpen de prestaties van de webclient met 30% te verhogen ten opzichte van onze eigen obfuscator. Bovendien is het geheugenverbruik van de applicatie met 15-25% (afhankelijk van de browser) verminderd.<\/p>\n<p>Google Closure Compiler werkt zeer goed met objectgeori\u00ebnteerde code, waardoor de effectiviteit ervan voor de webclient maximaal is. Closure Compiler doet enkele goede dingen voor ons:<\/p>\n<ul>\n<li>Statische typecontrole tijdens de bouwfase van het project (doorgesteld door het dekken van de code met JSDoc-annotaties). Dit resulteert in statische typificatie, die zeer dicht bij de typen in C++ komt. Dit helpt een aanzienlijk percentage van de fouten te vangen tijdens de compilatiefase van het project.<\/li>\n<li>Vermindering van de codegrootte door obfuscatie<\/li>\n<li>Een aantal optimalisaties van de uitgevoerde code, zoals:\n<ul>\n<li>inline-functiesubstitutie. Het aanroepen van een functie in JavaScript is een behoorlijk dure operatie, en inline-substitutie van vaak gebruikte kleine methoden versnelt de code aanzienlijk.<\/li>\n<li>Constanten tellen tijdens de compilatiefase. Als een expressie afhankelijk is van een constante, wordt de werkelijke waarde van de constante erin gezet.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>\nAls ontwikkelomgeving voor de webclient gebruiken we WebStorm.<\/p>\n<p>Voor code-analyse gebruiken we <noindex><a rel=\"nofollow\" href=\"http:\/\/www.sonarqube.org\/\">SonarQube<\/a><\/noindex>, waar we statische code-analysetools integreren. Met de analysetools volgen we de verslechtering van de kwaliteit van de broncode in JavaScript en werken we ernaar dat te voorkomen.<\/p>\n<p><img decoding=\"async\" alt=\"Over de 1C webclient\" src=\"\/wp-content\/uploads\/2019\/04\/886fe89a8c12d29d940b6b59316ea627.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3>Welke taken hebben we opgelost \/ oplossen we<\/h3>\n<p>\nTijdens de uitvoering van het project zijn we tegen een aantal interessante taken aangelopen die we moesten oplossen.<\/p>\n<h4>Gegevensuitwisseling met de server en tussen vensters<\/h4>\n<p>\nEr zijn situaties waarin het obfusceren van de broncode de werking van het systeem kan belemmeren. Code die extern is ten opzichte van de uitvoerbare code van de webclient kan als gevolg van obfuscatie functienamen en parameters hebben die verschillen van wat onze uitvoerbare code verwacht. De externe code voor ons is:<\/p>\n<ul>\n<li>Code die van de server komt in de vorm van datastructuren<\/li>\n<li>Code van een ander venster van de toepassing<\/li>\n<\/ul>\n<p>\nOm obfuscatie te vermijden bij interactie met de server gebruiken we de 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>\nEn om obfuscatie te vermijden bij interaction met andere vensters gebruiken we zogenaamde ge\u00ebxporteerde interfaces (interfaces waarvan alle methoden ge\u00ebxporteerd zijn).<\/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>We gebruikten Virtual DOM voordat het mainstream werd)<\/h4>\n<p>\nNet als alle ontwikkelaars die met complexe web-UI werken, realiseerden we ons snel dat de DOM niet goed geschikt is voor interactie met dynamische gebruikersinterfaces. Vrijwel onmiddellijk werd een analoge Virtual DOM ge\u00efmplementeerd voor het optimaliseren van de UI. Tijdens het verwerken van de gebeurtenis worden alle DOM-wijzigingen in het geheugen opgeslagen en pas na voltooiing van alle bewerkingen worden de verzamelde wijzigingen op de DOM-boom toegepast.<\/p>\n<h4>Optimalisatie van de webclient<\/h4>\n<p>\nOm onze webclient sneller te laten werken, proberen we maximaal gebruik te maken van de standaardmogelijkheden van de browser (CSS enz.). Zo wordt de commandopanel van het formulier (die zich op bijna elk formulier van de applicatie bevindt) uitsluitend met de middelen van de browser gerenderd, met dynamische lay-out op basis van CSS.<\/p>\n<p><img decoding=\"async\" alt=\"Over de 1C webclient\" src=\"\/wp-content\/uploads\/2019\/04\/116261ca79218eaa2bee9a4f5104092b.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h4>Testen<\/h4>\n<p>\nVoor functionele en prestatie-testen gebruiken we een zelfontwikkeld hulpmiddel (geschreven in Java en C++), evenals een set tests gebaseerd op <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/Selenium\">Selenium<\/a><\/noindex>.<\/p>\n<p>Ons hulpmiddel is veelzijdig \u2013 het kan vrijwel alle vensterprogramma's testen en is daarom geschikt voor zowel het testen van een dunne client als een webclient. Het hulpmiddel legt de acties van de gebruiker die de applicatie \u20181C\u2019 heeft gestart vast in een scriptbestand. Tegelijkertijd worden de afbeeldingen van de werkruimte van het scherm \u2013 referenties \u2013 opgenomen. Bij de controle van nieuwe versies van de webclient worden de scripts afgespeeld zonder gebruikersdeelname. In gevallen waarin de screenshot niet overeenkomt met de referentie op een bepaalde stap, wordt de test als mislukt beschouwd, waarna een kwaliteitsmedewerker een onderzoek voert \u2013 is het een fout of een geplande wijziging in het gedrag van het systeem. In het geval van een gepland gedrag worden de referenties automatisch vervangen door nieuwe.<\/p>\n<p>Het hulpmiddel meet ook de prestaties van applicaties met een nauwkeurigheid van 25 milliseconden. In bepaalde gevallen herhalen we delen van het script (bijvoorbeeld voeren we de orderinvoer meerdere keren uit) om de degradatie van de looptijd in de loop van de tijd te analyseren. De resultaten van alle metingen worden in een logboek vastgelegd voor analyse.<\/p>\n<p><img decoding=\"async\" alt=\"Over de 1C webclient\" src=\"\/wp-content\/uploads\/2019\/04\/058bab976becf6fd38b2ec668492043b.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<b>Ons testhulpmiddel en de geteste applicatie<\/b><\/p>\n<p>Ons hulpmiddel en Selenium complementeren elkaar; bijvoorbeeld, als een knop op een van de schermen van plaats is veranderd \u2013 kan Selenium dat mogelijk niet opmerken, maar ons hulpmiddel zal het opmerken, omdat het pixel-voor-pixel vergelijkingen van de screenshot met de referentie maakt. Ook is het hulpmiddel in staat om problemen met de verwerking van invoer van toetsenbord of muis op te sporen, omdat het precies dat reproduceert.<\/p>\n<p>Tests op beide hulpmiddelen (ons en Selenium) starten typische werkscenario's uit onze applicaties. Tests worden automatisch gestart na de dagelijkse bouw van het platform \u20181C:Enterprise\u2019. In het geval van vertraging van de scripts (ten opzichte van de vorige build) voeren we een onderzoek uit en elimineren we de oorzaak van de vertraging. Ons criterium is eenvoudig \u2013 de nieuwe build moet niet langzamer werken dan de vorige.<\/p>\n<p>Voor het onderzoeken van incidenten van vertraging in de werking gebruiken ontwikkelaars verschillende hulpmiddelen; voornamelijk wordt gebruikgemaakt van <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> gemaakt door <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Dynatrace\">DynaTrace<\/a><\/noindex>. Er wordt een registratie gemaakt van de logs van de problematische operatie op de vorige en de nieuwe versie, waarna de logs worden geanalyseerd. In dit geval kan de tijd voor het uitvoeren van enkele operaties (in milliseconden) niet bepalend zijn - in de browser worden periodiek achtergrondprocessen zoals garbage collection uitgevoerd, die de uitvoeringstijd van functies kunnen be\u00efnvloeden en de situatie kunnen vervormen. Meer relevante parameters zijn in dit geval het aantal uitgevoerde JavaScript-instructies, het aantal atomische operaties op de DOM, enzovoorts. Als het aantal instructies\/operaties in hetzelfde scenario in de nieuwe versie is toegenomen, betekent dit bijna altijd een verlaging van de snelheid die moet worden gecorrigeerd.<\/p>\n<p>Een andere oorzaak van de prestatieverlaging kan zijn dat de Google Closure Compiler om de een of andere reden geen inline substitutie van de functie heeft kunnen maken (bijvoorbeeld omdat de functie recursief of virtueel is). In dit geval proberen we de situatie te corrigeren door de broncode opnieuw te schrijven.<\/p>\n<h3>Browsere extensies<\/h3>\n<p>\nWanneer de applicatie functionaliteit nodig heeft die niet in JavaScript beschikbaar is, gebruiken we browsere extensies:<\/p>\n<ul>\n<li>voor het werken met bestanden<\/li>\n<li>voor het werken met cryptografie<\/li>\n<li>werken met <noindex><a rel=\"nofollow\" href=\"http:\/\/v8.1c.ru\/overview\/Term_000000545.htm\">externe componenten<\/a><\/noindex><\/li>\n<\/ul>\n<p>\nOnze extensies bestaan uit twee delen. Het eerste deel is wat men een browsere extensie noemt (meestal geschreven in JavaScript voor Chrome en Firefox), die interactie heeft met het tweede deel - de binaire extensie, die de benodigde functionaliteit implementeert. We moeten vermelden dat we drie versies van binaire extensies schrijven - voor Windows, Linux en MacOS. De binaire extensie wordt geleverd als onderdeel van het 1C:Enterprise platform en bevindt zich op de 1C applicatieserver. Bij de eerste oproep vanaf de webclient wordt deze op de clientcomputer gedownload en in de browser ge\u00efnstalleerd.<\/p>\n<p>Wanneer we in Safari werken, maken onze extensies gebruik van NPAPI, terwijl ze in Internet Explorer gebruikmaken van ActiveX technologie. <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/Microsoft_Edge\">Microsoft Edge<\/a><\/noindex> ondersteunt momenteel geen extensies, waardoor de webclient met beperkingen werkt.<\/p>\n<h3>Verdere ontwikkeling<\/h3>\n<p>\nEen van de taakgroepen voor het ontwikkelteam van de webclient is de verdere ontwikkeling van functionaliteit. De functionaliteit van de webclient moet identiek zijn aan die van de dunne client, en alle nieuwe functionaliteit moet gelijktijdig worden ge\u00efmplementeerd in zowel de dunne als de webclient.<\/p>\n<p>Andere taken zijn de ontwikkeling van de architectuur, refactoring, en het verbeteren van de prestaties en betrouwbaarheid. Een van de richtingen is de verdere verschuiving naar een asynchrone werkmodel. Een deel van de functionaliteit van de webclient is momenteel gebaseerd op een synchrone interactiemodel met de server. Het asynchrone model wordt nu steeds relevanter in browsers (en niet alleen in browsers), wat ons dwingt de webclient te modificeren door synchrone aanroepen te vervangen door asynchrone (en de bijbehorende refactoring van de code). De geleidelijke overgang naar het asynchrone model wordt verklaard door de noodzaak om uitgebracht oplossingen te ondersteunen en ze geleidelijk aan te passen.<br \/>\n<br \/>Bron: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/1c\/blog\/315414\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041e\u0434\u043d\u043e\u0439 \u0438\u0437 \u043f\u0440\u0438\u044f\u0442\u043d\u044b\u0445 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0435\u0439 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0438 1\u0421:\u041f\u0440\u0435\u0434\u043f\u0440\u0438\u044f\u0442\u0438\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0442\u043e, \u0447\u0442\u043e \u043f\u0440\u0438\u043a\u043b\u0430\u0434\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435, \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u043e\u0435 \u043f\u043e \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c\u044b\u0445 \u0444\u043e\u0440\u043c, \u043c\u043e\u0436\u0435\u0442 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c\u0441\u044f \u043a\u0430\u043a \u0432 \u0442\u043e\u043d\u043a\u043e\u043c (\u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u043c\u043e\u043c) \u043a\u043b\u0438\u0435\u043d\u0442\u0435 \u043f\u043e\u0434 Windows, Linux, MacOS X, \u0442\u0430\u043a \u0438 \u043a\u0430\u043a \u0432\u0435\u0431-\u043a\u043b\u0438\u0435\u043d\u0442 \u043f\u043e\u0434 5 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u043e\u0432 \u2013 Chrome, Internet Explorer, Firefox, Safari, Edge, \u0438 \u0432\u0441\u0435 \u044d\u0442\u043e \u2013 \u0431\u0435\u0437 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u0411\u043e\u043b\u0435\u0435 \u0442\u043e\u0433\u043e \u2013 \u0432\u043d\u0435\u0448\u043d\u0435 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":24269,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-32465","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.3 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041e\u0434\u043d\u043e\u0439 \u0438\u0437 \u043f\u0440\u0438\u044f\u0442\u043d\u044b\u0445 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0435\u0439 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0438 1\u0421:\u041f\u0440\u0435\u0434\u043f\u0440\u0438\u044f\u0442\u0438\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0442\u043e, \u0447\u0442\u043e \u043f\u0440\u0438\u043a\u043b\u0430\u0434\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435, \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u043e\u0435 \u043f\u043e \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c\u044b\u0445 \u0444\u043e\u0440\u043c, \u043c\u043e\u0436\u0435\u0442 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c\u0441\u044f \u043a\u0430\u043a \u0432 \u0442\u043e\u043d\u043a\u043e\u043c (\u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u043c\u043e\u043c) \u043a\u043b\u0438\u0435\u043d\u0442\u0435 \u043f\u043e\u0434 Windows, Linux, MacOS.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/nl\/blog\/administrirovanie\/pro-veb-klient-1s__trashed\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"nl_NL\" \/>\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\/nl\/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\udd47Over de 1C-webclient | ProHoster","description":"Een van de prettige kenmerken van de technologie 1C:Enterprise is dat de applicatieoplossing, ontwikkeld met behulp van beheerde formuliertechnologie, kan worden gestart in zowel de dunne (uitvoerende) client onder Windows, Linux, MacOS.","canonical_url":"https:\/\/prohoster.info\/nl\/blog\/administrirovanie\/pro-veb-klient-1s__trashed","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"nl_NL","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\/nl\/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\/nl\/wp-json\/wp\/v2\/posts\/32465","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/comments?post=32465"}],"version-history":[{"count":1,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/posts\/32465\/revisions"}],"predecessor-version":[{"id":173305,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/posts\/32465\/revisions\/173305"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/media\/24269"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/media?parent=32465"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/categories?post=32465"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/tags?post=32465"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}