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

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

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

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

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

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

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

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

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

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

 }

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

Использование класса InterfaceActivator (пример 1)

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

Использование метода менеджера Create (примеры 2-3)

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

Использование класса InstanceOf (пример 4)

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

Использование метода PublicAPI Create (пример 5)

Методы PublicAPI по созданию различных сущностей через Create() реализованы через соответствующие методы менеджеров объектов, поэтому их применение аналогично использованию метода менеджера Create().

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

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

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 у вас никогда не возникнет проблем с целостностью БД.

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

Рис. 1. Настройка свойства объекта. Добавление обработчика свойства.

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