For programmers new to ObjectScript, one question will inevitably arise: “What is the difference between methods and class methods?” A typical answer would be: “A class method applies to a class, but a method applies to an instance of that class.” While that answer is correct, it lacks important information on how these methods differ, and how they are used in ObjectScript. Many things could be written as either. For instance, suppose we had a class called “User.Person” with a property called “Name”.
As you may know, the so-called Private Web Server that came with every IRIS installation has been eliminated, making an external web server necessary.
For Docker deployments, it's most common to use the webgateway image (available here) along with the IRIS image to seamlessly access the management portal. This image can be configured to access via HTTPS without any issues by configuring the certificates.
Problem 1: Unable to verify the first certificate
.png)
Your SSL connection through the web gateway may have a self-signed certificate configured, and Visual Studio Code is attempting to verify it.
Hello everybody !
My colleagues and I were wondering why the varstring class is hidden in the Intersystems documentation.
Is it "safe" to use ? We tried looking it up in the forum and it seems like it is used by other developpers. Is there anything we should know before using it ?
Thanks!
Alan
Is there a way in ObjectScript to return the OS user of the superserver? I know %SYS.ProcessQuery can find this for a given process but is there a clean way independent of a specific process ID I can find the OS user used for background jobs?
For IRIS this is usually irisusr and Caché this is usually cacheusr but may vary based on installation and upgrade history of an instance. I would find it very useful to determine programmatically if a process is running as this particular user when the username may vary.
The task is to find all globals that are referenced in certain routines. I could search for ^ using class(%Studio.Project).FindInFiles but that would also find ^ in comments and function calls. I can distinguish between a global and a function call visually, but it would be lovely to be able to skip function calls programmatically. Is it possible?
The Find and Replace screen in Studio has a capability of searching for ^ with Match Element Type set to Global Variable. Maybe I could use that but what is the ObjectScript function behind this screen if any?
Hey Community,
It's time for the new batch of #KeyQuestions from the previous month.

Hi Community!
We are excited to announce the first French technical article writing contest!
✍️ Technical Article Contest ✍️
This is the perfect opportunity for all InterSystems technology enthusiasts to share their knowledge and showcase their writing skills. No matter your experience level, everyone is welcome to participate. Articles can cover a wide range of technical topics related to InterSystems products or services. So, let your creativity and expertise run wild!
📅 Contest period: September 2-29, 2024
🎁 Gifts for all: a special gift is prepared for each participant!
🏅 Prizes for the authors of the best articles
%20(2).jpg)
Hi experts,
Please, do you know steps to analyse and correct this alarm?
This message was registered in messages.log
03/16/25-13:46:42:066 (21596) 2 [Utility.Event] ISCLOG: WebSocket [SendAsyncMessage] Error with OpenServer ns=ACB rtn=%CSP.WebSocket.1 data="0 "_$lb($lb(7953,"AKGmfwJ2q/lh6h0K/BKvQw==",,,,,,,,$lb(,"ACB",$lb("e^OpenServer+3^%CSP.WebSocket.1^2","e^SendAsyncMessage+13^%CSP.WebSocket.1^1","e^Page+4^%CSP.WebSocket.1^2","e^CSPDispatch+503^%SYS.cspServer^2","d^CSPDispatch+280^%SYS.cspServer^1","d^ProcessRequest+1^%CSP.Session.1^1","d^Request+685^%SYS.cspServer2^1","d^Request+25^%SYS.
I redeemed a reward from global master's community but I am unable to track or got an update.
I require assistance with that.
InterSystems has been at the forefront of database technology since its inception, pioneering innovations that consistently outperform competitors like Oracle, IBM, and Microsoft. By focusing on an efficient kernel design and embracing a no-compromise approach to data performance, InterSystems has carved out a niche in mission-critical applications, ensuring reliability, speed, and scalability.
Introduction
A REST API (Representational State Transfer) is an interface that allows different applications to communicate with each other through the HTTP protocol, using standard operations such as GET, POST, PUT, and DELETE. REST APIs are widely used in software development to expose services accessible by other applications, enabling integration between different systems.
However, to ensure that APIs are easy to understand and use, good documentation is essential. This is where OpenAPI comes in.
OpenAPI is a standard for describing RESTful APIs.
Among the numerous authors of the InterSystems Developer Community, some members stand out for their dedication and lasting impact. One such member is @Mihoko Iijima, whose journey with InterSystems spans over two decades. From her early experiences with Caché to her deep involvement in the Developer Community, she has continuously contributed to knowledge-sharing and collaboration, shaping the experience for fellow developers.
🤩 Let's take a closer look at Mihoko's journey with InterSystems technology and our Developer Community...
(1).jpg)
Hi Community,
Enjoy the new video on InterSystems Developers YouTube:
After so many years of waiting, we finally got an official driver available on Pypi
.png)
Additionally, found JDBC driver finally available on Maven already for 3 months, and .Net driver on Nuget more than a month.
As an author of so many implementations of IRIS support for various Python libraries, I wanted to check it. Implementation of DB-API means that it should be replaceable and at least functions defined in the standard. The only difference should be in SQL.
And the beauty of using already existing libraries, that they already implemented other databases by using DB-API standard, and these libraries already expect how driver should work.
I decided to test InterSystems official driver by implementing its support in SQLAlchemy-iris library.
Recently, the question came up while discussing the access to the data stored in IRIS from different languages with my students if it was possible to initiate the connection and get data from Cloud solution (InterSystems IRIS CloudSQL) from Microsoft Excel, not the other way around. Considering the many varied ways one can get data in Excel (import data from external sources, connecting to databases using ODBC drivers, using power queries and web queries etc.) the obvious choice was to try ODBC driver. The only task left was to try to connect to the database in the cloud using the ODBC driver.
.png)
Hi, Community!
🔎Find out how you can simplify your document storage and queries with InterSystems IRIS® Cloud Document!
Visual Studio Code releases new updates every month with new features and bug fixes, and the February 2025 release is now available.
There have been enhancements to GitHub Copilot with predictive editing, autonomous task completion, smarter code search, improved terminal and notebook support, and UI and workflow refinements.
If you need help migrating from InterSystems Studio to VS Code, or want to advance your knowledge of VS Code, take a look at the training courses George James Software offers > georgejames.com/vscode-training/
Highlights from version 1.
My query that I am running on my Custom SQL Inbound Service has columns that are larger than the typical string length. How do I enlarge the SQL Snapshot Column limitations
ClassExtends%PersistentAsAsHi guys,
I am looking for a way to search for FHIR Encounter resources from an InterSystems FHIR server where there period.start is before or after a certain time. I can´t get my head around which would be a correct way to do this since docs and FHIR spec is not clear to me which fields can be used for searching with wich prefixes.
In my local InterSystems FHIR server I have a set of Encounter ressources, each set with a period.start and (possibly) a period.end. I´d like to retrieve all Encounters with a start date time prior to a given datetime. I did a little testing with URL parameters.
I want to append items to the list inside a for loop
Example:
set$ListBuildforThe output should be:
mylist = The code snippet written above is not working, looking for correct way to do it.
Is there a way to delete suspended messages rather than using the WebMgmt gui?
We have over three million in one namespace, and using the gui I can only do 2000 at a time.
I was thinking of using delete in sql like Ens.MessageHeader where Status = 'Suspended'
But I don't know if that is a clean way to do it.
Hey Community,
Enjoy the new video on InterSystems Developers YouTube:
Hey Community,
We're excited to invite you to the next InterSystems UKI Tech Talk webinar:
Join this webinar to dive into the world of HealthShare Health Connect Cloud with our upcoming session on Cloud Health: FHIR Server.
⏱ Date & Time: Thursday, March 20, 2025 2:30 PM GMT
👨🏫 Speaker: @Regilo Regilio Guedes de Souza, Director of Cloud Delivery, InterSystems
Hi Community,
There is a new PDF Resource published on our official site depicting key features and a comparison of InterSystems healthcare interoperability products: Health Connect and .
>> https://www.intersystems.com/health-data-integration-chart.pdf
I think this could be useful for the Community.
Hello,
i am building a new container with Docker-Compose with a --volume ./:/irisdev/app:rw to mount a host volume (UBUNTU).
If i try to create some data in /irisdev/app i have no write permission
If i open a bash host session i see all mounted files of my ./ directory. But with ls -l only UID 100 has write permission. The UID for "iris owner" is 52773.
Is there a way to set the UID and Group to "iris owner" ?
regards Matthias
Hi Community!
Because our previous sweepstakes was such a blast, we've decided to do a repeat performance 😉 And this time, the topic of our sweepstakes is
🔎 DC search 🔍
We think you might have a few suggestions on how we can improve our search engine, and we would absolutely love to hear from you!
(1).jpg)
Hello everyone,
I'm looking for a practical project guide to help me gain hands-on experience with InterSystems Ensemble HL7. Ideally, this guide would walk through building a small project — something that covers key concepts like message routing, transformations, and interoperability.
If there's a resource that also includes step-by-step instructions and perhaps even offers a certification upon completion, that would be perfect.
Any recommendations or guidance would be greatly appreciated. Thanks in advance! 😊
Looking for a SQL query or any other method to find the Unique/distinct message counts for all productions or at least per production namespace within a given time frame. For e.g TimeCreated = January 2025 (Whole month)
I have used the following, but its not restricting the numbers based on the TimeCreated filter. Every time a new message is processed by system, its added to the total. I am running the query in today's date
Select Sum(MsgCount)
From
(Select DISTINCT TargetConfigName, count(DISTINCT SessionID) as MsgCount
FROM ENS.
Hi colleagues!
Often, while developing a frontend app or any other communication vs REST API, it is worth having a Swagger UI - a test UI for the REST API that follows Open API 2.0 spec. Usually, it is quite a handful as it lets have quick manual tests vs REST API and its responses and the data inside.
Recently I've introduced the Swagger support to the InterSystems IRIS FHIR template for FHIR R4 API:

How to get it working.
Intro
In the process of trying to get more familiar with Objectscript I decided to try to build a general priority queue since I wasn't able to find an implementation anywhere. My though process for implementing this followed this general path.
Binary Heap
My first though to try to make this work quickly was to implement a and my first attempt at this used a multidimensional to build it. This version was relatively efficient, worked for strings/numbers natively, and worked for objects be letting the user override the comparitor.
Class pqueue.Queue Extends %RegisteredObject
{
Property Data As %Any [ MultiDimensional ];
Property Size As %Integer [ InitialExpression = 0 ];
Property Comparitor As %String [ InitialExpression = "(a,b) return a < b" ];
Method Swap(i As %Integer, j As %Integer) As %Status [ Private ]
{
set temp = ..Data(i)
set ..Data(i) = ..Data(j)
set ..Data(j) = temp
}
Method Comp(x As %Any, y As %Any) As %Boolean [ Private ]
{
return $XECUTE(..Comparitor, x, y)
}
Method PercolateUp(idx As %Integer) [ Private ]
{
while idx > 0 {
set newidx = (idx-1)\2
if ..Comp( ..Data(idx), ..Data(newidx) ) do ..Swap( idx, newidx )
else Quit
set idx = newidx
}
}
Method PercolateDown() [ Private ]
{
set idx = 0
while ((idx+1)*2) < ..Size {
if ..Comp( ..Data(idx*2+2), ..Data(idx*2+1) ) set newidx = idx*2+2
else set newidx = idx*2+1
if ..Comp( ..Data(idx), ..Data(newidx) ) Quit
do ..Swap( idx, newidx )
set idx = newidx
}
if ( (idx*2+1 < ..Size) && ..Comp( ..Data(idx*2+1), ..Data(idx) ) ) do ..Swap( idx, idx*2+1 )
}
Method IsEmpty() As %Boolean
{
return ..Size = 0
}
Method Top() As %Any
{
if ..IsEmpty() return ""
return ..Data(0)
}
Method Put(inp As %Any) As %Status
{
set sts = $$$OK
set ..Data( ..Size ) = inp
do ..PercolateUp( ..Size )
set ..Size = ..Size + 1
return sts
}
Method Get(Output obj As %Any) As %Status
{
set sts = $$$OK
if ..IsEmpty() {
set obj = ""
return $$$ERROR( "Cannot Get() from empty Queue" )
}
set obj = ..Data( 0 )
set ..Size = ..Size - 1
set ..Data( 0 ) = ..Data( ..Size )
do ..PercolateDown()
kill ..Data( ..Size )
return sts
}
Method GenerateComparitor(operator As %String = "<", transform As %String = "") As %Status
{
set ..Comparitor = "(a,b) return a" _ transform _ " " _ operator _ " b" _ transform
return $$$OK
}
}
After getting this working I wanted to try out different internal arrays since I assumed multidimensional arrays must be slower than a simple integer indexed array. So I modified the above code to use
* `Property Data As list Of %Any;` : This works OK but it is about 3-4 times slower than using a multidimensional making it pointless.
* `Property Data As %DynamicArray;` : I assumed this would be relatively fast but proved to be slow to the point of absurdity. When the amount of data stored in the queue is small it is around as fast as the `list of %Any`, but as the data grows the time it takes to make inserts and gets grows linearly which makes it pointless to build a heap on top of.
## Using the Multidimensional Array's Self-sorting
On its face this idea seems pretty simple, use the fact that the multidimensional array is always sorted to grab the lowest cost (highest priority) item. A problem with this are that indexing by an object simply uses the string representation of that object which isn't useful. To handle this a customer `evaluator` function is needed to return the integer or string evaluation of an object which is then sorted, it is then stored as `data( evaluation, obj_str_rep ) = object` which ensures that objects are correctly sorted even when two objects evaluate to the same value.
Class pqueue.SparseQueue Extends %RegisteredObject
{
// Parameter Comp(a,b) As $XECUTE(..Comparitor, a, b);
Property Data As %Any [ MultiDimensional ];
Property Size As %Integer [ InitialExpression = 0 ];
Property Evaluator As %String [ InitialExpression = "(a) return a" ];
Method IsEmpty() As %Boolean
{
return ..Size = 0
}
Method Top() As %Any
{
if ..IsEmpty() return ""
return $Order( ..Data("") )
}
Method Put(inp As %Any) As %Status
{
set sts = $$$OK
set ..Data( $XECUTE(..Evaluator, inp), inp ) = inp
set ..Size = ..Size + 1
return sts
}
Method Get(Output obj As %Any) As %Status
{
set sts = $$$OK
if ..IsEmpty() {
set obj = ""
return $$$ERROR( "Cannot Get() from empty Queue" )
}
set loc = $ORDER( ..Data("") )
set obj = ..Data(loc, $ORDER( ..Data(loc, "")))
set ..Size = ..Size - 1
kill ..Data( loc, obj )
return sts
}
Method GenerateEvaluator(transform As %String = "") As %Status
{
set ..Evaluator = "(a) return a" _ transform
return $$$OK
}
}
This method proved to be by far the fastest. It has some slight disadvantages in that it can be harder to write an evaluator than a comparitor and, in the form given above, it cannot hold the same object at the same value twice (this is a rare case but could theoretically be a problem or a benefit).
## Speed Test
To test these out I wrote a simple script that generates a large randomized weighted directed graph and runs [Dijkstra's shortest path algorithm](https://www.geeksforgeeks.org/dijkstras-shortest-path-algorithm-greedy-algo-7/) using a given queue object. Using a graph with `150000` vertices where each has `10` neighbors, the output is printed below. Here while the algorithm is running an update is printed every `10000` edges checked, where the time since the last 10 thousand and size of the priority queue is printed, with some final stats at the end. The order they are run in is
* Self-sorting Multidimensional
* Heap Multidimensional
* Heap Dynamic Array
* Heap List of Object
> Generated Random Graph


