Thanks for pointing this our and glad to see you're actively working with IRIS. As Vic has  pointed out although the ObjectScript VSCode extension has been announced, we haven't yet released our first release 1.0. See the message from @Raj Singh .

In fact, the BPL editor (IDE) is only available in Studio and the Management Portal. We'll fix this.

 Although you certainly can use the existing extension, it is not an InterSystems offering. We are in the process of revising recommendations to use Atelier. Once the VSCode extension is released we will have documentation for it.

For now, if you're working with productions, I'd recommend using InterSystems Studio or the Management Portal. Atelier can also be used but doesn't have any advantage over Studio.

Thanks for finding this. We'll fix it. We have two sets of Python doc: the automatically generated reference (from source code comments) ,  which you were using and the User's Guide and Reference , which has the correct information.

Obviously we generated the reference with an earlier version of the software and didn't update it after the change. We will fix that.

I would recommend using the User's Guide and Reference rather than the automatically generated one.

If you find any problems in the User's Guide and Reference, you can click on the Help us improve this page tab on the right and we'll fix it. We haven't yet added it to the automatically-generated reference. You can also send us a comment  at

The WRC is InterSystems Worldwide Resource Center, our support group. No need to contact them over this, but they are a great resource for many issues.

Thanks for the comment. Is this description clearer?

Using the /api/mgmnt Service to Create a REST Service

The recommended way to create a REST service is to create an OpenAPI 2.0 (also called Swagger) description for the REST service and use that to generate the REST service classes. If you are implementing a REST service defined by a third party, they may provide this OpenAPI 2.0 description. See the OpenAPI 2.0 Specification for details about the format of an OpenAPI 2.0 description. The following topics describe how to use the /api/mgmnt service to do this.

Using the /api/mgmnt Service to Generate the Classes

In the first step, generate the REST service classes, as follows:

  1. Create or obtain the OpenAPI 2.0 description of the REST service, in JSON format.

Thanks again and feel free to use the "Help us improve this page" link on any of our documentation pages to send us a comment.

If you do need to do this in a router. Here is the overall process.

  1.  Define a business rule. Make it a General Message Routing Rule and have the assist class be EnsLib.MsgRouter.RuleAssist.
  2. Add a rule to the rule set and double-click Constraint. Specify the rule class
    Persistent > ENS > StreamContainer
    That's the message class used by the pass-through file service/operation. You can also specify the business service as the source.
  3. Double-click  condition, and in the expression editor specify Document.Type or Document.OriginalFilename, add an operation, and a  value.
  4. Send it to the correct operation.
  5. Define a router business process and specify the rule you just created.
  6. Connect the pass-through file service to the router.

But you may not need the router at all.

I'm not sure that the Ensemble Record Mapper makes this much easier than just reading the stream. Unless you don't treat the end of line as terminator, each line will be a separate record. It is possible that you could use the Complex Record Mapper to create one record from the file using the first column as the leading text, but that requires defining one record map for each line in the file. I'm not sure how to handle the Hospital name and blank lines. I don't think that batch record map would help because there's different kinds of information on each line.

But I think most of the work is not going to be parsing the input file but in making sure that the HL7 message has all the right segments and fields.

Is it possible to append the files outside of Ensemble and then use batch record map? The current version of Ensemble handles batch record maps much more efficiently than it can handle individual record maps. If you are on an older version, let me know and  I'll find out if the efficiency improvements are in it.

I think that increasing pool  size will give you some improvement, but batch record map can avoid a lot of overhead handling each individual record.

Part of the efficiency improvement depends on what you're doing with the record. If you're just loading data, it's very efficient. If you're performing a transformation on the incoming data then that could still take a significant amount of time.

This class wasn't intended as a general-purpose service but was done for a simple way to get a SOAP message past a firewall. It is sending an HL7 message and not any XML representation  It is expecting a message in the form generated by  EnsLib.HL7.Util.SOAPClient.Send. I'm trying to get more information on it, but you could try 

  HL7 File Service --> EnsLib.HL7.Operation  --> EnsLibb.HL7.Service.SOAPService --> HL7 File Operation

Assuming the message comes through this, you can put a TCP trace to see the exact format of the SOAP message. 

I am the Ensemble technical  writer. While we don't have Ensemble evaluations freely available,  someone in sales can arrange for a temporary license. Send me your contact information to and I'll find the appropriate sales person to contact.

Name, email, phone, address, and company/school/organization (if you have one).

Thanks and sorry for the non-response from support.

Great explanation of how you used Ensemble. Thanks. 

Could you send me more information on what you'd like to see in the Ensemble documentation. I know  there are lots of areas that need improvement, but it's a big product and getting more specific information would help set our priorities in improving the documentation. You could reply here or send me email directly at

Thanks again

If you follow Dave's excellent advice and use the CSP  port, you have two options.

  1. Extend EnsLib.HTTP.Service as described in the class doc.
  2. Extend %CSP.Page and call CreateBusinessService.

The class doc for EnsLib.HTTP.Service says

In order for the CSP mechanism to work, Web Services derived from this class must be configured in one of the following ways: 

  1. with their configuration name the same as their class name,
  2. or the invoking URL must include ?CfgItem= giving the config item name,
  3. or using a CSP application with a DispatchClass configured and the config item name as the next URL piece after the application name.

(Configured Services exposed using the HTTP Inbound Adapter may also be invoked with this URL parameter but because each configured Inbound Adapter listens on its own TCP/IP port this parameter is just a safety check for them.)

Actually, the best practice for Ensemble is now to  subclass %CSP.REST directly and call the Ens.Director.CreateBusinessService() method to instantiate the class as a business service.  The next revision of the Ensemble documentation will have the following note:

Although Ensemble defines a class EnsLib.REST.Service, that is a subclass of %CSP.REST, we recommend that you not use this class because it provides an incomplete implementation of %CSP.REST. The only feature that EnsLib.REST.Service provides that is not available from %CSP.REST is the ability to use a special port, but we recommend against using a special port because it does not provide the robustness and security you get by using a commercial web server and the CSP port. 

If you  just want to pass through a REST call to a REST business operation, you can use EnsLib.REST.GenericService.

The ENSDEMO Demo.ZenService.Zen.WeatherReportForm.cls demonstrates how to use CreateBusinessService  with Zen not REST, but the use of CreateBusinessService is the same.