{"id":32475,"date":"2019-10-31T21:47:15","date_gmt":"2019-10-31T18:47:15","guid":{"rendered":"https:\/\/prohoster.info\/blog\/platforma-1s-predpriyatie-chto-pod-kapotom\/"},"modified":"2019-10-31T21:47:15","modified_gmt":"2019-10-31T18:47:15","slug":"platforma-1s-predpriyatie-chto-pod-kapotom","status":"publish","type":"post","link":"https:\/\/prohoster.info\/en\/blog\/administrirovanie\/platforma-1s-predpriyatie-chto-pod-kapotom","title":{"rendered":"What\u2019s under the hood of the '1C:Enterprise' platform?","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Hello, Habr! <br \/>\nIn this article, we will begin discussing how the <noindex><a rel=\"nofollow\" href=\"http:\/\/v8.1c.ru\/overview\/Platform.htm\">\u20181C:Enterprise 8\u2019 platform<\/a><\/noindex> is structured and what technologies are used in its development.<\/p>\n<p><img decoding=\"async\" alt=\"What\u2019s under the hood of the &#039;1C:Enterprise&#039; platform?\" src=\"\/wp-content\/uploads\/2019\/04\/9375ea3be32979a7d8c72239dfd50f07.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nWhy do we think this is interesting? Firstly, because the '1C:Enterprise 8' platform is a large application (over 10 million lines of code) written in C++ (client, server, etc.), JavaScript (web client), and, recently, also <noindex><a rel=\"nofollow\" href=\"http:\/\/www.1c.ru\/news\/info.jsp?id=19821\">Java.<\/a><\/noindex>Large projects are interesting due to their scale as issues that go unnoticed in smaller codebases become prominent. Secondly, '1C:Enterprise' is a replicable, boxed product, and there are very few articles about such developments on Habr. Furthermore, it's always intriguing to learn how other teams and companies operate.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nSo, let's get started. In this article, we will review some of the technologies used in the platform, outlining the landscape without delving deeply into implementation. For many mechanisms, a detailed discussion could fill an entire separate article, or for some, even a whole book!<br \/>\nFirst, we should clarify some basics\u2014what is the '1C:Enterprise' platform and what components does it consist of? The answer isn't straightforward, as the term 'Platform' (for brevity, we will refer to it in this way) encompasses the business application development tool, runtime environment, and administration tools. We can conditionally highlight the following components:<\/p>\n<ul>\n<li>server cluster<\/li>\n<li>a 'thin' client capable of connecting to the server via HTTP and its own binary protocol<\/li>\n<li>a client for working in a two-tier architecture with a database located on a hard drive or network folder<\/li>\n<li>web client<\/li>\n<li>application server administration tools<\/li>\n<li>development environment (known as Configurator)<\/li>\n<li>execution environment for iOS, Android, and Windows Phone (1C mobile platform)<\/li>\n<\/ul>\n<p>\nAll these parts, except for the web client, are written in C++. In addition, there is a recently announced <noindex><a rel=\"nofollow\" href=\"http:\/\/www.1c.ru\/news\/info.jsp?id=19821\">next-generation Configurator<\/a><\/noindex>, written in Java.<\/p>\n<h3>Native applications<\/h3>\n<p>\nNative applications are developed using C++03. On Windows, Microsoft Visual C++ 12 (Windows XP compatible profile) is used as the compiler, while gcc 4.8 is used for Linux and Android, and clang 5.0 for iOS. A unified standard library is used across all OSs and compilers \u2014 STLPort. This solution reduces the likelihood of implementation-specific STL errors. We are currently planning to transition to the STL implementation provided with CLang, as STLPort has ceased to be developed and is incompatible with the C++11 support mode enabled in gcc.<br \/>\nThe server codebase is shared 99%, while the client codebase is about 95% shared. Moreover, even the mobile platform uses the same C++ code as the 'main' platform, although the degree of unification is slightly lower. <br \/>\nLike most C++ users, we do not claim to utilize 100% of the language and its libraries. For example, we rarely use Boost, and regarding language features, we have little use for dynamic type casting. However, we actively employ:<\/p>\n<ul>\n<li>STL (in particular, strings, containers, and algorithms)<\/li>\n<li>multiple inheritance, including multiple implementation inheritance<\/li>\n<li>templates<\/li>\n<li>exceptions<\/li>\n<li>smart pointers (custom implementation)<\/li>\n<\/ul>\n<p>\nBy using multiple interface inheritance (completely abstract classes), a component model becomes possible, which will be discussed below.<\/p>\n<h3>Components<\/h3>\n<p>\nTo ensure modularity, all functionality is divided into components, which are dynamic libraries (*.dll for Windows, *.so for Linux). There are over one hundred and fifty components in total; we will provide descriptions of some of them:<\/p>\n<p>backend<br \/>\nContains the platform's metadata 'engine'<\/p>\n<p>accnt<br \/>\nObjects that application developers use to build accounting (charts of accounts and accounting registers)<\/p>\n<p>bsl<br \/>\nEngine for executing the embedded language<\/p>\n<p>nuke<br \/>\nCustom memory allocator implementation<\/p>\n<p>dbeng8<br \/>\nFile database engine. A simple file-server database machine based on ISAM, including a basic SQL processor<\/p>\n<p>wbase<br \/>\nContains basic classes and functions for implementing the Windows user interface \u2014 window classes, access to GDI, etc.<\/p>\n<p>\nSplitting into multiple components is beneficial from several perspectives:<\/p>\n<ul>\n<li>Separation promotes better design, particularly better code isolation<\/li>\n<li>The component set allows for flexible assembly of different delivery options:\n<ul>\n<li>For example, the installation of a thin client will include wbase but will not include backend.<\/li>\n<li>On the server, wbase, on the contrary, will not be present.<\/li>\n<li>Both options will, of course, include nuke and bsl.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>\nAll the components needed for this launch option are loaded when the program starts. This is necessary, in particular, for registering SCOM classes, which will be discussed below.<\/p>\n<h3>SCOM<\/h3>\n<p>\nFor lower-level decomposition, the SCOM system is used, which is ideologically similar to the ATL library. For those who have not worked with ATL, let's briefly list its main capabilities and features. <br \/>\nFor the specially formatted SCOM class:<\/p>\n<ul>\n<li>Provides factory methods that allow creating a class from another component knowing only its name (without revealing the implementation).<\/li>\n<li>Provides a smart pointer infrastructure with reference counting. There is no need to manually monitor the lifetime of the SCOM class.<\/li>\n<li>Allows you to check if an object implements a specific interface and automatically casts the object pointer to the interface pointer.<\/li>\n<li>Create a service object that is always available through the get_service method, etc.<\/li>\n<\/ul>\n<p>\nFor example, you can describe in the component json.dll a class for reading JSON (for instance, JSONStreamReader).<br \/>\nClasses and instances can be created from other components registered in the SCOM machine:<\/p>\n<pre><code class=\"cpp\">SCOM_CLASS_ENTRY(JSONStreamReader)\n<\/code><\/pre>\n<p>\nThis macro will describe a special static class registrar whose constructor will be called when the component is loaded into memory.<br \/>\nAfter this, you can create its instance in another component:<\/p>\n<pre><code class=\"cpp\">IJSONStreamReaderPtr jsonReader = create_instance(SCOM_CLSIDOF(JSONStreamReader));\n<\/code><\/pre>\n<p>\nTo support services, SCOM offers an additional, quite complex infrastructure. Central to this is the concept of a SCOM process, which serves as a container for running services (i.e., acts as a Service Locator) and also contains bindings to localized resources. The SCOM process binds to the OS thread. As a result, services can be obtained within the application like this:<\/p>\n<pre><code class=\"cpp\">SCOM_Process* process = core::current_process();\nif (process)\n\treturn get_service(process);\n<\/code><\/pre>\n<p>\nFurthermore, by switching logical (SCOM) processes tied to the stream, it is possible to achieve almost independent application environments from the perspective of information space, all operating within a single thread. This is how our thin client is designed, which works with a file database \u2014 within a single OS process, there are two SCOM processes: one connected to the client, and the other \u2014 to the server. This approach enables the unification of code writing that will operate both on a local file database and in a 'true' client-server setup. The price for such uniformity is the overhead, but practice shows that it is worth it.<\/p>\n<p>The business logic and interface part of 1C:Enterprise are implemented based on the SCOM component model.<\/p>\n<h3>User Interface<\/h3>\n<p>\nBy the way, regarding interfaces. We do not use standard Windows controls; our controls are implemented directly on the Windows API. For the Linux version, a layer has been created that operates through the wxWidgets library.<br \/>\nThe control library is independent of other parts of '1C:Enterprise' and is also used in several other internal utilities.<\/p>\n<p>Over the years of development of 1C:Enterprise, the appearance of the controls has changed, but a significant change in principles occurred only once, in 2009, with the release of version 8.2 and the introduction of 'managed forms'. In addition to changing the appearance, the fundamental principle of form layout changed \u2014 abandoning pixel-perfect positioning of elements in favor of flow layout. Moreover, in the new model, controls work not directly with domain objects but with special DTO (<noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/DTO\">Data Transfer Objects<\/a><\/noindex>).<br \/>\nThese changes allowed for the creation of a web client for '1C:Enterprise', replicating the C++ logic of the controls in JavaScript. We strive to maintain functional equivalence between thin and web clients. When this is not possible, for example, due to limitations of the available JavaScript API (such as the very limited file handling capabilities), we often implement the required functionality using browser extensions written in C++. Currently, we support Internet Explorer and Microsoft Edge (Windows), Google Chrome (Windows), Firefox (Windows and Linux), and Safari (MacOS).<\/p>\n<p>In addition, the technology of managed forms is used to create the interface of mobile applications on the 1C platform. On mobile devices, the rendering of controls is implemented using the 'native' technologies of the operating system, but the same code is used for the logic of form layout and interface response as in the 'large' platform '1C:Enterprise'.<\/p>\n<p><img decoding=\"async\" alt=\"What\u2019s under the hood of the &#039;1C:Enterprise&#039; platform?\" src=\"\/wp-content\/uploads\/2019\/04\/a4a87ca99cef465e82429739a8845300.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>1C Interface on Linux OS<\/i><\/p>\n<p><img decoding=\"async\" alt=\"What\u2019s under the hood of the &#039;1C:Enterprise&#039; platform?\" src=\"\/wp-content\/uploads\/2019\/04\/23f48ade4e28242104bfd4e9099800e2.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>1C Interface on Mobile Device<\/i><\/p>\n<p><b class=\"spoiler_title\">1C Interface on Other Platforms<\/b> <img decoding=\"async\" alt=\"What\u2019s under the hood of the &#039;1C:Enterprise&#039; platform?\" src=\"\/wp-content\/uploads\/2019\/04\/d04d2431d8c5240d44acce675d837018.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <i>1C Interface on Windows OS<\/i><\/p>\n<p><img decoding=\"async\" alt=\"What\u2019s under the hood of the &#039;1C:Enterprise&#039; platform?\" src=\"\/wp-content\/uploads\/2019\/04\/a443f6e2d1cb95e256e0dcff4fe139d2.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <i>1C Interface \u2014 Web Client<\/i><\/p>\n<p><\/p>\n<h3>Open source<\/h3>\n<p>\nAlthough we do not use standard libraries for C++ developers under Windows (MFC, controls from WinAPI), we do not write all components ourselves. The library has already been mentioned <noindex><a rel=\"nofollow\" href=\"http:\/\/www.wxwidgets.org\/\">wxWidgets<\/a><\/noindex>, and we also use:<\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"http:\/\/curl.haxx.se\/libcurl\/\">cURL<\/a><\/noindex> for working with HTTP and FTP. <\/li>\n<li><noindex><a rel=\"nofollow\" href=\"http:\/\/openssl.org\/\">OpenSSL<\/a><\/noindex> for cryptography and establishing TLS connections.<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"http:\/\/www.xmlsoft.org\/\">libxml2 and libxslt<\/a><\/noindex> for parsing XML.<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/dinhviethoa\/libetpan\">libetpan<\/a><\/noindex> for working with mail protocols (POP3, SMTP, IMAP).<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"http:\/\/www.codesink.org\/mimetic_mime_library.html\">mimetic<\/a><\/noindex> for parsing email messages.<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"http:\/\/www.sqlite.org\/\">sqllite<\/a><\/noindex> for storing user activity logs.<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"http:\/\/site.icu-project.org\/\">ICU<\/a><\/noindex> for internationalization.<\/li>\n<\/ul>\n<p>\nThe list can go on.<br \/>\nIn addition, we use heavily modified versions of <noindex><a rel=\"nofollow\" href=\"http:\/\/code.google.com\/p\/googletest\/\">Google Test<\/a><\/noindex> and <noindex><a rel=\"nofollow\" href=\"http:\/\/code.google.com\/p\/googlemock\/\">Google Mock<\/a><\/noindex> when developing unit tests.<br \/>\nThe libraries required adaptation for compatibility with the SCOM model of component organization.<br \/>\nThe prevalence of 1C makes the platform an excellent stress test for the libraries used in it. The diversity of users and scenarios quickly detects bugs even in the most rarely used parts of the code. We fix them on our side and try to give back to the authors of the libraries. The experience of interaction varies significantly.<br \/>\nDevelopers <noindex><a rel=\"nofollow\" href=\"http:\/\/curl.haxx.se\/libcurl\/\">cURL<\/a><\/noindex> and <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/dinhviethoa\/libetpan\">libetpan<\/a><\/noindex> Some respond quickly to pull requests, but the patch, for example, in <noindex><a rel=\"nofollow\" href=\"http:\/\/openssl.org\/\">OpenSSL<\/a><\/noindex> we still did not manage to return.<\/p>\n<h3>Conclusion<\/h3>\n<p>\nIn this article, we touched on several key aspects of the development of the '1C:Enterprise' platform. In the limited scope of the article, we only addressed some interesting aspects, in our opinion. <br \/>\nA general description of various platform mechanisms can be viewed <noindex><a rel=\"nofollow\" href=\"http:\/\/v8.1c.ru\/overview\/Platform.htm\">here<\/a><\/noindex>.<br \/>\nWhat topics would you be interested in for future articles?<\/p>\n<p>How is the 1C mobile platform implemented?<br \/>\nDescription of the internal structure of the web client? <br \/>\nOr perhaps you are interested in the process of feature selection for new releases, development, and testing?<\/p>\n<p>Leave your comments!<br \/>\n<br \/>Source: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/1c\/blog\/269611\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440! \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043c\u044b \u043d\u0430\u0447\u043d\u0435\u043c \u0440\u0430\u0441\u0441\u043a\u0430\u0437 \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u0443\u0441\u0442\u0440\u043e\u0435\u043d\u0430 \u0432\u043d\u0443\u0442\u0440\u0438 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430 \u00ab1\u0421:\u041f\u0440\u0435\u0434\u043f\u0440\u0438\u044f\u0442\u0438\u0435 8\u00bb \u0438 \u043a\u0430\u043a\u0438\u0435 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u043f\u0440\u0438 \u0435\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435. \u041f\u043e\u0447\u0435\u043c\u0443 \u043c\u044b \u0441\u0447\u0438\u0442\u0430\u0435\u043c, \u0447\u0442\u043e \u044d\u0442\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e? \u0412\u043e-\u043f\u0435\u0440\u0432\u044b\u0445, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430 \u00ab1\u0421:\u041f\u0440\u0435\u0434\u043f\u0440\u0438\u044f\u0442\u0438\u0435 8\u00bb \u2014 \u044d\u0442\u043e \u0431\u043e\u043b\u044c\u0448\u043e\u0435 (\u0431\u043e\u043b\u0435\u0435 10 \u043c\u0438\u043b\u043b\u0438\u043e\u043d\u043e\u0432 \u0441\u0442\u0440\u043e\u043a \u043a\u043e\u0434\u0430) \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043d\u0430 C++ (\u043a\u043b\u0438\u0435\u043d\u0442, \u0441\u0435\u0440\u0432\u0435\u0440 \u0438 \u0442.\u0434.), JavaScript (\u0432\u0435\u0431-\u043a\u043b\u0438\u0435\u043d\u0442), \u0438, \u0441 \u043d\u0435\u0434\u0430\u0432\u043d\u0438\u0445 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":24279,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-32475","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=\"\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440!\" \/>\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\/en\/blog\/administrirovanie\/platforma-1s-predpriyatie-chto-pod-kapotom\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"en_US\" \/>\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\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430 \u00ab1\u0421: \u041f\u0440\u0435\u0434\u043f\u0440\u0438\u044f\u0442\u0438\u0435\u00bb \u2014 \u0447\u0442\u043e \u043f\u043e\u0434 \u043a\u0430\u043f\u043e\u0442\u043e\u043c? | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440!\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/en\/blog\/administrirovanie\/platforma-1s-predpriyatie-chto-pod-kapotom\" \/>\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:15+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T18:47:15+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\udd47 The '1C: Enterprise' platform \u2014 what\u2019s under the hood? | ProHoster","description":"Hello, Habr!","canonical_url":"https:\/\/prohoster.info\/en\/blog\/administrirovanie\/platforma-1s-predpriyatie-chto-pod-kapotom","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"en_US","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\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430 \u00ab1\u0421: \u041f\u0440\u0435\u0434\u043f\u0440\u0438\u044f\u0442\u0438\u0435\u00bb \u2014 \u0447\u0442\u043e \u043f\u043e\u0434 \u043a\u0430\u043f\u043e\u0442\u043e\u043c? | ProHoster","og:description":"\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440!","og:url":"https:\/\/prohoster.info\/en\/blog\/administrirovanie\/platforma-1s-predpriyatie-chto-pod-kapotom","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:15+00:00","article:modified_time":"2019-10-31T18:47:15+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"32475","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:03: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:03:20","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/posts\/32475","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/comments?post=32475"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/posts\/32475\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/media\/24279"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/media?parent=32475"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/categories?post=32475"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/tags?post=32475"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}