{"id":276815,"date":"2016-03-23T17:22:02","date_gmt":"2016-03-23T14:22:02","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=276815"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=276815","title":{"rendered":"XData Studio Asist"},"content":{"rendered":"<p>       <img decoding=\"async\" width=\"50%\" align=\"left\" src=\"https:\/\/habrastorage.org\/files\/f7a\/c9f\/c1a\/f7ac9fc1a2cf431296ef861886d02311.png\"\/>\u042d\u0442\u0430 \u0441\u0442\u0430\u0442\u044c\u044f \u2013 \u043f\u0435\u0440\u0435\u0432\u043e\u0434 \u043c\u043e\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0438, \u043e\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u043d\u0430 \u043d\u043e\u0432\u043e\u043c \u043f\u043e\u0440\u0442\u0430\u043b\u0435 InterSystems <a href=\"https:\/\/community.intersystems.com\/post\/xdata-studio-asist\">Developer Community<\/a>. \u0412 \u043d\u0435\u0439 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043e \u0435\u0449\u0451 \u043e\u0434\u043d\u043e\u0439 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0432 Studio \u2014 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0435 \u0430\u0432\u0442\u043e\u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 XML \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0432 XData. \u042d\u0442\u0430 \u0441\u0442\u0430\u0442\u044c\u044f \u0440\u0430\u0437\u0432\u0438\u0432\u0430\u0435\u0442 <a href=\"https:\/\/community.intersystems.com\/post\/object-generators-homemade-ruleengine\">\u0438\u0434\u0435\u044e<\/a>, \u043f\u043e\u0434\u043d\u044f\u0442\u0443\u044e \u0410\u043b\u044c\u0431\u0435\u0440\u0442\u043e\u043c \u0424\u0443\u044d\u043d\u0442\u0435\u0441\u043e\u043c, \u043e\u0431 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 XData \u0438 <a href=\"http:\/\/docs.intersystems.com\/cache20161\/csp\/docbook\/DocBook.UI.Page.cls?KEY=GOBJ_generators#GOBJ_methodgen\">\u043a\u043e\u0434\u043e\u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u0432<\/a>, \u0434\u043b\u044f \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u043d\u043e\u0433\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043d\u0435\u043a\u0438\u0445 \u043f\u0440\u0430\u0432\u0438\u043b. \u0412\u044b \u0443\u0436\u0435 \u043c\u043e\u0433\u043b\u0438 \u0441\u0442\u0430\u043b\u043a\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u0441 \u0430\u0432\u0442\u043e\u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435\u043c \u0432 XData \u043f\u0440\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 <a href=\"http:\/\/docs.intersystems.com\/cache20161\/csp\/docbook\/DocBook.UI.Page.cls?KEY=GZEN\">ZEN<\/a> \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, <a href=\"http:\/\/docs.intersystems.com\/cache20161\/csp\/docbook\/DocBook.UI.Page.cls?KEY=GCI_manifest\">%Installer<\/a>-\u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u0430 \u0438\u043b\u0438 <a href=\"http:\/\/docs.intersystems.com\/cache20161\/csp\/docbook\/DocBook.UI.Page.cls?KEY=GREST_services\">REST<\/a> \u0431\u0440\u043e\u043a\u0435\u0440\u0430. \u041d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u044d\u0442\u043e <a href=\"http:\/\/docs.intersystems.com\/cache20161\/csp\/docbook\/DocBook.UI.Page.cls?KEY=GZEN_wizards#GZEN_studio_assist\">Studio Assist<\/a>. \u042f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443, \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0442\u0430\u043a\u0443\u044e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c.<br \/>  <a name=\"habracut\"><\/a><br \/>  <br clear=\"left\"\/>  <\/p>\n<h2>\u0410\u0432\u0442\u043e\u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 XML \u0432 XData<\/h2>\n<p>  \u0421\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u0432 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0430\u0432\u0442\u043e\u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0434\u043b\u044f XML. \u041d\u043e \u0432\u0441\u0435 \u043e\u043d\u0438 \u0432 \u0442\u043e\u0439 \u0438\u043b\u0438 \u0438\u043d\u043e\u0439 \u043c\u0435\u0440\u0435 \u0441\u0432\u043e\u0434\u044f\u0442\u0441\u044f \u043a \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044e \u043a\u043b\u0430\u0441\u0441\u0430 <a href=\"http:\/\/docs.intersystems.com\/cache20161\/csp\/documatic\/%25CSP.Documatic.cls?APP=1&amp;LIBRARY=%25SYS&amp;CLASSNAME=%25Studio.SASchemaClass\">%Studio.SASchemaClass<\/a>. \u041d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u0445\u0435\u043c\u044b \u043e\u043f\u0438\u0441\u0430\u043d\u044b \u043d\u0435 \u0447\u0435\u0440\u0435\u0437 \u043a\u043b\u0430\u0441\u0441\u044b \u0430 \u0432 \u0432\u0438\u0434\u0435 \u043e\u0434\u043d\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430, \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u044d\u0442\u0438\u0445 \u0444\u0430\u0439\u043b\u043e\u0432 \u043c\u043e\u0436\u043d\u043e \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u0432 \u043f\u0430\u043f\u043a\u0435 \u0441 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u043c Cach\u00e9 \/dev\/studio\/saschema. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0437\u0434\u0435\u0441\u044c \u0440\u0430\u0441\u043f\u043e\u043b\u0430\u0433\u0430\u0435\u0442\u0441\u044f \u0444\u0430\u0439\u043b \u0441\u0445\u0435\u043c\u044b \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f <a href=\"http:\/\/docs.intersystems.com\/cache20161\/csp\/docbook\/DocBook.UI.Page.cls?KEY=GREST_services#GREST_urlmap_route\">\u0440\u043e\u0443\u0442\u0438\u043d\u0433\u0430<\/a> \u0434\u043b\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0439 \u0432 <a href=\"http:\/\/docs.intersystems.com\/cache20161\/csp\/documatic\/%25CSP.Documatic.cls?APP=1&amp;LIBRARY=%25SYS&amp;CLASSNAME=%25CSP.REST\">%CSP.REST<\/a>, \u0432 \u044d\u0442\u043e\u043c \u043a\u043b\u0430\u0441\u0441\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0430 \u0441\u0445\u0435\u043c\u0430 XML \u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043e\u043d\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0430 UrlMap. \u0424\u043e\u0440\u043c\u0430\u0442 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u0439, \u0432 \u043d\u0435\u043c \u043e\u043f\u0438\u0441\u0430\u043d\u0430 xml namespace \u0438 \u043f\u0440\u0435\u0444\u0438\u043a\u0441. \u0414\u0430\u043b\u0435\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0430 \u0438\u0435\u0440\u0430\u0440\u0445\u0438\u044f \u0442\u0435\u0433\u043e\u0432, \u0441 \u0430\u0442\u0442\u0440\u0438\u0431\u0443\u0442\u0430\u043c\u0438 \u0438 \u0438\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438.  <\/p>\n<blockquote>\n<pre><code># This file defines the Rest UrlMap studio assist database  # Define the prefix mapping !prefix-mapping:urlmap:http:\/\/www.intersystems.com\/urlmap  # Set the default namespace to urlmap !default-namespace:http:\/\/www.intersystems.com\/urlmap  # Set the default prefix for element definitions that follow !default-prefix:urlmap  \/#Routes  Routes\/#Map Routes\/#Route  Map|Prefix Map|Forward  Route|Url Route|Method@enum:!,GET,HEAD,POST,PUT,DELETE,TRACE,CONNECT Route|Call Route|Cors@enum:!,true,false<\/code><\/pre>\n<\/blockquote>\n<p>  \u041d\u043e \u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u044d\u0442\u043e \u043f\u043e\u0434\u043e\u0439\u0434\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u043e\u043c\u043e\u0449\u043d\u0438\u043a\u0430 \u0432 \u0441\u0442\u0443\u0434\u0438\u0438, \u043d\u0430\u043c \u0436\u0435 \u0435\u0449\u0435 \u043d\u0443\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043a\u043e\u0434\u043e\u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044e \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 XML. \u041f\u043e\u043c\u043e\u0433\u0443\u0442 \u043d\u0430\u043c \u0432 \u044d\u0442\u043e\u043c \u043a\u043b\u0430\u0441\u0441\u044b \u0438\u0437 \u043f\u0430\u043a\u0435\u0442\u0430 <a href=\"http:\/\/docs.intersystems.com\/cache20161\/csp\/documatic\/%25CSP.Documatic.cls?APP=1&amp;LIBRARY=%25SYS&amp;PACKAGE=1&amp;CLASSNAME=%25XGEN\">%XGEN<\/a>. \u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e \u0434\u0430\u043d\u043d\u044b\u0435 \u043a\u043b\u0430\u0441\u0441\u044b \u043f\u043e\u043c\u0435\u0447\u0435\u043d\u044b \u043a\u0430\u043a \u043d\u0435 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u043c\u044b\u0435 \u043a \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044e, \u0442\u0430\u043a \u043a\u0430\u043a \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0443\u0434\u0430\u043b\u0435\u043d\u044b \u0438\u0437 \u0431\u0443\u0434\u0443\u0449\u0438\u0445 \u0432\u0435\u0440\u0441\u0438\u0439, \u0430 \u043c\u043e\u0433\u0443\u0442 \u0438 \u043d\u0435\u0442, \u0438 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u0442\u0441\u044f \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c\u0441\u044f \u0432 InterSystems \u0435\u0441\u043b\u0438 \u0432\u0430\u043c \u043e\u043d\u0438 \u043d\u0443\u0436\u043d\u044b. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0442\u0435\u043f\u0435\u0440\u044c \u0434\u043b\u044f \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0441\u0445\u0435\u043c\u044b \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0440\u044f\u0434 \u043a\u043b\u0430\u0441\u0441\u043e\u0432: \u043f\u043e\u0434 \u043a\u0430\u0436\u0434\u044b\u0439 \u0442\u0435\u0433 \u0432 \u043d\u0430\u0448\u0435\u043c XML, \u043d\u0443\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043f\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u043c\u0443 \u043a\u043b\u0430\u0441\u0441\u0443, \u0435\u0449\u0435 \u043e\u0434\u0438\u043d \u043a\u043b\u0430\u0441\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u0441\u0435 \u043d\u0430\u0448\u0438 \u043f\u0440\u0430\u0432\u0438\u043b\u0430, \u0431\u0443\u0434\u0435\u0442 \u0441\u0443\u043f\u0435\u0440\u043a\u043b\u0430\u0441\u0441\u043e\u043c \u0434\u043b\u044f \u043d\u043e\u0432\u044b\u0445 \u043f\u0440\u0430\u0432\u0438\u043b. \u042f \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043c\u043e\u0434\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u043b XML \u0444\u043e\u0440\u043c\u0430\u0442 \u0434\u043b\u044f \u043f\u0440\u0430\u0432\u0438\u043b \u0438\u0437 \u0441\u0442\u0430\u0442\u044c\u0438 \u0410\u043b\u044c\u0431\u0435\u0440\u0442\u0430, \u0438 \u0432 \u0438\u0442\u043e\u0433\u0435 \u0443 \u043d\u0430\u0441 \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0442\u0435\u0433 Definition, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0436\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0442\u0435\u0433\u0438 Rule, \u0430 \u0442\u0435 \u0432 \u0441\u0432\u043e\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043b\u044e\u0431\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0442\u0435\u0433\u043e\u0432 Action. \u041d\u0438\u0436\u0435 \u043f\u0440\u0438\u043c\u0435\u0440 XML \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0443 \u043d\u0430\u0441 \u0434\u043e\u043b\u0436\u0435\u043d \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f.<\/p>\n<pre><code>XData XMLData [ XMLNamespace = RuleEngine ] { &lt;Definition Identifier=&quot;PatientAlerts&quot;&gt;   &lt;Rule Title=&quot;Not young anymore!&quot; Condition=&quot;context.Patient.DOB &gt; $horolog-30&quot;&gt;     &lt;Action Type=&quot;call&quot; Class=&quot;IAT.RuleEngine.Test.Utils&quot; Method=&quot;SendEmail&quot; Args=&quot;&quot;test@server.com&quot;,&quot;Patient is so old!&quot;&quot;\/&gt;     &lt;Action Type=&quot;call&quot; Class=&quot;IAT.RuleEngine.Test.Utils&quot; Method=&quot;ShowObject&quot; Args=&quot;context.Patient&quot;\/&gt;     &lt;Action Type=&quot;return&quot;\/&gt;   &lt;\/Rule&gt; &lt;\/Definition&gt; }<\/code><\/pre>\n<p>  \u0414\u0430\u043b\u0435\u0435 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0434 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0442\u0430\u043a\u043e\u0433\u043e XML, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u0443\u0441\u043b\u043e\u0432\u0438\u0435 (Condition) \u0432 \u043f\u0440\u0430\u0432\u0438\u043b\u0435 (Rule), \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0435 \u0432 \u044d\u0442\u043e\u043c \u043f\u0440\u0430\u0432\u0438\u043b\u0435. <\/p>\n<p>  \u0411\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f %XGEN \u043c\u044b \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0430\u0432\u0442\u043e\u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0432 XData, \u043d\u043e \u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0434 \u043d\u0430 \u0435\u0433\u043e \u043e\u0441\u043d\u043e\u0432\u0435. \u041d\u0430\u0448\u0438 \u043a\u043b\u0430\u0441\u0441\u044b \u0434\u043b\u044f \u0442\u0435\u0433\u043e\u0432 \u043f\u043e\u043b\u0443\u0447\u0430\u044e\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043c\u0435\u0442\u043e\u0434\u043e\u0432, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0438\u0445 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0434 \u043f\u043e\u0434 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u0442\u0435\u0433. \u042d\u0442\u043e \u043c\u0435\u0442\u043e\u0434\u044b <b>%OnGenerateCode<\/b>, <b>%OnBeforeGenerateCode<\/b> \u0438 <b>%OnAfterGenerateCode<\/b>.<\/p>\n<p>  \u041a\u043b\u0430\u0441\u0441\u044b \u0434\u043b\u044f \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0433\u043e \u0442\u0435\u0433\u0430 Definition:<\/p>\n<pre><code>Class IAT.RuleEngine.Definition Extends %XGEN.AbstractDocument [ System = 3 ] {  Parameter NAMESPACE = &quot;RuleEngine&quot;;  Parameter XMLNAMESPACE = &quot;RuleEngine&quot;;  Parameter ROOTCLASSES As STRING = &quot;IAT.RuleEngine.Definition:Definition&quot;;  Property Identifier As %String(MAXLEN = 200, XMLPROJECTION = &quot;ATTRIBUTE&quot;);  Property Rules As list Of Rule(XMLPROJECTION = &quot;ELEMENT&quot;);  \/\/\/ This method is called when a class containing an XGEN \/\/\/ document is compiled. It is called &lt;em&gt;before&lt;\/em&gt; the &lt;method&gt;%GenerateCode&lt;\/method&gt; method \/\/\/ processes its children.&lt;br&gt; \/\/\/ &lt;var&gt;pTargetClass&lt;\/var&gt; is the class that contains the XGEN document.&lt;br\/&gt; \/\/\/ &lt;var&gt;pCode&lt;\/var&gt; is a stream containing the generated code.&lt;br\/&gt; \/\/\/ &lt;var&gt;pDocument&lt;\/var&gt; is the top-level XGEN document object that contains this node.&lt;br\/&gt; \/\/\/ A subclass can provide an implementation of this method that will \/\/\/ generate specific lines of code.&lt;br\/&gt; Method %OnBeforeGenerateCode(pTargetClass As %Dictionary.CompiledClass, pCode As %Stream.TmpCharacter, pDocument As %XGEN.AbstractDocument) As %Status {     do pCode.WriteLine(&quot;#define AddLog(%line) set log($i(log))=&quot;&quot;[&quot;&quot;_$zdatetime($ztimestamp,3)_&quot;&quot;] &quot;&quot;_%line&quot;)     do pCode.WriteLine(..%Indent(1)_&quot;Set tSC = $$$OK &quot;)     do pCode.WriteLine(..%Indent(1)_&quot;try { &quot;)     quit $$$OK }  \/\/\/ This method is called when a class containing an XGEN \/\/\/ document is compiled. It is called &lt;em&gt;after&lt;\/em&gt; the &lt;method&gt;%GenerateCode&lt;\/method&gt; method \/\/\/ processes its children.&lt;br&gt; \/\/\/ &lt;var&gt;pTargetClass&lt;\/var&gt; is the class that contains the XGEN document.&lt;br\/&gt; \/\/\/ &lt;var&gt;pCode&lt;\/var&gt; is a stream containing the generated code.&lt;br\/&gt; \/\/\/ &lt;var&gt;pDocument&lt;\/var&gt; is the top-level XGEN document object that contains this node.&lt;br\/&gt; \/\/\/ A subclass can provide an implementation of this method that will \/\/\/ generate specific lines of code.&lt;br\/&gt; Method %OnAfterGenerateCode(pTargetClass As %Dictionary.CompiledClass, pCode As %Stream.TmpCharacter, pDocument As %XGEN.AbstractDocument) As %Status {     do pCode.WriteLine(..%Indent(1)_&quot;} catch ex { set tSC = ex.AsStatus() }&quot;)     do pCode.WriteLine(..%Indent(1)_&quot;quit tSC&quot;)     quit $$$OK }  }<\/code><\/pre>\n<p>  \u0421\u043b\u0435\u0434\u043e\u043c, \u0442\u0435\u0433 Rule:<\/p>\n<pre><code>Class IAT.RuleEngine.Rule Extends IAT.RuleEngine.Sequence [ System = 3 ] {  Property Title As %String(XMLPROJECTION = &quot;ATTRIBUTE&quot;);  Property Condition As %String(XMLPROJECTION = &quot;ATTRIBUTE&quot;);  Property Actions As list Of Action(XMLPROJECTION = &quot;ELEMENT&quot;);  \/\/\/ This method is called when a class containing an XGEN \/\/\/ document is compiled. It is called &lt;em&gt;before&lt;\/em&gt; the &lt;method&gt;%GenerateCode&lt;\/method&gt; method \/\/\/ processes its children.&lt;br&gt; \/\/\/ &lt;var&gt;pTargetClass&lt;\/var&gt; is the class that contains the XGEN document.&lt;br\/&gt; \/\/\/ &lt;var&gt;pCode&lt;\/var&gt; is a stream containing the generated code.&lt;br\/&gt; \/\/\/ &lt;var&gt;pDocument&lt;\/var&gt; is the top-level XGEN document object that contains this node.&lt;br\/&gt; \/\/\/ A subclass can provide an implementation of this method that will \/\/\/ generate specific lines of code.&lt;br\/&gt; Method %OnBeforeGenerateCode(pTargetClass As %Dictionary.CompiledClass, pCode As %Stream.TmpCharacter, pDocument As %XGEN.AbstractDocument) As %Status {     do pCode.WriteLine(..%Indent()_&quot;If (&quot;_..Condition_&quot;) { set actionCounter=0 &quot;)     do pCode.WriteLine(..%Indent(1)_&quot;$$$AddLog(&quot;&quot;Rule: &quot;_..Title_&quot; &quot;&quot;)&quot;)     quit $$$OK }  \/\/\/ This method is called when a class containing an XGEN \/\/\/ document is compiled. It is called &lt;em&gt;after&lt;\/em&gt; the &lt;method&gt;%GenerateCode&lt;\/method&gt; method \/\/\/ processes its children.&lt;br&gt; \/\/\/ &lt;var&gt;pTargetClass&lt;\/var&gt; is the class that contains the XGEN document.&lt;br\/&gt; \/\/\/ &lt;var&gt;pCode&lt;\/var&gt; is a stream containing the generated code.&lt;br\/&gt; \/\/\/ &lt;var&gt;pDocument&lt;\/var&gt; is the top-level XGEN document object that contains this node.&lt;br\/&gt; \/\/\/ A subclass can provide an implementation of this method that will \/\/\/ generate specific lines of code.&lt;br\/&gt; Method %OnAfterGenerateCode(pTargetClass As %Dictionary.CompiledClass, pCode As %Stream.TmpCharacter, pDocument As %XGEN.AbstractDocument) As %Status {     do pCode.WriteLine(..%Indent()_&quot;}&quot;)     quit $$$OK }  }<\/code><\/pre>\n<p>  \u0418 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u0442\u0435\u0433 Action:<\/p>\n<pre><code>Class IAT.RuleEngine.Action Extends IAT.RuleEngine.RuleEngineNode [ System = 3 ] {  Parameter NAMESPACE = &quot;RuleEngine&quot;;  Property Type As %String(VALUELIST = &quot;,call,return&quot;, XMLPROJECTION = &quot;ATTRIBUTE&quot;);  Property Class As %String(XMLPROJECTION = &quot;ATTRIBUTE&quot;);  Property Method As %String(XMLPROJECTION = &quot;ATTRIBUTE&quot;);  Property Args As %String(XMLPROJECTION = &quot;ATTRIBUTE&quot;);  \/\/\/ Generate code for this node.&lt;br\/&gt; \/\/\/ This method is called when a class containing an XGEN \/\/\/ document is compiled.&lt;br\/&gt; \/\/\/ &lt;var&gt;pTargetClass&lt;\/var&gt; is the class that contains the XGEN document.&lt;br\/&gt; \/\/\/ &lt;var&gt;pCode&lt;\/var&gt; is a stream containing the generated code.&lt;br\/&gt; \/\/\/ &lt;var&gt;pDocument&lt;\/var&gt; is the top-level XGEN document object that contains this node.&lt;br\/&gt; \/\/\/ A subclass will provide an implementation of this method that will \/\/\/ generate specific lines of code.&lt;br\/&gt; \/\/\/ For example: \/\/\/ &lt;example&gt; \/\/\/ Do pCode.WriteLine(..%Indent()_&quot;Set &quot; _ ..target _ &quot;=&quot; _ $$$quote(..value)) \/\/\/ &lt;\/example&gt; Method %OnGenerateCode(pTargetClass As %Dictionary.CompiledClass, pCode As %Stream.TmpCharacter, pDocument As %XGEN.AbstractDocument) As %Status {     do pCode.WriteLine(..%Indent()_&quot;$$$AddLog(&quot;&quot;Action: &quot;&quot;_$i(actionCounter))&quot;)     if ..Type=&quot;call&quot; {         do pCode.WriteLine(..%Indent() _ &quot;do $classmethod(&quot;_$$$quote(..Class)_&quot;, &quot;_$$$quote(..Method)_&quot;, &quot;_..Args_&quot;)&quot;)     }     elseif ..Type=&quot;return&quot; {         do pCode.WriteLine(..%Indent() _ &quot;quit &quot;)     }        Quit $$$OK }  }<\/code><\/pre>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u043c \u043d\u0443\u0436\u0435\u043d \u043a\u043b\u0430\u0441\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u043c \u0434\u043b\u044f \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u043f\u0440\u0430\u0432\u0438\u043b, \u0438 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043c\u043e\u0436\u0435\u0442 \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0439 XML.<\/p>\n<pre><code>Class IAT.RuleEngine.Engine Extends %RegisteredObject [ System = 3 ] {  XData XMLData [ XMLNamespace = RuleEngine ] { &lt;Definition&gt; &lt;\/Definition&gt; }  \/\/\/ \u0418\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043f\u0440\u0430\u0432\u0438\u043b ClassMethod Evaluate(context, log) [ CodeMode = objectgenerator ] {     \/\/\/ \u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u043a\u043e\u0434\u0430 \u0434\u043b\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043f\u0440\u0430\u0432\u0438\u043b     Quit ##class(IAT.RuleEngine.Definition).%Generate(%compiledclass, %code, &quot;XMLData&quot;) }  } <\/code><\/pre>\n<p>  \u0418 \u0442\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0441\u0432\u043e\u0439 \u043a\u043b\u0430\u0441\u0441 \u0441 \u043f\u0440\u0430\u0432\u0438\u043b\u0430\u043c\u0438:<\/p>\n<pre><code>Class IAT.RuleEngine.Test.PatientAlertsRule Extends IAT.RuleEngine.Engine {  XData XMLData [ XMLNamespace = RuleEngine ] { &lt;Definition Identifier=&quot;PatientAlerts&quot;&gt; &lt;Rule Title=&quot;Not young anymore!&quot; Condition=&quot;context.Patient.DOB &gt; $horolog-30&quot;&gt; &lt;Action Type=&quot;call&quot; Class=&quot;IAT.RuleEngine.Test.Utils&quot; Method=&quot;SendEmail&quot; Args=&quot;&quot;test@server.com&quot;,&quot;Patient is so old!&quot;&quot;\/&gt; &lt;Action Type=&quot;call&quot; Class=&quot;IAT.RuleEngine.Test.Utils&quot; Method=&quot;ShowObject&quot; Args=&quot;context.Patient&quot;\/&gt; &lt;Action Type=&quot;return&quot;\/&gt; &lt;\/Rule&gt; &lt;\/Definition&gt; }  }<\/code><\/pre>\n<p>  \u041f\u043e\u0441\u043b\u0435 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u043a\u043e\u0434:<\/p>\n<pre><code>zEvaluate(context,log) public {  \/\/ generated by IAT.RuleEngine.Definition \tset tSC=1 \ttry { \tIf (context.Patient.DOB &gt; $horolog-30) { set actionCounter=0  \t\tset log($i(log))=&quot;[&quot;_$zdatetime($ztimestamp,3)_&quot;] &quot;_&quot;Rule: Not young anymore! &quot; \t\tset log($i(log))=&quot;[&quot;_$zdatetime($ztimestamp,3)_&quot;] &quot;_&quot;Action: &quot;_$i(actionCounter) \t\tdo $classmethod(&quot;IAT.RuleEngine.Test.Utils&quot;, &quot;SendEmail&quot;, &quot;test@server.com&quot;,&quot;Patient is so old!&quot;) \t\tset log($i(log))=&quot;[&quot;_$zdatetime($ztimestamp,3)_&quot;] &quot;_&quot;Action: &quot;_$i(actionCounter) \t\tdo $classmethod(&quot;IAT.RuleEngine.Test.Utils&quot;, &quot;ShowObject&quot;, context.Patient) \t\tset log($i(log))=&quot;[&quot;_$zdatetime($ztimestamp,3)_&quot;] &quot;_&quot;Action: &quot;_$i(actionCounter) \t\tquit  \t} \t} catch ex { \t\tset tSC = ex.AsStatus() \t} \tquit tSC } <\/code><\/pre>\n<p>  \u041f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043a\u043e\u0434 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043d\u0430 <a href=\"https:\/\/github.com\/intersystems-ib\/cache-iat-ruleengine\/tree\/pr\/xgen\">GitHub<\/a>.<\/p>\n<h2>\u041e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0444\u0430\u0439\u043b<\/h2>\n<p>  \u041d\u043e \u043d\u0430 \u044d\u0442\u043e\u043c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 Studio \u043d\u0435 \u0437\u0430\u043a\u0430\u043d\u0447\u0438\u0432\u0430\u044e\u0442\u0441\u044f. \u042f \u0443\u0436\u0435 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u043b \u0432 \u043e\u0434\u043d\u043e\u0439 \u0438\u0437 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0445 <a href=\"https:\/\/habrahabr.ru\/company\/intersystems\/blog\/222563\/\">\u0441\u0442\u0430\u0442\u0435\u0439<\/a> \u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0441\u0432\u043e\u0438 \u0442\u0438\u043f\u044b \u0444\u0430\u0439\u043b\u043e\u0432. \u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0435\u0441\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u0442\u0438\u043f \u0444\u043e\u0440\u043c\u0430\u0442\u0430 XML, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0442\u0430\u043a \u0436\u0435 \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0442\u044c \u0438 \u0430\u0432\u0442\u043e\u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0438 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u044f XML \u0432 \u043d\u0435\u043a\u0438\u0439 \u043a\u043e\u0434, \u043f\u043e \u0442\u043e\u0439 \u0436\u0435 \u0441\u0445\u0435\u043c\u0435. \u0421 \u0442\u0435\u043a\u0443\u0449\u0438\u043c \u043f\u0440\u0438\u043c\u0435\u0440 \u0442\u0430\u043a \u0436\u0435 \u0435\u0441\u0442\u044c \u043c\u043e\u0439 \u043f\u043e\u0441\u0442 \u0438 \u043d\u0430 <a href=\"https:\/\/community.intersystems.com\/post\/custom-studio-file\">Developer Community<\/a>.<\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041a\u043e\u0434 \u043a\u043b\u0430\u0441\u0441\u0430 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0444\u0430\u0439\u043b\u0430<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code>Class IAT.RuleEngine.EngineFile Extends %Studio.AbstractDocument [ System = 4 ] {  Projection RegisterExtension As %Projection.StudioDocument(DocumentDescription = &quot;RuleEngine file&quot;, DocumentExtension = &quot;RULE&quot;, DocumentNew = 0, DocumentType = &quot;xml&quot;, XMLNamespace = &quot;RuleEngine&quot;);  Parameter NAMESPACE = &quot;RuleEngine&quot;;  Parameter EXTENSION = &quot;.rule&quot;;  Parameter DOCUMENTCLASS = &quot;IAT.RuleEngine.Engine&quot;;  ClassMethod GetClassName(pName As %String) As %String [ CodeMode = expression ] { $P(pName,&quot;.&quot;,1,$L(pName,&quot;.&quot;)-1) }  \/\/\/ Load the routine in Name into the stream Code Method Load() As %Status {     Set tClassName = ..GetClassName(..Name)          Set tXDataDef = ##class(%Dictionary.XDataDefinition).%OpenId(tClassName_&quot;||XMLData&quot;)     If ($IsObject(tXDataDef)) {         do ..CopyFrom(tXDataDef.Data)     }          Quit $$$OK }  \/\/\/ Compile the routine Method Compile(flags As %String) As %Status {     Set tSC = $$$OK      If $get($$$qualifierGetValue(flags,&quot;displaylog&quot;)){         Write !,&quot;Compiling document: &quot; _ ..Name     }     Set tSC = $System.OBJ.Compile(..GetClassName(..Name),.flags,,1)          Quit tSC }  \/\/\/ Delete the routine 'name' which includes the routine extension ClassMethod Delete(name As %String) As %Status {     Set tSC = $$$OK     If (..#DOCUMENTCLASS'=&quot;&quot;) {         Set tSC = $System.OBJ.Delete(..GetClassName(name))     }     Quit tSC }  \/\/\/ Lock the class definition for the document. Method Lock(flags As %String) As %Status {     If ..Locked Set ..Locked=..Locked+1 Quit $$$OK     Set tClassname = ..GetClassName(..Name)     Lock +^oddDEF(tClassname):0     If '$Test Quit $$$ERROR($$$CanNotLockRoutineInfo,tClassname)     Set ..Locked=1     Quit $$$OK }  \/\/\/ Unlock the class definition for the document. Method Unlock(flags As %String) As %Status {     If '..Locked Quit $$$OK     Set tClassname = ..GetClassName(..Name)     If ..Locked&gt;1 Set ..Locked=..Locked-1 Quit $$$OK     Lock -^oddDEF(tClassname)     Set ..Locked=0     Quit $$$OK }  \/\/\/ Return the timestamp of routine 'name' in %TimeStamp format. This is used to determine if the routine has \/\/\/ been updated on the server and so needs reloading from Studio. So the format should be $zdatetime($horolog,3), \/\/\/ or &quot;&quot; if the routine does not exist. ClassMethod TimeStamp(name As %String) As %TimeStamp {     If (..#DOCUMENTCLASS'=&quot;&quot;) {         Set cls = ..GetClassName(name)         Quit $ZDT($$$defClassKeyGet(cls,$$$cCLASStimechanged),3)     }     Else {         Quit &quot;&quot;     } }  \/\/\/ Return 1 if the routine 'name' exists and 0 if it does not. ClassMethod Exists(name As %String) As %Boolean {     Set tExists = 0     Try {         Set tClass = ..GetClassName(name)         Set tExists = ##class(%Dictionary.ClassDefinition).%ExistsId(tClass)     }     Catch ex {         Set tExists = 0     }          Quit tExists }  \/\/\/ Save the routine stored in Code Method Save() As %Status {     Write !,&quot;Save: &quot;,..Name     set tSC = $$$OK     try {         Set tClassName = ..GetClassName(..Name)                  Set tClassDef = ##class(%Dictionary.ClassDefinition).%OpenId(tClassName)         if '$isObject(tClassDef) {             set tClassDef = ##class(%Dictionary.ClassDefinition).%New()             Set tClassDef.Name = tClassName             Set tClassDef.Super = ..#DOCUMENTCLASS         }                  Set tIndex = tClassDef.XDatas.FindObjectId(tClassName_&quot;||XMLData&quot;)         If tIndex'=&quot;&quot; Do tClassDef.XDatas.RemoveAt(tIndex)                  Set tXDataDef = ##class(%Dictionary.XDataDefinition).%New()         Set tXDataDef.Name = &quot;XMLData&quot;         Set tXDataDef.XMLNamespace = ..#NAMESPACE         Set tXDataDef.parent = tClassDef         do ..Rewind()         do tXDataDef.Data.CopyFrom($this)                  set tSC = tClassDef.%Save()     } catch ex {     }     Quit tSC }  Query List(Directory As %String, Flat As %Boolean, System As %Boolean) As %Query(ROWSPEC = &quot;name:%String,modified:%TimeStamp,size:%Integer,directory:%String&quot;) [ SqlProc ] { }  ClassMethod ListExecute(ByRef qHandle As %Binary, Directory As %String = &quot;&quot;, Flat As %Boolean, System As %Boolean) As %Status {     Set qHandle = &quot;&quot;     If Directory'=&quot;&quot; Quit $$$OK          \/\/ get list of classes     Set tRS = ##class(%Library.ResultSet).%New(&quot;%Dictionary.ClassDefinition:SubclassOf&quot;)      Do tRS.Execute(..#DOCUMENTCLASS)     While (tRS.Next()) {         Set qHandle(&quot;Classes&quot;,tRS.Data(&quot;Name&quot;)) = &quot;&quot;     }          Quit $$$OK }  ClassMethod ListFetch(ByRef qHandle As %Binary, ByRef Row As %List, ByRef AtEnd As %Integer = 0) As %Status [ PlaceAfter = ListExecute ] {     Set qHandle = $O(qHandle(&quot;Classes&quot;,qHandle))     If (qHandle '= &quot;&quot;) {                  Set tTime = $ZDT($$$defClassKeyGet(qHandle,$$$cCLASStimechanged),3)         Set Row = $LB(qHandle _ ..#EXTENSION,tTime,,&quot;&quot;)         Set AtEnd = 0     }     Else {         Set Row = &quot;&quot;         Set AtEnd = 1     }     Quit $$$OK }  \/\/\/ Return other document types that this is related to. \/\/\/ Passed a name and you return a comma separated list of the other documents it is related to \/\/\/ or &quot;&quot; if it is not related to anything&lt;br&gt; \/\/\/ Subclass should override this behavior for non-class based editors. ClassMethod GetOther(Name As %String) As %String {     If (..#DOCUMENTCLASS=&quot;&quot;) {         \/\/ no related item         Quit &quot;&quot;     }          Set result = &quot;&quot;,tCls=..GetClassName(Name)          \/\/ This changes with MAK1867     If $$$defClassDefined(tCls),..Exists(Name) {         Set:result'=&quot;&quot; result=result_&quot;,&quot;         Set result = result _ tCls _ &quot;.cls&quot;     }          Quit result }  }<\/code><\/pre>\n<\/div>\n<\/div>\n<p>  \u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u043f\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u043d\u0430\u0448 \u043d\u043e\u0432\u044b\u0439 \u0442\u0438\u043f \u0444\u0430\u0439\u043b\u0430 *.rule, \u0438 \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u0444\u0430\u0439\u043b, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u043e\u0442\u043e\u0431\u0440\u0430\u043d \u043a\u0430\u043a \u043d\u0430\u0441\u043b\u0435\u0434\u043d\u0438\u043a \u043d\u0430\u0448\u0435\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 \u0448\u0430\u0431\u043b\u043e\u043d\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u0442 \u043d\u0430\u0448 XML.<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/23e\/e4e\/449\/23ee4e449a07412a9cee81bf00c6c3f3.png\" alt=\"image\" \/><\/div>\n<p>  <a href=\"https:\/\/habrastorage.org\/files\/5bd\/3ee\/5df\/5bd3ee5df7364781872078cf931b142c.png\"><\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/7dc\/1c1\/7ef\/7dc1c17ef65642419e8eb7fb641e84f0.png\" alt=\"image\" \/><\/div>\n<p><\/a><br \/>  \u0415\u0441\u043b\u0438 \u0432 \u0440\u0435\u0436\u0438\u043c\u0435 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f XML \u043e\u0442\u043e\u0431\u0440\u0430\u0437\u0438\u0442\u044c \u0434\u0440\u0443\u0433\u043e\u0439 \u043a\u043e\u0434, \u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d \u0432\u0441\u0435 \u0442\u043e\u0442 \u0436\u0435 \u043a\u043b\u0430\u0441\u0441. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d XML, \u0430 \u043d\u0430 \u0432\u044b\u0445\u043e\u0434\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0440\u0430\u0431\u043e\u0447\u0438\u0439 \u0433\u043e\u0442\u043e\u0432\u044b\u0439 \u043a \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044e \u043f\u0440\u0430\u0432\u0438\u043b \u043a\u043e\u0434.<\/p>\n<h2>Atelier<\/h2>\n<p>  Studio \u0442\u0435\u043f\u0435\u0440\u044c \u0443\u0436\u0435 \u043d\u0435 \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0440\u0435\u0434\u0430 \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043d\u0430 Cach\u00e9. \u0422\u0435\u043f\u0435\u0440\u044c \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0438 Atelier. \u041a\u0430\u043a \u043d\u0430\u0441\u0447\u0435\u0442 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438 \u0442\u0430\u043a\u0438\u0445 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439 \u0432 Atelier? \u041f\u043e\u043a\u0430 \u0442\u0430\u043a\u043e\u0439 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438 \u043d\u0435\u0442, \u0442\u0430\u043a \u0436\u0435 \u043a\u0430\u043a \u0438 \u043d\u0435\u0442 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e \u0442\u043e\u043c, \u043a\u043e\u0433\u0434\u0430 \u043f\u043e\u044f\u0432\u0438\u0442\u0441\u044f \u0438 \u043f\u043e\u044f\u0432\u0438\u0442\u0441\u044f \u043b\u0438 \u0432\u043e\u043e\u0431\u0449\u0435 \u0432 \u0431\u0443\u0434\u0443\u0449\u0435\u043c. \u042d\u0442\u043e \u043a\u0430\u0441\u0430\u0435\u0442\u0441\u044f \u043a\u0430\u043a \u0430\u0432\u0442\u043e\u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f, \u0442\u0430\u043a \u0438 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0445 \u0442\u0438\u043f\u043e\u0432 \u0444\u0430\u0439\u043b\u043e\u0432. \u041d\u043e Atelier \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043d \u043d\u0430 Eclipse \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0442\u0430\u043a\u0430\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u0430 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0432 InterSystems \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0430 \u0432 \u0432\u0438\u0434\u0435 \u043f\u043b\u0430\u0433\u0438\u043d\u0430.               <\/p>\n<div class=\"clear\"><\/div>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habrahabr.ru\/post\/279579\/\"> https:\/\/habrahabr.ru\/post\/279579\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>       <img decoding=\"async\" width=\"50%\" align=\"left\" src=\"https:\/\/habrastorage.org\/files\/f7a\/c9f\/c1a\/f7ac9fc1a2cf431296ef861886d02311.png\"\/>\u042d\u0442\u0430 \u0441\u0442\u0430\u0442\u044c\u044f \u2013 \u043f\u0435\u0440\u0435\u0432\u043e\u0434 \u043c\u043e\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0438, \u043e\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u043d\u0430 \u043d\u043e\u0432\u043e\u043c \u043f\u043e\u0440\u0442\u0430\u043b\u0435 InterSystems <a href=\"https:\/\/community.intersystems.com\/post\/xdata-studio-asist\">Developer Community<\/a>. \u0412 \u043d\u0435\u0439 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043e \u0435\u0449\u0451 \u043e\u0434\u043d\u043e\u0439 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0432 Studio \u2014 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0435 \u0430\u0432\u0442\u043e\u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 XML \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0432 XData. \u042d\u0442\u0430 \u0441\u0442\u0430\u0442\u044c\u044f \u0440\u0430\u0437\u0432\u0438\u0432\u0430\u0435\u0442 <a href=\"https:\/\/community.intersystems.com\/post\/object-generators-homemade-ruleengine\">\u0438\u0434\u0435\u044e<\/a>, \u043f\u043e\u0434\u043d\u044f\u0442\u0443\u044e \u0410\u043b\u044c\u0431\u0435\u0440\u0442\u043e\u043c \u0424\u0443\u044d\u043d\u0442\u0435\u0441\u043e\u043c, \u043e\u0431 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 XData \u0438 <a href=\"http:\/\/docs.intersystems.com\/cache20161\/csp\/docbook\/DocBook.UI.Page.cls?KEY=GOBJ_generators#GOBJ_methodgen\">\u043a\u043e\u0434\u043e\u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u0432<\/a>, \u0434\u043b\u044f \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u043d\u043e\u0433\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043d\u0435\u043a\u0438\u0445 \u043f\u0440\u0430\u0432\u0438\u043b. \u0412\u044b \u0443\u0436\u0435 \u043c\u043e\u0433\u043b\u0438 \u0441\u0442\u0430\u043b\u043a\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u0441 \u0430\u0432\u0442\u043e\u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435\u043c \u0432 XData \u043f\u0440\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 <a href=\"http:\/\/docs.intersystems.com\/cache20161\/csp\/docbook\/DocBook.UI.Page.cls?KEY=GZEN\">ZEN<\/a> \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, <a href=\"http:\/\/docs.intersystems.com\/cache20161\/csp\/docbook\/DocBook.UI.Page.cls?KEY=GCI_manifest\">%Installer<\/a>-\u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u0430 \u0438\u043b\u0438 <a href=\"http:\/\/docs.intersystems.com\/cache20161\/csp\/docbook\/DocBook.UI.Page.cls?KEY=GREST_services\">REST<\/a> \u0431\u0440\u043e\u043a\u0435\u0440\u0430. \u041d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u044d\u0442\u043e <a href=\"http:\/\/docs.intersystems.com\/cache20161\/csp\/docbook\/DocBook.UI.Page.cls?KEY=GZEN_wizards#GZEN_studio_assist\">Studio Assist<\/a>. \u042f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443, \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0442\u0430\u043a\u0443\u044e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c.  <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-276815","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/276815","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=276815"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/276815\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=276815"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=276815"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=276815"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}