List of critical changes from version 3.11.0 to 3.11.32 (inclusive)


List of changes in version 3.11.32

The possibility was added to use Enumeration type parameters with the single link type as sql parameters:

select * from TaskBase
where TaskBase.Priority=@OneEnum

The possibility was added to use Enumeration type parameters with the List link type as sql parameters:

select * from TaskBase
where TaskBase.Priority in (@ManyEnum)

When updating, make sure you don't use Enumeration type parameters with the List link type in reports. If you do, change the link type to single and publish the report.

Otherwise, for example, the query from the article https://kb.elma-bpm.com/article-3588.html won't work. The {$TaskPriority}=’High’} condition will always return false, since {$TaskPriority} will return a string representation of its type (if the TaskPriority parameter is an enumeration with the List link type).

Public methods and interfaces

The public overload was added for the method EleWise.ELMA.Model.Types.EnumDescriptor.GetPropertyInitExpression(ClassMetadata classMetadata, bool forList, PropertyMetadata propertyMetadata, bool forFilter = false), which gets the property initialization expression in accordance with the default value.

List of changes in version 3.11.31

Scheduler task result lifecycle setting was added. If a scheduler task result is not updated for more than the specified timeout, it will be considered overdue. After the timeout, the scheduler task is considered outdated and does not lock attempts to run new tasks. By default, the timeout value is 720 minutes. Example of the setting in the settings.config file: <add key="SchedulerJobRunInfo.Timeout" value="720" />.


An overload was added for the method EleWise.ELMA.CRM.Managers.LeadManager.SetStatus(ILead lead, LeadStatus leadStatus, string comment); it allows changing the status and adding a comment to a lead.

List of changes in version 3.11.30

Time Report

The IOvertimeWorkLogExtension interface is marked as Obsolete. The new interface IOvertimeWorkLogExtension2.cs was added instead of IOvertimeWorkLogExtension. Earlier implemented points should be rewritten, although the current implementation still work.

A button for reopening time reports was added to the time report page toolbar. A popup for reopening time report with the possibility to change the approver was added.

Document Management

A new interface ICryptoProvider2 was addedinherited from the ICryptoProvider interface.

A new method string GetFileHash(BinaryFile file, string algorithm) was added to the interface; it allows calculating hash by the specified algorithm.

If you don't need this feature, there is no need to implement it. The current implementation works.

Web Portal

When starting a process for an object (CRM object, document, an object from the objects section, performance matrix), after choosing a process, the process start event form is now loaded.


The IProjectTaskProperties interface is marked as not used.

List of changes in version 3.11.29

To avoid granting superuser permissions when connecting ELMA in PostgreSQL, it is now possible to specify a user with SuperUser permissions in the configuration file, on whose behalf the database will be created/deleted when starting the system.

Configuration file example:

<main.db connectionStringName="MainDB" type="EleWise.ELMA.Extensions.PostgreSQL.PostgreSQLProvider, EleWise.ELMA.Extensions.PostgreSQL, Version=, Culture=neutral, PublicKeyToken=null" backupEnabled="false" sysUser="postgres" sysPassword="MASTERKEY" />
<add name="MainDB" connectionString="Host=;Port=5432;Database=elma3;User Id=user;Password=qwerty;Unicode=true;" />

In this example, the connection string specifies the user account with minimum permissions, while the main.db specifies the postgres superuser.

List of changes in version 3.11.28

Public Methods

Added the possibility to get values by the filter for the registration offices in the controlled:

  • optional parameters were added to the method EleWise.ELMA.Documents.Docflow.Web.Controllers.RegistrationPlaceController.GetRegistrationPlace(long? accountingYear, string text = null, string filterProviderUid = null, string filterProviderData = null), which returns registration offices by year and filter;
  • optional parameters were added to the method EleWise.ELMA.Documents.Docflow.Web.Controllers.RegistrationPlaceController.PopupEntity(string inputId, [JsonBinder]ICollection<SelectListItem> selected, bool multiselect, long? accountingYear, string filterProviderUid = null, string filterProviderData = null), which returns a popup for selecting entity values.

List of changes in version 3.11.27


The update to 3.11.27 may take a while, because full database conversion is performed.


Lock manager optimization:

1. Database locks were changed (used by default in a cluster, if distributed cache is configured).

A lock used to be added to a corresponding entry of the DbLock table via FOR UPDATE. The lock was on the table entry throughout the critical section time, which negatively affected statistics, because locks were on the DbLock table a significant amount of time.

Now a lock is added by inserting an entry to DbLock. The lock is removed by deleting the entry. If there is an entry, it means that the lock is held by someone. Locks will appear in the DbLock table only if concurrent transactions attempt to insert/delete the same entries in the DbLock table at the same time.

2. Locks were implemented in Redis. This lock service must be enabled explicitly (configuration.config)



The lock logic is the same as in the database: if there is a key in Redis, lock is held by someone, no key - no lock. To work with Redis, you need at least three independent nodes (just three server instances, not a cluster or a sentinel) for failover safety. A lock is applied if it is added in at least half of the nodes. Redis lock provider is configured in configuration.config, by specifying connections with nodes (in the format, used for configuring Redis cache). The redlock algorithm is used, recommended by the official documentation.

3. Memory locks were implemented. This service applies locks only in the memory. It is enabled by default, if distributed cache is not configured, i.e. one ELMA node is used.

LockManager was reworked:

1. It is inherited from the ILockManager interface, therefore it is recommended to inject ILockManager in modules instead of using LockManager

2. The following LockManager's methods were marked as Obsolete: TryObtainLock, ObtainLock and ReleaseLock. Instead, use ILockManager interface methods Lock, TryLock, which return an IDisposable lock.

Web Portal

ZeroClipboard module was updated. Flash content was deleted from the system. The functionality was substituted with js scripts.

Process monitor

XSS vulnerability in the Process Monitor section was eliminated. The possibility to sort by the Context and Values columns was disabled in the Process Monitor section.


  • When archiving the messages, favorite messages are ignored;
  • Earlier archived messages are automatically moved to messages at the first system start after updating.

List of changes in version 3.11.26

Possibility to specify different translations for one source key

To specify several translations for one source key, use the following template:

Msgstr "[[Location11,Location12,Location13]]Translation1[[Location21,Location22,Location23]]Translation2"

Where Location - is the location where the resource is used. You can find the location from the comments:

1. 25cab08fff420add/Applications/BPM/EleWise.ELMA.BPM.Web/Modules/EleWise.ELMA.CRM.Web/Views/Lead/SelectTypes.cshtml:15 Lead_SelectTypes (For .cshtml files - from the Views folder down, replacing "/" with "_")

2. 25cab08fff420add/Applications/BPM/EleWise.ELMA.BPM.Web/Modules/EleWise.ELMA.Workflow.Processes.Web/Views/WorkflowInstance/ChangeTimer.cshtml:15 WorkflowInstance_ChangeTimer

3. 25cab08fff420add/SDK/EleWise.ELMA.SDK.Design/BPMApps/Views/BPMAppsRibbonPanelView.Designer.cs:118 Designer (For .cs - the file name)

Process monitor

Exporting the current process tasks column to Excel is now supported.

List of changes in version 3.11.25

No critical changes.

List of changes in version 3.11.24

Object attribute validation when publishing was added. If an attribute is invalid, publication is interrupted with an error notification.

Public methods and interfaces

  1. EleWise.ELMA.Model.Types.IValidatableTypeDescriptor, allows validating a type
  2. EleWise.ELMA.Model.Types.RefTypeDescriptor<T, SettingsT>.
  3. EleWise.ELMA.Model.Metadata.EntityPropertyMetadata.

List of changes in version 3.11.23

General Improvements

The list of registration variants in the Records Management section was replaced with a drop-down list.

List of changes in version 3.11.22

User interface

If the task start date is earlier than the current date, a notification is shown, informing that a task cannot be rescheduled to an earlier date. If you need to change the task end date, the start date must remain unchanged.

Form builder

The On the read only form parameter was added to the button element. This parameter defines the possibility to display the created button on a Read-only form and after completing a process task.

This parameter includes three options:

  • Active – the button will appear on the form and the user will be able to click the button to complete an action;
  • Inactive – the button will be displayed on the form, but will remain inactive meaning that the user will not be able to use it;
  • Hidden – the button will be hidden and unavailable to the user.

List of changes in version 3.11.21

No changes.

List of changes in version 3.11.20

Code API. Public methods and interfaces

1. Method bool EleWise.ELMA.Documents.Web.FullTextSearch.Extensions.HasUserFields (IDocumentFilter filter) is marked as obsolete, instead use the method void EleWise.ELMA.Documents.Web.FullTextSearch.Extensions.HasUserFields(IDocumentFilter filter, CheckFullTextSearchModel checkResult).

User interface

A notification is added to the document search page, which is displayed when indexation is enabled. If the search conditions do not allow the system to use the full-text search (hierarchical search, advanced search, less than 3 characters in the search string) then you will see a notification, that the full-text search was not used and a list of reasons why.

List of changes in version 3.11.17

Changes in the Scheduler

If a task start date is a business day, and the number of specified business days is greater than it is, then the last business day will be the result.

Under business days, the counting number of the business day in a month is implied!

Time zones

ELMA Designer now features the Ignore time zones setting for properties of the Date/Time type. It allows storing and viewing this property without a time zone shift. For example, if the specified value is 01.01.2018 01:00:00 and the time zone is UTC +3, and the user who views it is in the UTC +1 time zone, the value will remain the same. However, if the Time box is not checked in a Date/Time property settings, it also will not be shifted in time zone.

Public methods

The following methods were added:

  • EleWise.ELMA.Model.Metadata.EntityMetadata.GetAllTableParts(), which returns the list of all the blocks, pertaining to metadata (including all the nested blocks);
  • EleWise.ELMA.Model.Metadata.EntityMetadata.GetAllProperties(), which returns the list of all the properties, pertaining to metadata (including properties of all the nested blocks);
  • EleWise.ELMA.Model.Metadata.EntityMetadata.GetAllPropertiesAndTableParts(), which returns the list of all the properties and blocks, pertaining to metadata (including properties and blocks of all the nested blocks).

Changes in the Reports module

To update system reports, you do not need to additionally edit the file ReportsDbStructure.xml.

List of changes in version 3.11.16

Changes in the Reports module

Recycle Bin group was added to the list of reports in the Designer, to which deleted reports and sub-reports are placed. To restore a report, right click on it and select Restore. If this operation is successful, the report will appear in the Common Reports group.

List of changes in version 3.11.15


When creating a new KPI script, the assembly EleWise.ELMA.KPI and namespaces EleWise.ELMA.Model.CommonEleWise.ELMA.KPI.ExtensionsEleWise.ELMA.KPI.SecurityEleWise.ELMA.KPI.Managers are added by default.

Changes in the Reports module

  1. All the report parameters are passed in a POST-request.
  2. The EleWise.ELMA.Reports.Managers.ReportCacheManager class, intended for storing report parameters and settings in the cache is deleted.
  3. The system report "Report on schedule compliance (3.1)" is updated.

Changes in working with report parameters

Changing report parameters on the Razor report layout is forbidden. For this, use the custom controller code.

Classes and views of the Reports module moved

  1. Class EleWise.ELMA.Reports.Web.ReportPagerSettings was moved to EleWise.ELMA.BPM.Web.Reports.Components.ReportPagerSettings
  2. Class EleWise.ELMA.Reports.Web.ReportPagerSettingsBinder was moved to EleWise.ELMA.BPM.Web.Reports.Components.ReportPagerSettingsBinder
  3. Class EleWise.ELMA.Reports.Code.ReportParametersBinder was moved to EleWise.ELMA.BPM.Web.Reports.Components.ReportParametersBinder
  4. View \Modules\EleWise.ELMA.BPM.Web.Reports\Page\Report.aspx was moved to \Modules\EleWise.ELMA.BPM.Web.Reports\FastReportPage\Report.aspx
  5. Class EleWise.ELMA.Reports.Web.Report was moved to EleWise.ELMA.BPM.Web.Reports.FastReportPage.Report.

Public methods

  1. Constructor with parameter EleWise.ELMA.Reports.Models.CustomPagerParameters.CustomPagerParameters(bool isActive) is marked as obsolete (use the constructor without parameters). 
  2. The following methods are now virtual:
  • Telerik.Web.Mvc.UI.Html.GridPagerNumericSectionBuilderCustom.Create 
  • Telerik.Web.Mvc.UI.Html.GridPagerPagingSectionsBuilder.CreateSections
  • Telerik.Web.Mvc.UI.Html.GridPagerPagingSectionsBuilder.AppendNumericSection


A new global permission Project Administration was added, which grants access to configuring project types in the administration section. By default, this permission is assigned to the users of the system groups Administrators and Project Administration.

New function

A function for extending the standard jQuery- settimeout capabilities was added.

The function is elmaTimeout.waitUntilValidatorReady, which is a timeout for the form validator generation.


List of changes in version 3.11.14

Code API. Public methods and interfaces

Full-text search

Properties with the One-to-Many link type are no longer supported by the full-text search. If there is a property with the One-to-Many link type in the filter or in the information shown on the page, the data to display are loaded from the ELMA database.

Possibility to disable CSRF protection

Possibility to partially disable the CSRF protection for a controller or a method was added. To do so, you need to specify an attribute on the respective controller or method as follows:


As the result, protection from CSRF attacks will be disabled for the methods and controllers with this attribute.

List of changes in version 3.11.13

User interface

1. Errors are now displayed when saving on a form object-properties that implement EntityCollection:

2. The setting Number of Displayed Messages was removed from the public channel messages portlet. The Number of Displayed Comments setting is taken from the portlet settings:


List of changes in version 3.11.12

Document creation

When creating a document (object, process) with an Attachment required field, the file upload field in the web interface will be highlighted with the standard bold font and a red asterisk.


Document approval

It is now possible to remove the Comment field for document approval, acquaintance and signing. The Require a comment setting is now nested.


List of changes in version 3.11.11

Connection via a proxy server

The issue with connecting the Designer via a proxy was fixed: now it is possible to switch the 100-Continue behavior when passing titles to the server:

If you use the default settings, leave the box unchecked; the connection will be successfully established.


List of changes in version 3.11.10

No critical changes.

List of changes in version 3.11.9

Public API

In EleWise.ELMA.SDK\Model\Managers\LockManager.cs the DataBaseLocker class was added to simplify database locking, as well as methods Lock(string lockKey) and Lock(string lockName, int timeout) for its implementation.


If there are redefined views in the configuration, you should check them for forms. Instead of using the standard helper Html.BeginForm use Html.ELMAForm to avoid the following error:

Error 1 - Token is missing in form POST request



If a form is created without using the helper, add a token to input manually:



Error 2 – The form contains multiple tokens

The anti-forgery token could not be decrypted. If this application is hosted by a Web Farm or cluster, ensure that all machines are running the same version of ASP.NET Web Pages and that the <machineKey> configuration specifies explicit encryption and validation keys. AutoGenerate cannot be used in a cluster.


Delete all the tokens named "__RequestVerificationToken" from the form (not from the entire page!) and add a new one.





Possibility to edit metadata of a basic extendable system object was added. At the moment, the autofill script field is editable (in case it was filled in earlier). This applies only to extendable system objects, not to the objects, created in Designer.

Periodic event template changed

A tab with the list of all the instances of the event was added (fig. 1).

Fig. 1. List of instances

The toolbar was changed (fig. 2-3).

Fig. 2. Regular event toolbar

Fig. 3. Periodic event toolbar

Business processes

Possibility to change the process version in an active instance when there are changes in swimlanes was added (restriction on editing swimlanes in the process diagram was removed). The transition confirmation page interface was changed.

How it was:

  1. You had to specify the reason for changing the version in a popup window after clicking Change Version button.
  2. No other elements were displayed after the Compare Versions panel.

How it is now:

  1. The reason is specified right on the page with the version change information.
  2. Under the text field "Reason for changing version" a collapsible panel "Changes in swimlanes" was added. The panel contains a table on the changes detected in swimlanes. Changes in swimlane types are displayed. If types do not change, the changes of specific swimlane parameters are shown.

The first column shows the swimlane status:

  1. New - the swimlane was added in the new process version. The previous version did not include it.
  2. Changed - some parameters of the swimlane were changed in the new version.
  3. Deleted swimlanes are not displayed.
  4. If a changed swimlane contains the active element, the "The active element is in the swimlane" message will be shown.

The second column shows the parameters of the changed swimlanes in the previous process version. If the swimlane only appears in the new version, a message will be shown: "The swimlane is absent in the previous version. It was added in the new version".

The third column specifies the parameters of the changed swimlanes in the new process version.

The fourth column allows selecting an action that will be applied to the swimlane executor. This action will be performed after the user confirmes the version change. These are the available actions:

  1. "Keep on the current executor". The same executor will remain in the swimlane after changing the version. This action is not available if the swimlane is bound with an executor regardless of whether the swimlane contains the active element. The current executor will be specified below the description.
  2. "Specify an executor manually". The specified executor will be assigned in the swimlane. This action is available if the swimlane is bound with an executor, does not contains the active element and its type in the new version is not Business Role. You can select any user. The selection field is required.
  3. "Assign according to the swimlane". The executor will be assigned according to the rules of the swimlane in the new process version. This action is not available if the swimlane is not bound with an executor and it does not contains the active element.
  4. "Do not change active tasks". The task will remain assigned to the same executors, and the first user to complete it will become the swimlane executor. This action is available if the swimlane is not bound with an executor and it contains the active element. This action may cause the actual executor to not match the ones specified in the swimlane settings. This is the standard functioning of the mechanism.

List of changes in version 3.11.8

Public API

KPI section:
PublicAPI.KPI.Objects.Models.KpiWorkflowTask.Filter() - filter changed:
HideOldPlanTasks(Boolean hideOldPlanTasks) - Added
PublicAPI.KPI.Objects.Performance.ApprovalTaskPerformance.Filter() - filter changed:
HideOldPlanTasks(Boolean hideOldPlanTasks) - Added
PublicAPI.KPI.Objects.SMART.SMARTTask.Filter() - filter changed:
HideOldPlanTasks(Boolean hideOldPlanTasks) - Added
PublicAPI.KPI.Objects.KpiTask.Filter() - filter changed:
HideOldPlanTasks(Boolean hideOldPlanTasks) - Added
Docflow section:
PublicAPI.Docflow.Objects.BPMN.AssignDocumentTask.Filter() - filter changed:
HideOldPlanTasks(Boolean hideOldPlanTasks) - Added
PublicAPI.Docflow.Objects.BPMN.CreateDocumentTask.Filter() - filter changed:
HideOldPlanTasks(Boolean hideOldPlanTasks) - Added
PublicAPI.Docflow.Objects.BPMN.RegistrationDocumentTask.Filter() - filter changed:
HideOldPlanTasks(Boolean hideOldPlanTasks) - Added
PublicAPI.Docflow.Objects.BPMN.SendToAcquaintanceTask.Filter() - filter changed:
HideOldPlanTasks(Boolean hideOldPlanTasks) - Added
PublicAPI.Docflow.Objects.BPMN.SendToApprovementTask.Filter() - filter changed:
HideOldPlanTasks(Boolean hideOldPlanTasks) - Added
PublicAPI.Docflow.Objects.Tasks.DocumentAcquaintanceTask.Filter() - filter changed:
HideOldPlanTasks(Boolean hideOldPlanTasks) - Added
PublicAPI.Docflow.Objects.Tasks.DocumentApprovementTask.Filter() - filter changed:
HideOldPlanTasks(Boolean hideOldPlanTasks) - Added
PublicAPI.Docflow.Objects.Tasks.ResolutionTask.Filter() - filter changed:
HideOldPlanTasks(Boolean hideOldPlanTasks) - Added
PublicAPI.Docflow.Objects.Tasks.RouteApprovementTask.Filter() - filter changed:
HideOldPlanTasks(Boolean hideOldPlanTasks) - Added
PublicAPI.Docflow.Tasks.Filter() - filter changed:
HideOldPlanTasks(Boolean hideOldPlanTasks) - Added
Processes section:
PublicAPI.Processes.WorkflowTaskBase.Filter() - filter changed:
HideOldPlanTasks(Boolean hideOldPlanTasks) - Added
Portal section:
PublicAPI.Portal.Objects.Tasks.Question.Filter() - filter changed:
HideOldPlanTasks(Boolean hideOldPlanTasks) - Added
PublicAPI.Portal.Objects.Tasks.ReplacementTask.Filter() - filter changed:
HideOldPlanTasks(Boolean hideOldPlanTasks) - Added
Projects section:
PublicAPI.Projects.ProjectTaskBase.Filter() - filter changed:
HideOldPlanTasks(Boolean hideOldPlanTasks) - Added
PublicAPI.Projects.ProjectTaskBase.Milestone.Filter() - filter changed:
HideOldPlanTasks(Boolean hideOldPlanTasks) - Added
PublicAPI.Projects.ProjectTaskBase.WorkflowProjectTask.Filter() - filter changed:
HideOldPlanTasks(Boolean hideOldPlanTasks) - Added
PublicAPI.Projects.Objects.Budgets.ProjectBudgetApprovalTask.Filter() - filter changed:
HideOldPlanTasks(Boolean hideOldPlanTasks) - Added
PublicAPI.Projects.Objects.Prediction.ProjectPredictionApprovalTask.Filter() - filter changed:
HideOldPlanTasks(Boolean hideOldPlanTasks) - Added
PublicAPI.Projects.Objects.Prediction.ProjectPredictionDatesTask.Filter() - filter changed:
HideOldPlanTasks(Boolean hideOldPlanTasks) - Added
PublicAPI.Projects.Objects.Prediction.ProjectPredictionWorkLogTask.Filter() - filter changed:
HideOldPlanTasks(Boolean hideOldPlanTasks) - Added
PublicAPI.Projects.Objects.ProjectComplexTask.Filter() - filter changed:
HideOldPlanTasks(Boolean hideOldPlanTasks) - Added
PublicAPI.Projects.Objects.ProjectPlanApprovalTask.Filter() - filter changed:
HideOldPlanTasks(Boolean hideOldPlanTasks) - Added
PublicAPI.Projects.Objects.ProjectDatesApprovalTask.Filter() - filter changed:
HideOldPlanTasks(Boolean hideOldPlanTasks) - Added
Services section:
Added methods:

Boolean PublicAPI.Services.SecurityServices.CanCheckPermission(Permission permission, Type type)


List of changes in version 3.11.7

Public API

A method for calculating permissions to edit a document is added PublicAPI/REST/EleWise.ELMA.Documents/Document/{DOCUMENTID}/CanEditDocument

Possibility to display a list of objects as a list of forms added

For this, you need to define a display form for the object type in the list. Move the list property value to the form and define custom markup, in which you need to call the Html.EntityCollection method and specify the form ID for the object type in the list.



Note: the “Delete” action deletes the property from the database; the “Edit” action opens the standard editing form for this object in a pop-up window.

Restriction for selecting KPIs

A restriction for selecting KPIs in the data collection task added. If a user added a KPI, then its periodicity must be displayed under Period. When adding further KPIs, a periodicity restriction is imposed, i.e. you can select only those KPIs that have the same periodicity as the earlier selected KPI.



The error when generating markup of blocks with at least one hidden field was fixed.

How it was:

Blocks were not displayed on forms. "Failed to generate user markup" notification was displayed instead of a block.


The error log contains the following entry:

ERROR 2017-09-06 08:55:22,486 [39] EleWise.ELMA.Logging.Logger - Error in the EleWise.ELMA.Web.Mvc.Controllers.TablePartController System.NullReferenceException controller method: A reference to an object does not indicate an object instance. in EleWise.ELMA.Web.Mvc.Controllers.TablePartController.IsRequiredProperty(PropertyInfo propInfo) in System.Linq.Enumerable.WhereEnumerableIterator`1.MoveNext() in EleWise.ELMA.Web.Mvc.Controllers.TablePartController.GetGridResult(TablePartData data, Boolean isAnyChange, String prefix) in EleWise.ELMA.Web.Mvc.Controllers.TablePartController.Grid(GridCommand command, TablePartRequestData data) in lambda_method(Closure , ControllerBase , Object[] )

How it is now:

Block are displayed on the page, even if they contain hidden fields.


The error when all the changes made via quick editing a recently added but not saved to the database block item were lost, was fixed.

How it was:

When calling dynamic form controller methods, the changes made via quick editing got lost.

How it is now:

The changes made via quick editing fields are processed correctly and passed to the dynamic form controller methods.

Workflow Processes, Designer

The behavior of the "Forbid to reassign" option was changed via compatibility parameter.

With the old behavior, the "Forbid to reassign" option in a user task could affect the automatic substitution. For example, when enabled, it can forbid substitution. Such behavior does not make sense from the point of the new implementation of substitutions, but it must be maintained to ensure functioning of already existing processes. New substitution rules:

1. The Forbid to reassign option only forbids or allows reassigning on the task web page.

2. The Forbid Substitution option in the swimlane settings allows or forbids substituting the executor.

3. The options are fully isolated from each other, the effect of switching one does not affect the other.

How it was:

The Forbid to reassign option in a user task could affect automatic substitution.


For example, a user is substituted (with the substitutions mechanism), the participants do not have process-level permissions to reassign tasks. During the process execution, the task is not assigned to the substitute user, if the Forbid to reassign option is enabled in the user task settings. If it is disabled, the process is executed as expected.

Using this option is difficult, since it has side effects, which must be considered in processes.

How it is now:

The compatibility parameter defines whether the Forbid to reassign option affects substitutions. It is defined for each process version on the Settings tab in the Compatibility Parameters collapsible panel:

If it is enabled, the old behavior will work (see How it was). This parameter is automatically enabled for all the existing processes. Thus, all the existing processes will continue to work as they used to.

If you need to use the new feature behavior, uncheck the box and confirm. Attention! Disabling is irreversible, you will not be able to enable the parameter again. Therefore, before disabling, check the process for the usage of the Forbid to reassign option to forbid substitutions and fix it (use the swimlane option to forbid substitution).

The parameter is disabled in new processes by default.

List of changes in version 3.11.6

Extension points

A method with two parameters added to BaseDocumentFromElementResolver:

public virtual FormView GetView(IWorkflowInstance instance, Element element)

The old method is marked as obsolete: FormView GetView(Element element).

Block, Web Application

Block validation is improved, which now checks if there are empty cells on the pages that are not currently displayed to the user. The presence of empty cells and nested block is identified on the server and then this information is passed to the block and displayed.

Also required but not filled in sub-blocks have red background color, just as the required but not filled in fields. In the same way, sub-block with required but not filled in elements inside are highlighted.

How it was:

Validation skipped the blocks and sub-blocks with required but not filled in fields, if they appeared on a page, invisible for the user at the moment.

How it is now:

Validation highlights blocks and sub-blocks with required but not filled in fields. It highlights the sub-blocks with required but empty fields that appeared on a page invisible for the user. In case of blocks, the message “Fill in the required fields on other pages” is displayed. For example:

Example of a sub-block that has empty fields on the second page:


List of changes in version 3.11.5

Code and public class API

Method EleWise.ELMA.Projects.Managers.ProjectTaskBaseManager.IsActiveForPublish(IProjectPlanItem planItem) is obsolete and soon will be deleted. In the new versions use EleWise.ELMA.Projects.Managers.ProjectPlanItemManager.IsActiveForPublish(IProjectPlanItem planItem)

Method EleWise.ELMA.Projects.Managers.ProjectTaskManager.IsActiveForPublish(IProjectPlanItem planItem) is obsolete and soon will be deleted. In the new versions use EleWise.ELMA.Projects.Managers.ProjectPlanItemManager.IsActiveForPublish(IProjectPlanItem planItem)


Possibility to use Russian letters in the library jquery.maskedinput-1.3.js, in the function mask(), using a special character – «r». Example: $(’#nomber’).mask(’rr 999’)

Blocks, Web Application

The validation rules changed – the set of block rules (Fill in the required fields and You must finish editing the entry) are placed before the field rules. As a result, the block rules have higher priority than the field rules and trigger earlier.

How it was:

If a block had a validation rule for a field (e.g. Fill in the required field), then it could lock the block rules. In such cases, the validation message remained the same, although the block has to display a message of one of its validators (e.g. You must finish editing the entry).

How it is now:

Block validators are triggered before field validators. Therefore, block validator messages can now replace field validator messages.


The Filter tab removed from the document and project type editor. Also the Filter Settings and Program Settings blocks are removed from the Additional tab.


The Filter Settings and Program Settings blocks are also removed from document and project type creation wizards



List of changes in version 3.11.4

Code API. Public methods and interfaces


Interface of the EleWise.ELMA.CRM.Components.IAddressProvider extension point for working with addresses of different countries is marked as obsolete, instead use EleWise.ELMA.CRM.ExtensionPoints.IAddressProvider, EleWise.ELMA.CRM.Web.Extensions.IAddressProviderWeb and EleWise.ELMA.CRM.Web.Extensions.IAddressBaseSettings.

Classes EleWise.ELMA.CRM.Web.Models.AddrBaseCrmEleWise.ELMA.CRM.RU.Web.Models.AddrBaseCrm are marked as obsolete.

Views, responsible for address input are modified.

Export/import mechanisms changed

1. In the helper EleWise.ELMA.Deploy.Import.Helpers. MetadataImportHelper:

· method ValidateEntityTableName changed: optional parameter added: string messageAdditionalInfo = null

· method ValidateTableName changed: optional parameter added: string messageAdditionalInfo = null

User interface


Highlighting of events that require confirmation added in the calendar:


A respective message added to the tooltip.

Blocks, Web Application, Scripts

Fixed block validation errors, which were updated in version 3.11.2.

How it was:

Inappropriate block validation method showed in two ways:

1. Due to an error on the page, buttons using JavaScript function invocation stopped working.

2. When editing block rows in a popup, a validation conflict occurred and it was impossible to finish editing the row. After clicking Save the popup looked like this:


How it is now:

Block validation (grid telerik) is implemented differently. As a result:

1. The situation that caused an error in JS was eliminated and the button started working.

2. Validation conflict that occurred when editing a block row in a popup was eliminated.


When using MSSQL and a configuration file with a connection string WITHOUT AttachDbFilename, ELMA cannot make a backup copy, requiring to specify a path in backupPath.

Such behavior is incorrect. When backupPath="" is specified in the configuration file, it means “use the path by default ", which is a path for backup copying in MSSQL (configured by the database administrator).

How it was:

Database update was interrupted with an error:

*EleWise.ELMA.Runtime.Exceptions.ConfigurationInitializeException: Error initializing ELMA configuration ---> System.InvalidOperationException: Failed to create a database backup copy: folder for saving a database backup copy is not specified. Specify a path in the "main.db" section, "backupPath" parameter.

When updating a database, the backup copying is performed automatically. The copy appears in the backup catalogue of the MSSQL instance.How it is now:



PublicAPI.Docflow.Objects.DmsObject.Filter() – filter changed:

Virtual(Boolean virtual) - Added

PublicAPI.Docflow.Document.Filter() - filter changed:

Virtual(Boolean virtual) - Added

PublicAPI.Docflow.Types.WebDocumentReport.Filter() - filter changed:

Virtual(Boolean virtual) - Added

PublicAPI.Docflow.Types.BudgetExpense.Filter() - filter changed:

Virtual(Boolean virtual) - Added

PublicAPI.Docflow.Types.Contract.Filter() - filter changed:

Virtual(Boolean virtual) - Added

PublicAPI.Docflow.Types.Deed.Filter() - filter changed:

Virtual(Boolean virtual) - Added

PublicAPI.Docflow.Types.File.Filter() - filter changed:

Virtual(Boolean virtual) - Added

PublicAPI.Docflow.Types.ContractOutgoing.Filter() - filter changed:

Virtual(Boolean virtual) - Added

PublicAPI.Docflow.Types.ContractIncoming.Filter() - filter changed:

Virtual(Boolean virtual) - Added

PublicAPI.Docflow.Types.DisagreementsProtocol.Filter() - filter changed:

Virtual(Boolean virtual) - Added

PublicAPI.Docflow.Types.ContractAttachment.Filter() - filter changed:

Virtual(Boolean virtual) - Added

PublicAPI.Docflow.Types.AdditionalAgreement.Filter() - filter changed:

Virtual(Boolean virtual) - Added

PublicAPI.Docflow.Types.BudgetIncome.Filter() - filter changed:

Virtual(Boolean virtual) - Added

PublicAPI.Docflow.Objects.Folders.ActionFolder.Filter() - filter changed:

Virtual(Boolean virtual) - Added

PublicAPI.Docflow.Objects.Folders.FilterDocumentFolder.Filter() - filter changed:

Virtual(Boolean virtual) - Added


List of changes in version 3.11.3

User interface

1. Unnecessary line removed from the deal report form markup


2. When a grey blocker and the “Please wait…” block appear, focus is removed from the active element. After closing the grey blocker, the focus is returned.

Security, Business processes, Platform layer

Locking an instance responsible with a timer, if the user was locked before the time had expired, it caused a situation when it was impossible to interrupt the timer and view the error text.

Visibility of one of the timer menu item was changed. The Change planned time item is displayed, while the time is not yet expired. When the timer is in the state of an error, this item does not appear.

How it was:

Error text was not displayed, the timer could not be interrupted.


How it is now:

Timer can be interrupted, once a new instance responsible has been assigned or the previous instance owner has been unlocked. Error text is displayed.


Blocks, Web Application, Scripts

Block validation (grid telerik) is implemented differently.

How it was:

Inappropriate block validation showed in two ways:

1. Due to an error on the page, buttons using JavaScript function invocation stopped working.

2. When editing block rows in a popup, a validation conflict occurred and it was impossible to finish editing the row. After clicking Save the popup looked like this:


How it is now:

Block validation (grid telerik) is implemented differently. As a result:

3. The situation that caused an error in JS was eliminated and the button started working.

4. Validation conflict that occurred when editing a block row in a popup was eliminated.

Configuration of size limit in properties

1. Logic of configuring limits in properties changed. If the “Can be empty” box is checked in a property and its minimum and maximum values are specified, then if the property is empty, the min/max verification is not performed.

2. If the “Can be empty” box is NOT checked in any numeric type, then an empty property will be automatically filled in with “0”.

3. Accuracy limit added for fraction numbers, i.e. a user can enter as many integral digits, as specified in the property settings.

Editing business processes

Added the possibility to save changes made to a business process when closing the designer (except for the Policies tab).


When the dialog box appears, a user can choose one of three options: save the changes in all the edited business processes, or close ELMA Designer without saving the changes. When you double click on a business process in the tree, it will open in the Designer.

Web Application, CRM

In the Deals subsection of the CRM section, the Next Relationship field was added to the deals table. This field displays the date and time of the upcoming relationship on a deal with a contractor (or the last one, if there is no upcoming).



“Projects” module

Portlet that displays the project processes added



No changes


List of changes in version 3.11.2

Code API. Public methods and interfaces

OracleTransformationProvider changed

1. The Connection property of the class EleWise.ELMA.Extensions.Oracle.OracleTransformationProvider returns EleWise.ELMA.Runtime.Db.Proxies.DbConnectionProxy instead of connection of the oracle provider.

Reports SQL-request execution manager changed

1. In the class EleWise.ELMA.Reports.Managers. ReportDataSourceSqlQueryManager the following methods were removed:

· public virtual void SetParamValue(IDbCommand cmd, string name, object val)

· public virtual void SetInt32(IDbCommand cmd, string name, int val)

· public virtual void SetInt64(IDbCommand cmd, string name, long val)

· public virtual void SetInt16(IDbCommand cmd, string name, Int16 val)

· public virtual void SetByte(IDbCommand cmd, string name, byte val)

· public virtual void SetFloat(IDbCommand cmd, string name, float val)

· public virtual void SetDouble(IDbCommand cmd, string name, double val)

· public virtual void SetGuid(IDbCommand cmd, string name, Guid val)

· public virtual void SetString(IDbCommand cmd, string name, string val)

· public virtual void SetDecimal(IDbCommand cmd, string name, decimal val)

· public virtual void SetDateTime(IDbCommand cmd, string name, DateTime val)

· public virtual void SetImage(IDbCommand cmd, string name, byte[] val)

· public static void AddParameter(IDbCommand cmd, string name, object val)

User interface

Business processes

Switching a process instance to a new version with the possibility to edit the diagram (adding and deleting elements) was implemented.

Since switching an active instance (while at least one of its tasks is active) may violate the status integrity, additional verification was added. It is performed right before switching a version. The verification result is shown to the user The verification result is shown to the user as a notification on the page.

How it was:

The process version change validator did not allow adding and/or deleting diagram elements. Switching to such a version was impossible.

How it is now:

Improved active process state update. Validator’s restriction to add and/or delete elements was removed. When changing a version, a notification appears under the page header, informing whether the version was successfully switched. For example, if you try to switch to a new process version, while the instance has active tasks, the following message will be displayed:


Web Application, Tasks, Business Processes

Changes were made to the script handler, fixing the triggering of “Fill in the required field” validation on all the form fields after script invocation.

In other words, forced validation of all the form fields after script execution was removed. Instead, the handler identifies, in which fields the validation metadata changed after applying the methods Validation.Error("…") and Validation.Ok(). Only these fields are validated after script execution.

How it was:

Execution of any script on dynamic forms with required fields caused all the fields to show the “Fill in the required field” message, including those fields, the user has not even interacted with yet. Some fields continued to display that message even after being filled in, which confused users.


How it is now:

After fixing the script handler, forced validation of all the fields is no longer invoked; now it is triggered only for those fields, whose validation error message has changed.

The behavior after data input was also corrected in these two elements: they used to keep displaying the message even after filling in the fields.

Web Application, Projects, Scripts

If a user got an empty table in the task due date or time report forecast tasks, an error occurred, that made it impossible to complete the task. This error was eliminated.

JavaScript code, related to the tasks, was also compiled from different places to one js script.

How it is now:

The function of the “Complete” button used a variable that was declared only when the table had data. Without the data, task could not have been completed, since the browser could not detect this variable.


How it is now:

The JavaScript code, related to the forms of due date and time report forecast, was compiled in one js script. Thus, the required variable is now always declared, and the entire logic is contained in one file.


Improved backup policy when updating the database: manual backup copying (MBC) added to automatic backup copying (ABC). Having detected a database update, ELMA first initiates backup copying. After that, the database update starts. If ABC is active, then the user is not required to do anything, the system will do everything on its own. If MBC is involved, then additional information on the backup copying is displayed and the system may show a form for manual confirmation that a backup copy exists. On this screen, the administrator must first make a backup copy and then confirm it in the system by entering a code word from the file, specified on the form. The file is located on the server where ELMA is installed. After entering the code word, ELMA server restarts and updates.

ABC is supported for:

· Firebird DBMS


· PostgreSQL DBMS, if the ELMA server and the DBMS are installed on the same server

MBC is used in these cases:

· The ABC option is disabled (backupEnabled="false") in the configuration file. Applies to all DBMS

· Oracle DBMS

· PostgreSQL DBMS, if the ELMA server and PostgreSQL are installed on different servers

In case of MBC, the start screen displays an additional line, informing about the progress of backup copying. Possible messages:

1. "During the initialization you may be required to back up the database manually." This message is displayed in orange. The purpose of this message is to inform the user/administrator that they need to wait until an MBC form or a notification that ELMA handled the backup on its own appears.

2. "Database backup is not required." This message is displayed in green. It appears in case the server was only restarted and no database updates were found.

3. "Database has been backed up automatically." This message is displayed in green. It appears in case the ELMA server created a backup copy automatically.

4. "Database has been backed up and verified manually." This message is displayed in green. It appears in case the administrator confirmed that a backup copy was created.

Also a backup copying method was added for PostgreSQL – it is performed by means of the pg_dump utility. In cases when several instances of PostgreSQL are installed on the server with ELMA and you need to use a specific instance, the pathToPgDump option is provided. It allows specifying an absolute path to the executable file pg_dump, including name and extension.

An example of a section configuration (each attributes starts with a new line, for illustration purposes):



type="EleWise.ELMA.Extensions.PostgreSQL.PostgreSQLProvider, EleWise.ELMA.Extensions.PostgreSQL"



pathToPgDump="C:\PostgreSQL\pg95\bin\pg_dump.exe" />
Changes were made in the configuration file for PostgreSQL, in the section <configSections>.

As the type, in the line

1 <section name="main.db" type="EleWise.ELMA.Configuration.MainBaseSettingsSection, EleWise.ELMA.SDK, Version=, Culture=neutral, PublicKeyToken=cb29d04eca9b031d"/>


1 <section name="main.db" type="EleWise.ELMA.Extensions.PostgreSQL.PostgreSQLSettingsSection, EleWise.ELMA.Extensions.PostgreSQL" />

Backup log added to the system – it contains all the related actions. Path to logs relative to the server’s web catalogue: \logs\Backup\backup-log-*.

How it was:

System actions, related to backup copying, had been almost unnoticeable before this fix. Only the start screen might have displayed a message, that a backup copy was being made.

How it is now:

The ABC mode works the same as before.

In the MBC mode, a message is added to the start screen, that clarifies the current backup copying status:


Depending on circumstances, the user may see the form for confirming that there is a backup copy:


Time report approval on the time report item page

The dialog box that opens when clicking Approve on a time report item page changed: the Approve and Reject button added, a table with the amount of submitted, approved and rejected time added, a comment field added.

Business processes

Description of the “Configure the approval route” task was moved to the task form in Web Application.

Changes in Leads

The button for starting a process from the section and a lead page was moved from the main toolbar to the menu of the Selected button.


Now, among the processes that have a Lead type input variable, only the ones, added to the Lead object are displayed


Messages section

Information about event time and place was added to the notification about the event (if these fields are filled in). Thus, event notifications became more informative.

How it was:

Event notifications contained the event subject and description.


How it is now:

The event notification displays the event subject, place, start date and description.


General modifications

Return to top button added

Added the Return to top button, which appears in the bottom left corner of the screen after scrolling the page down.

How it was:

There was no return to top button.

How it is now:

When you scroll a page down, the return to top button appears at the bottom left corner. When you click on this button the page returns to the top. The button disappears if you are at the top of the page.


Error messages redesigned



CRM section:

Methods added:

Void PublicAPI.CRM.Inpayment.SetInpaymentStatus(Inpayment inpayment, InpaymentStatus inpaymentStatus, Nullable<DateTime> actualDate, String changeStatusComment)

Void PublicAPI.CRM.Inpayment.SetInPlanStatus(Inpayment inpayment, Nullable<DateTime> actualDate, String comment)

PublicAPI.CRM.Inpayment.Filter() - filter changed:

ActualDate(DateTimeRange actualDate) - Added


List of changes in version 3.11.1

Code API. Public methods and interfaces

Rounding of numbers using scripts

If a script is executed when specifying a more exact value for integers and fractions, than configured in the property settings (e.g. if you enter a fraction in an integer field), then a rounded value will be passed to the script.


Added possibility to make author name template in the mail body.

For this, add the tag <Author></Author> to the template. This tag allows redefining the notification author in the mail body, if necessary (see figure below).


An example of a template, that allows wrapping the message author into a AALocalizeUser function, in order to display a localized name of the author (this function is used as an example):

<?xml version="1.0" encoding="utf-8"?>
<Notifications description="Notification on the document" version="">



Added the possibility to merge resources, exported from Designer.

When you export resources from Designer to a certain folder, the resources are merged with the ones in the folder. After the files have been merged, an additional Logs folder with the merger results is created in the target folder.

User interface

Display of lead duplicates

Page-by-page display of lead duplicates added


· Added notifications for the informed users and the work participants when creating a lead

· Added notification for the responsible user when creating a deal

Notification for participants when creating a periodic event

The notification about a new periodic event now contains a correct link to the event template

Document management

Copy button was hidden for document types

Web, user interface

For documents that have more than one registration route, a link to the document was added to the window for sending for registration.

MS Word documents generator

· Implemented pasting of text to lists without creating additional numbered items but with saving the formatting;

· Implemented pasting of multi-line text in cycles.

Designer, Data model, Business processes

Added verification of class and database table names on the form for creating a new process in Designer. The IDs in these fields must start with a Latin letter, followed by numbers, Latin letters or underscores "_". In addition, C# keywords are forbidden in class names, and keywords of the DBMS used are forbidden in database table names.

How it was:

When creating a process, you could specify any symbols in the class name and database table name of different process structures. There was no verification and no error message was displayed, while the process was saved. However, it was impossible to publish such a process later and the class name could not have been changed in Designer.


How it is now:

Class and database table names are verified when creating a new process and error messages are shown.



The possibility to see changes only in the “Compare project plan versions” tool added (filter “Show only changes in the chart” added that hides tasks with the same start and due dates).

Comparing two project plan version without the filter “Show only changes in the chart”:


Comparing two project plan version with the filter “Show only changes in the chart”:



Portal section:

PublicAPI.Portal.Objects.Common.LastObjectInfo.Filter() - filter changed:

UniqueObjects(Nullable<Boolean> uniqueObjects) - Added


List of changes in version 3.11.0

Updated libraries, outside the main ELMA solution

























The EleWise.ELMA.Web.Mvc.UI.INotifier interface is not inherited from EleWise.ELMA.Model.Views.IFormNotifier.

The following methods were deleted from the INotifier interface and moved to IFormNotifier:

/// <summary>

/// Show information message

/// </summary>

/// <param name="text"></param>

void Information(string text);


/// <summary>

/// Show warning message

/// </summary>

/// <param name="text"></param>

void Warning(string text);


/// <summary>

/// Show error message

/// </summary>

/// <param name="text"></param>

void Error(string text);

Time zones

Added the possibility to set a time zone in the user profile.


The system takes the user’s time zone into account. When changing a time zone on a device, the user receives a suggestion to change the time zone in the profile to the relevant one.


Template-based document generation. Added the possibility to generate a document depending on the time zone offset in minutes by setting an offset in minutes for the TemplateTimeZoneOffset property of the IGeneratorProvider provider of the GeneratorBase (Provider property) base generator, if the property is not specified, time will not be converted.

Business calendars

The possibility to create and edit business calendars added.

Calendar mode.


List mode.


List of common calendars.


Regular editing mode for configuring basic settings of a business calendar.


The expert editing mode for configuring basic settings, weekdays and exceptional days was implemented. The expert mode provides flexible customization of the business calendar, in particular, it allows setting more than two working intervals (shifts) per day. When you switch from the regular editing mode to the expert, the settings remain corresponding. If a base working day or a weekday has more than two work shifts, the regular editing mode become unavailable.

Expert editing mode for configuring a business calendar.


Weekday and exceptional day editor.



Working interval editor in the expert mode.


Possibility to set a business calendar in the user profile added.

Possibility to set one of three business calendar types added on the Calendar tab of the user profile.

Global business calendar – basic business calendar of the system, default business calendar.

Common business calendar – user business calendar, can be assigned to a user.

Personal business calendar – assigned to a single user.

The system functions, related to the business calendar, will work for the user according to the settings described above.


The following methods added to the service for working with business calendar.

1. IProductionSchedule GetProductionSchedule(IUser user, IEntity entity, TZSettings tzSettings);

2. IProductionSchedule GetProductionSchedule(IUser user, IEntity entity);

They return the valuator of an aggregated business calendar.

Maximum information for aggregation must be passed to the method.

System user – when aggregating business calendar data, the personal settings of the user’s business calendar, leaves, vacations and other information will be taken into account.

Entity – when aggregating business calendar data, the corresponding entities will be taken into account, such as a calendar of a process, project and so on.

Time zone settings – by default, the aggregated business calendar valuator will be configured in the server time zone; if necessary, use the method that receives time zone settings as a parameter.

When using time zones, remember, that the time, which is being passed to the valuator methods, must be in the execution environment time zone.

99% of the time you do not need to do anything to fulfill this condition, but if the conditions were not fulfilled for some reason, use the time transformation methods of the static class EleWise.ELMA.TZ.

3. IProductionSchedule GetGlobalProductionSchedule(TZSettings tzSettings);

4. IProductionSchedule GetGlobalProductionSchedule();

They return the global business calendar valuator. Time zone settings work in the same way as for the methods for obtaining the aggregate business calendar.


DBMS version check when starting ELMA server implemented. When you try to use a DBMS of the version, lower than the minimum requirement, the following message appears:



General settings

Telephony settings menu. ELMA telephony settings blocks and telephony provider settings were combined. Possibility to make a test call to check the settings added.


Possibility to configure the default country code added. You can also configure equivalent phone number prefixes (e.g. +7, 7 и 8).


Updated IP telephony settings menu in the user profile. Possibility to disable IP telephony for specific users added.


Asterisk telephony panel

If telephony is configured and the agent is not running, the panel shows the requirements.


If telephony is configured correctly and the requirements are met, the panel allows entering a phone number, contractor or company (search among all the CRM objects).

The panel also contains the call history, which logs calls even when the user is not connected.

The possibility to pause work added (calls will be received, but the call page will not open)



If a call page is open, the telephony panel changes its appearance. At this moment the buttons for ending, pausing (the call is not ended, but the callers cannot hear each other) and redirecting the call.


General adjustments in telephony

1. Storage of formatted telephone numbers

2. Bringing implementation of telephony provider modules to a single format

3. Storage of the call history in the CallHistory object

Business processes

Process monitor

Processes in the full process monitor are now sorted alphabetically.

Validation and form builder

The .ForAll() method added to the dynamic form object FormViewBuilder<T> form, which is used in scripts. It affects all the dynamic form elements and is used for changing the state of all the form elements.

Value validation for any dynamic form element in the change value script. In addition to existing form methods .Visible(bool), .ReadOnly(bool) and .Required(bool), new validation methods were added - .Validation.Ok() and .Validation.Error(string). The first method makes the value valid and hides the validation error message. The second marks the value as invalid and shows the validation error message.


Send Message/Receive Message

The system of delivering messages using the Send Message and Receive Message elements improved. So called Guaranteed Delivery (GD) was implemented. The previous system version had a bug – a message got lost if sent before the receiving process reached the Receive Message activity. Guaranteed Delivery fixes this.

Now message types in the system are classified as “messages with GD” and “regular”:

· Using messages with GD is restricted: they can be used only when the receiver process is known.

· Regular messages work as they did before, nothing was changed.


1. The standard message type was extended: The Guaranteed Delivery parameter was added. Message type dialog box was updated.


2. “Soft” deletion of message types with the possibility to restore implemented.

3. Message types, used in published process versions cannot be deleted.

4. Message types, used in obsolete or draft process versions can be “soft” deleted. If there are active instances of an obsolete process version, then their execution will continue after the message type has been deleted.

5. The Message Types section was added to the designer menu, which provides the following functions: adding, editing, copying and searching processes, where a message is used. “Show deleted message types” option added, which provides access to restoring deleted message types.



6. Message type name is unique (including the deleted messages).

7. A dialog box for searching processes (obsolete, published, drafts) where a message type is used was created.

8. When configuring a Send Message element, the list of available message types depends on the process instance combobox value: if a process instance is selected, then messages with GD are available; if the combobox is empty, messages with GD are not available in the list.

9. Entity added – element of a queue of messages with GD (WorkflowMessageItem).

10. When sending a message with GD, it is always saved in the queue. Then an attempt to make instant delivery is made (when the receiver process is already at the receive message activity). If a receiver is not found, the message is stored in a queue until a receiver is found.

11. When receiving a message with GD, the element tries to find the first unread message in the queue with matching parameters: message type and receiver process. If it finds a matching message, it is delivered. If there are no messages for the element, the process waits for a message.

12. The “Element of a queue of messages with GD” entity stores the list of UIDs of “Receive Message” elements that have read this message.

13. A new task was added to the planned tasks - "Queue of messages with guaranteed delivery”. The task is started every two minutes and fulfils two functions: clearing the queue of obsolete messages (once the instance is completed) and delayed delivery (it is supposed to be activated only in high-load systems). This planned task is not displayed in the task scheduler (hidden).

Business processes

Possibility to change the current version of an active process to the last published version implemented. Use this feature with caution, the process may misbehave after changing its version. A user makes a decision to change the version at their own risk. When changing the version, you need to enter a comment describing the reasons to change the version.

Main new features:

1. New form for changing the instance version. Form content: operation description, version change summary, errors and warnings, instance information, versions comparison.


2. The process history reflects that the version has been changed.


3. New permissions to change the process version. By default, no one has these permissions.

4. Verification when changing to a new process version. Verifications were implemented, that are supposed to detect and display on the form the inconsistencies between the versions that harm the process after changing the version:

a. Adding and deleting elements with the activity is forbidden. This group includes almost all the diagram elements, except for artifacts, swimlanes and connectors.

b. Changing the version is forbidden when the active element is in a gateway, which in the new version has an outgoing connector that bypasses the active element.

c. Changing the version is forbidden when the active element is moved to another swimlane or when the swimlane executor or type changes.

d. Context of elements and scripts can be changed.

e. Context variables can be added and deleted.

f. Elements can be moved on the diagram and inactive elements can be moved to other swimlanes. Exceptions are: moving an active element to another gateway and placing elements, executed in parallel, consequently.

g. Connecting elements differently is allowed. E.g. remove an obsolete element from the process.

5. The Change Version button appears only if this operation is possible. The following conditions must be met:

a. The process instance must be active

b. The current version must be older than the last published version

c. The current user must have permissions to change the process version


6. The button for confirming version change is visible, if there are no incompatible changes between the versions.

7. Template for a notification about process version change created. The notification is sent to the process initiator and responsible user, if another authorized user changes the version.



Option that allows/forbids starting the process from the system added – “Start process from Web Application”. If this box is unchecked, the process is not displayed in the list. The “Manually” box was renamed to “Visible in the process list”.



Possibility to edit block columns without using the editing mode added. This is available only for properties in the main block (unavailable in sub-blocks), and for these types:

1. String;

2. Text;

3. Yes/No;

4. Integer;

5. Fraction;

6. Money;

7. Drop-down list;

8. Date/Time;

9. Enumeration.


To activate this mode, check the “Quick property editing” box on the form of the required block property.


Community Edition:

Script Builder removed from Designer in CE.


1. Creating scripts in the Builder is available only via the context menu in the script list. This context menu opens only if you hold shift.

2. Script lists are combined. A separate icon added for scripts, created in the Builder


3. Warning panel added to the Builder panel, notifying that this is a beta-feature


4. The Custom Activities section is not between Processes and Global Modules sections.

5. Custom Activity versioning added. When you open a version, only the custom activity scripts and parameters open in the read only mode. The Version History tab added for the active version of the custom activity. Any version can be used as a current draft.



6. The possibility to add a script to a specific transition added. This feature is implemented for regular user tasks.




New signature added for these scripts

public virtual bool Qwerty (Context context, EleWise.ELMA.Model.Views.FormViewBuilder<Context> form)


return true;


In this function, true must be returned if the transition must be followed.

If false is returned, the user remains on the same page.

These scripts are linked with the start and end events. If an element is dragged from one connector to another, the script disappears from the list. If you drag it back, the script will return.

7. Custom notifications (available in all sections, which have FormViewBuilder). New property added to FormViewBuilder – Notifier. This property allows showing information and warning messages, as well as error messages. These messages are displayed on the form where they have been invoked. In case of pop-ups they will be displayed inside the pop-ups; in case of portlets – in portlets.

On the input, the functions receive a string. Invocation is the following: form.Notifier.Warning (context.Stroka);

You can invoke several messages in one integration:

form.Notifier.Information (context.Stroka);
form.Notifier.Warning (context.Stroka);
form.Notifier.Error (context.Stroka);



Form builder for tasks in project types

1. Project tasks (Project task base class, Project task, Milestone, Start business process) now work with the form builder



2. Apart from the possibility to configure project task forms for all the projects, now it is possible to customize project task forms for each project type in particular. For this, you need to add and configure task type forms in the project type in the Designer.



Changes in object filters

1. In the controller EleWise.ELMA.BPM.Web.Common.Controllers. EntityController Explorer method changed: the GridCommand command parameter added.

Changes in external authentication and authentication in LDAP

Terms used:

Provider – old version of the component that implements authentication. It is supported in 3.11 but not recommended for writing new extensions.

Module – new version of the component that implements authentication. It allows creating instances of connections to external credential lockers directly from the web interface. You can develop your own authentication module, different from LDAP.

1. User validation changed:

· method void Validating(UserValidationContext context) of the authentication events handler in the system EleWise.ELMA.Security.Services.IMembershipServiceEventHandler is no longer used for validation; its execution results, logged in the context will not be taken into account

· instead, validation is performed in method bool ValidateUser(string userNameOrEmail, string password) of the external authentication implementation extension point EleWise.ELMA.Security.IExternalMembershipService

2. External authentication implementation extension point EleWise.ELMA.Security. IExternalMembershipService was marked as Obsolete. It will be deleted in the upcoming versions.

3. Class EleWise.ELMA.Security. MembershipSettings was marked as Obsolete. It will be deleted in the upcoming versions.

4. LDAP authentication provider EleWise.ELMA.IntegrationLdap.Extensions. LdapExternalMembershipService was deketed:

· Instead an undeletable instance of the LDAP authentication module will be used

· The settings of the LDAP authentication provider will be shifted to the undeletable instance of the LDAP authentication module upon the system start

5. Authentication events handler in the system EleWise.ELMA.IntegrationLdap.Extensions. LdapUserModelMembershipEventHandler was deleted

6. LDAP authentication provider settings class EleWise.ELMA.IntegrationLdap. IntegrationLdapSettings was changed:

· It no longer implements the interface System.ICloneable

· method public IntegrationLdapSettings Clone() was deleted

7. LDAP provider settings module controller EleWise.ELMA.IntegrationLdap.Web.Components. IntegrationLdapSettingsModuleController was deleted.

8. LDAP provider settings controller EleWise.ELMA.IntegrationLdap.Web.Controllers. IntegrationLdapSettingsController was changed:

· method public ActionResult View() was deleted

· method public ActionResult Edit() was deleted

· method ManualSyncStart() was changed: parameter Guid uid was added

· method RefreshSyncStatus() was changed: parameter Guid uid was added

· method RefreshSyncDate () was changed: parameter Guid uid was added

9. Logs of the authentication module EleWise.ELMA.IntegrationLdap moved to a separate log IntegrationLdapLog.

User interface

Object selection explorer changed

1. The following features were added to the object explorer:

· Advanced search (for custom and some system objects)

· eql-search (for custom and some system objects)


LDAP authentication settings changed

1. In the system settings, the Integration with LDAP block was replaced with the External Authentication Modules block


2. Form for viewing/editing LDAP connection settings was changed



To learn more about LDAP integration, see this Help page.

Preview generation service

1. RabbitMQ updated to version 3.6.0;

2. Proxy server settings added in the designer for the RabbitMQ message queue.


3. New extension point IQueueMessageExManager was added to the assembly EleWise.ELMA.MessageQueue. It allows passing message queue parameters when sending a message to the queue and calling the function, which allows using this assembly in systems that have no databases

4. New methods were added to the class EleWise.ELMA.MessageQueue.Manager.QueueMessageManager:

/// <summary>

/// Receive a message from the queue

/// </summary>

/// <param name="type">Array of types of received messages</param>

/// <param name="typeUid">Queue type Uid</param>

/// <param name="settings">Settings</param>

/// <returns>Returns an object with the received message or null if there are no messages</returns>

public object Receive(object type, Guid typeUid, object settings)

/// <summary>
/// Send a message to the queue

/// </summary>

/// <param name="message">Message to send</param>

/// <param name="typeUid">Queue type Uid</param>

/// <param name="settings">Queue settings</param>

public void Send(object message, Guid typeUid, object settings)

6. A new component was added to the package system – FilePreviewCreatorComponent.5. Managers EleWise.ELMA.MessageQueueJMS.Manager.JMSMessageManagers, EleWise.ELMA.MessageQueue.Manager. MSMQMessageManager, EleWise.ELMA.MessageQueue.Manager. RMQMessageManager were re-inherited from the extension point IQueueMessageExManager.

7. New method and property were added to the class EleWise.ELMA.Packaging. ElmaPackageInfoData:

  • public string Tags { get; set; }
  • public ElmaPackageInfo ToInfo()

Sending messages in packages and grouping by subject

Email messages are now sent with grouping headers, if the mail client supports it, the emails on one object will be grouped in chains.

Time reports

User interface

The Time Report Log tab in tasks, project tasks, SMART tasks and documents was renamed to Time Report.

Time report approval

If you select less time to approve than submitted, a dialog box will appear, which displays the time report items and allows you to: ignore the remaining time (submitted time minus approved time) or reject the remaining time. The system used to work according to the first option always. Time report items with 0:00 hours are rejected.

Access to the Marketing section

The possibility to view the Marketing section was included in the "Access to the Marketing section" permission.

“Full access to the Marketing section” permission was added:

1. Allows adding and editing marketing groups, activities and events.

2. Editing the budget.


The following was added to the generated document

· Operation execution time

· Description of transitions

· Description of gateways

· Artefacts, linked to activities

· Description of the group of elements, which includes an activity

· Numeration of artifacts was changed in the document

Possibility to generate policies from task descriptions was added in Designer



CRM section:

Added object managers:




CallHistoryFilterHelper PublicAPI.CRM.Objects.Telephony.Models.CallHistory.Filter()

Added methods:

PhoneFilterHelper PublicAPI.CRM.Objects.Phone.Filter()

PublicAPI.CRM.Objects.Telephony.Models.CallHistory.Filter() - filter changed:

CallDate(DateTimeRange callDate) - Added

CallDirection(CallDirection callDirection) - Added

Number(String number) - Added

Author(User author) - Added

SearchString(String searchstring) - Added

Id(Int64 id) - Added

Query(String query) - Added

Find() - Added

PublicAPI.CRM.Objects.Phone.Filter() - filter changed:

PhoneString(String phoneString) - Added

DisplayName(String displayName) - Added

ReferenceOnEntity(ReferenceOnEntity referenceOnEntity) - Added

SearchString(String searchstring) - Added

Id(Int64 id) - Added

Query(String query) - Added

Find() - Added

Раздел Docflow:

PublicAPI.Docflow.Objects.DocumentAssignUser.Filter() - filter changed:

AuthProviderGuid(Guid authProviderGuid) - Added

Processes section:

Added object managers:



Added methods:

CustomActivityFilterHelper PublicAPI.Processes.Objects.CustomActivity.Filter()

PublicAPI.Processes.Objects.CustomActivity.Filter() - filter changed:

SearchString(String searchstring) - Added

Id(Int64 id) - Added

Query(String query) - Added

Find() - Added

Portal section:

Added object managers:



ResourceCalendarUserMapFilterHelper PublicAPI.Portal.Objects.Calendar.ResourceCalendarUserMap.Filter()

PublicAPI hidden in the tree:


PublicAPI.Portal.Objects.Calendar.ResourceCalendarUserMap.Filter() - filter changed:

User(User user) - Added

Calendar(ResourceCalendar calendar) - Added

SearchString(String searchstring) - Added

Id(Int64 id) - Added

Query(String query) - Added

Find() - Added

Enums section:

Added enumerations:












Services section:

Added methods:

IProductionSchedule PublicAPI.Services.ProductionCalendarServices.GetProductionSchedule(User user, Document entity, TZSettings tzSettings)

IProductionSchedule PublicAPI.Services.ProductionCalendarServices.GetProductionSchedule(User user, Document entity)

IProductionSchedule PublicAPI.Services.ProductionCalendarServices.GetGlobalProductionSchedule(TZSettings tzSettings)

IProductionSchedule PublicAPI.Services.ProductionCalendarServices.GetGlobalProductionSchedule()

Void PublicAPI.Services.EmailServices.SendMessages(SmtpSettings smtpSettings, MailMessage[] message)

Void PublicAPI.Services.EmailServices.SendMessages(SmtpSettings smtpSettings, IEnumerable<MailMessage> messages)

AuthenticatedSessionInfo PublicAPI.Services.AuthenticationServices.GetCurrentSession()

Obsolete methods:

Void PublicAPI.Services.ProductionCalendarServices.SetHoliday(DateTime date) (Do not use)

Void PublicAPI.Services.ProductionCalendarServices.SetWorkDayTime(TimeSpan workStart, TimeSpan workEnd, TimeSpan dinnerStart, TimeSpan dinnerEnd) (Do not use)

Void PublicAPI.Services.ProductionCalendarServices.SetWorkDayTime(TimeSpan workStart, TimeSpan workEnd) (Do not use)

Void PublicAPI.Services.ProductionCalendarServices.SetWorkDayTime(TimeSpan workStart) (Do not use)

The interface EleWise.ELMA.Web.Mvc.UI.INotifier is now inherited from EleWise.ELMA.Model.Views.IFormNotifier.

The following methods were deleted from the interface INotifier and moved to IFormNotifier: