Особенности создания объектов в сценариях

Примечание
Перед началом работы со сценариями рекомендуется ознакомиться со стандартами написания программного кода на языке C#.

Создание объектов в сценариях довольно частая операция, и необходимо понимать ее особенности.

Возможны 2 способа создания объекта в сценарии:

  1. Через специальные методы инициализации объекта.
  2. Через конструктор объекта напрямую.

Рассмотрим каждый вариант отдельно и разъясним, как же все-таки правильно создавать объекты в сценарии.

Использование специальных методов инициализации объекта

Пример использования этих методов приведен ниже:

C# Code
public void SozdanieNovihObjektov(Context context)
{
    //Использование класса InterfaceActivator
    var newContragent = EleWise.ELMA.Model.Services.InterfaceActivator.Create<ContractorLegal>();
    newContragent.Name = "Контрагент 1";
    
    //Использование метода менеджера Create
    var newContragent2 = EntityManager<ContractorLegal>.Create();
    newContragent2.Name = "Контрагент 2";
    
    //Использование метода менеджера Create
    var newContragent3 = EntityManager<ContractorLegal>.Instance.Create();
    newContragent3.Name = "Контрагент 3";
    
    //Использование класса синтаксис-помошника InstanceOf
    var newContragent4 = new EleWise.ELMA.Services.InstanceOf<ContractorLegal>()
    {
        New = {
            Name = "Контрагент 4"
        }
    }.New;

    //Использование метода PublicAPI Create
    var newContragent5 = PublicAPI.CRM.Contractor.ContractorLegal.Create();
    newContragent5.Name = "Контрагент 5";

 }

Теперь рассмотрим эти методы поближе.

Использование класса InterfaceActivator

Этот класс очень полезен во многих случаях: он позволяет разработчикам модулей создавать и использовать объекты в коде без привязки к конфигурации (по сути в коде модулей чаще всего используются интерфейсы расширений, а не классы объектов). Этот метод создает новый объект в памяти приложения и проводит его инициализацию при помощи различных точек расширения. Этот метод лежит в основе всех остальных, и его вызов является обязательным, если вы пишете модуль системы.

Использование метода менеджера Create

Следующие два объекта в примере создаются при помощи метода Create из менеджера объекта. Первый вариант - облегченный (укороченный) вызов второго варианта, т.е. фактической разницы между ними нет. Отличие этого метода от вызова метода класса InterfaceActivator в том, что метод менеджера может быть переопределен в самом менеджере объекта. Это точно может знать только разработчик объекта (если это системный объект, а не пользовательский справочник).

Использование класса InstanceOf

Этот метод больше служит для удобства разработчиков модулей, внутри он делает перевызов метода Create из класса InterfaceActivator. Использование этого класса просто облегчает в некоторых местах написание кода для разработчиков модулей.

Использование конструктора объектов

Данный метод используется как традиционный для создания объектов в платформе .NET

C# Code
public void SozdanieObjektov(Context context)
{
    var newContragent = new ContractorLegal();
    newContragent.Name = "Контрагент новый";
}

Т.е. имея класс объекта ContractorLegal мы просто создаем новый объект этого класса через оператор new.

Различия подходов

В обоих случаях, в сценарии создается объект системы, но он хранится только в памяти. Для сохранения в базу необходимо обязательно вызвать метод Save у самого объекта или у его менеджера (что по факту одно и то же).

Однако, если этот объект новый, как и есть в нашем случае, то при вызове метода Save происходит следующее:

  1. Делается вставка этого объекта в таблицу БД для того, чтобы получить очередной идентификатор.
  2. Полученный идентификатор присваивается в поле Id у нового объекта.
  3. После успешного завершения сценария эти данные фиксируются в базе (подтверждается транзакция БД).

Вот тут мы и должны понять разницу между этими двумя подходами, допустим у нас есть объект Запрос (Zapros) и у него поле Номер (Nomer) – пусть этот объект из дополнительного модуля и на поле Номер разработчики добавили проверку уникальности в базе данных. Но для инициализации этого поля разработчик обязан прописать в методе Create менеджера этого объекта логику, присваивающую этому полю уникальное значение.

И теперь, представим, что в сценариях вы попытаетесь создать такой объект через оператор new и сохранить, поскольку разработчик никак не может повлиять на стандартную инициализацию объекта через new, при попытке сохранить объект будет выдана ошибка уникального ключа в БД. Если же создавать такой объект через метод менеджера Create, то все будет в порядке, так как сам разработчик знает что инициализация объектов проходит этот метод.

Всегда используйте метод менеджера Create
При вызове метода менеджера Create всегда происходит наиболее полная, с точки зрения создания нового объекта, инициализация его свойств. Таким образом при вызове метода Save у вас никогда не возникнет проблем с целостностью БД.

Обработчики свойств объектов

Эту разницу особенно можно увидеть при использовании обработчиков свойств в объектах.

При создании объекта через new настроенные обработчики не будут применены, что может повлиять на логику сценария в целом.