Hi Avi,
Thank you for the good questions! Itâs a chance for us to shed some light on non-obvious things in the platform 
Multi-tenant - Is this supported by the nature of the app? or i need to develop that with custom entities and row level security?
Itâs not in the core framework, but you can use the Multitenancy add-on to make multitenancy an inherent feature of your application and avoid setting up row-level security.
Working in a modal dialog, Is the system supports modal dialogs? for many cases, edit entity from the grid or even a custom button and modal prompt for more data.
Sure, modal dialog or edit windows are supported. In fact, you can open any window as a modal dialog, see openWindow() method and its OpenType
parameter.
Database migrations, when I develop I see that the studio generate upgrade script for each small change. even if I added a field and I regret. Can the system aggregate that to one script per upgrade?
Right, Studio generates diffs each time you run âGenerate DB scriptsâ, or in background when you run the app with the changed model. Now it cannot automatically aggregate scripts, but you can do it with some manipulations.
First of all, you should have two databases: one original, which can be a copy of the production or test database, and second for development. All intermediate update scripts go to the dev database. At the moment when you want to have an aggregated update script, switch to the original database in Studio and run âGenerate DB scriptsâ command. You will see a warning saying that there are update scripts in your project that were not applied to this database. You click âContinueâ (do not apply), and Studio deletes all intermediate scripts and creates a new set of scripts which is the exact difference between your model and the original database. You can apply them, test the app and commit the scripts to VCS for further building of the product.
Search queries - will you consider the OR statement? I know it is complex when it comes to UI.
Grouping of conditions by OR is supported by the Filter component: open the full-featured âEditâ dialog via the options popup button and you will see the âAdd ORâ button.
in .NET you can query the database with strong type lambdas, is it possible with your ORM? so when you refactor something the query will automatically be changed?
No, currently you can define JPQL queries only as strings. We understand the importance of type-safe queries and itâs one of our tasks for 2019.
Custom screens and forms - Letâs say that I want extra data from the user without any relation to a specific entity. letâs say that I need an action that will ask from the user 10 fields and a custom server-side handler will handle that data. Possible?
Sure. A simple screen without any data binding:
<window xmlns="http://schemas.haulmont.com/cuba/window.xsd"
caption="msg://caption"
class="com.company.sales.web.screens.Screen"
messagesPack="com.company.sales.web.screens">
<dialogMode height="600"
width="800"/>
<layout expand="buttonsBox"
spacing="true">
<grid spacing="true">
<columns count="2"/>
<rows>
<row>
<label value="Foo"/>
<textField id="fooField"/>
</row>
<row>
<label value="Bar"/>
<lookupField id="barField"/>
</row>
</rows>
</grid>
<hbox id="buttonsBox"
spacing="true">
<button id="okBtn"
caption="OK"
invoke="onOkBtnClick"/>
<button id="cancelBtn"
caption="Cancel"/>
</hbox>
</layout>
</window>
package com.company.sales.web.screens;
import com.company.sales.service.FooBarService;
import com.haulmont.cuba.gui.components.AbstractWindow;
import com.haulmont.cuba.gui.components.LookupField;
import com.haulmont.cuba.gui.components.TextField;
import javax.inject.Inject;
import java.util.HashMap;
import java.util.Map;
public class Screen extends AbstractWindow {
@Inject
private TextField fooField;
@Inject
private LookupField barField;
@Inject
private FooBarService service;
@Override
public void ready() {
fooField.setValue("Initial Foo");
Map<String, Integer> barOptions = new HashMap<>();
barOptions.put("Bar1", 1);
barOptions.put("Bar2", 2);
barField.setOptionsMap(barOptions);
}
public void onOkBtnClick() {
service.doSomething(fooField.getValue(), barField.getValue());
}
}
Result:

What are the boundaries when it comes to coding, how can I know which file is allowed to be edit and which one isnât?
You can edit everything, Studio will parse back your code and configuration files. However, you shouldnât arbitrarily change the structure of build.gradle
and the overall structure of the project, because at some point Studio will not be able to recognize the project or some of its elements.