...

Глава 2. Контекст

Тема в разделе "Руководство по настройке форм и сценариев", создана пользователем ELMA365, 3 май 2023.

  1. ELMA365

    ELMA365 Moderator

    Знакомство с разработкой мы начнём с разбора такого понятия, как контекст. Его можно понимать и более широко, но в рамках ELMA365 этот термин означает набор свойств, которые определены вокруг некой сущности и определяют эту сущность. Для разработчиков самой близкой аналогией является класс с описанием свойств (но не методов), для аналитиков — таблица или список свойств с указанием типа.

    [​IMG]

    Чтобы изменить данные сущности, нужно изменить её контекст:
    Код:
    
    Context.data.description 'Дговор автокредитования';
    
    
    В данной книге мы рассмотрим глобальный контекст, контекст приложения, контекст формы и контекст виджета. У каждого типа контекста своё предназначение, и это нужно учитывать при разработке собственных решений.

    Глобальный контекст

    Глобальный контекст даёт доступ ко всем объектам конфигурации — приложениям, процессам, организационной структуре.
    Чтобы получить доступ к глобальному контексту, необходимо включить соответствующую опцию. Например, если вы работаете с формой, в дизайнере интерфейсов перейдите на вкладку Настройки. В группе Доступные элементы установите флажок напротив опции Разрешить использование всех элементов:

    [​IMG]

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

    Все разделы системы содержатся в объекте Global в поле ns. Например, если в разделе с кодом store создать приложение с кодом orders, то его описание можно получить как Global.ns.store.app.orders:
    Код:
    
    const clientOrders await Global.ns.store.app.orders.search()
        .
    where(=> f.client.eq(Context.data.client))
        .
    all();
    Подробнее про работу с приложениями можно узнать в статье TS SDK «Работа с приложениями».

    Константа Global всегда доступна в процессах, созданных на уровне компании. В процессах, которые находятся в разделах и приложениях, необходимо вручную разрешить доступ к этой константе. Это можно сделать в дизайнере бизнес-процессов на вкладке Сценарии, нажав Настройки на панели инструментов.

    Мы настоятельно рекомендуем насколько возможно избегать работы с глобальным контекстом. Его использование нарушает изоляцию вашего приложения и устанавливает зависимость от большого количества факторов.

    Пример 1. Параллельная разработка нескольких разделов или приложений.
    Предположим, вы разрабатываете собственное решение Отпуска и параллельно с этим дорабатываете формы в разделе CRM. При этом в приложении Отпуск вы разрешили доступ к константе Global. В этом случае вы сможете выгрузить решение с тестового окружения на рабочее только после того, как все доработки в разделе CRM также будут завершены и протестированы.

    Пример 2. Организационная структура.
    При завязке прав доступа на организационную структуру придётся очень тщательно следить за тем, чтобы в тестовом и рабочем окружении была одинаковая иерархия подразделений, а должности пользователей не менялись. Также необходимо постоянно сверять устаревшие и удалённые должности и отделы.

    Контекст приложения

    Контекст приложения — это набор полей приложения, который хранится в базе данных. Для каждой сущности он уникален, хотя есть набор системных полей, общих для всех приложений (Дата создания, Автор, Дата изменения и т. д.). Такие свойства нельзя удалить, но их можно неограниченно использовать в своих сценариях.

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

    Для ускорения поиска можно включить для нужных полей опцию Поиск и сортировка по полю. При проставлении данного признака в соответствующей таблице базы данных создаётся индекс для выбранного поля. Однако будьте осторожны: большое количество индексов может, наоборот, ухудшить производительность.

    Контекст формы

    В контексте формы рекомендуется определять свойства, которые используются для визуальной настройки. Например, свойства, которые позволяют скрыть или показать модальное окно, добавить или убрать обязательность ввода данных. Кроме того, сюда добавляются вычисляемые поля.

    Контекст формы уже не хранится в базе данных — он создается при открытии формы и существует только пока она открыта. Форма всегда привязана к определенному приложению, и на форме мы можем использовать два типа контекста — контекст самой формы ViewContext и контекст приложения Context.

    Пример 1. В контексте приложения хранится дата рождения, а в контексте формы вычисляется количество полных лет:
    Код:
    
    ViewContext.data.years = (new Datetime()).sub(Context.data.birth_date!).days 365;
    
    
    Пример 2. В контексте приложения хранится компания, а в контексте формы можно получить актуальный набор контактов для неё из приложения Контакты:
    Код:
    
    if (Context.data.company) {
        
    ViewContext.data.contact await ViewContext.fields.contact.app.search()
            .
    where(item => item._companies.link(Context.data.company!))
            .
    size(100)
            .
    all();
    }
    Контекст виджета (входные и выходные параметры)

    Виджет по своей структуре похож на форму, но изолирован от контекста приложения и является по своей сути минимальным рабочим компонентом для построения интерфейсов. Контекст виджета не определяется приложением — он задается извне или может не задаваться вообще. При проектировании виджета разделяйте переменные на входные и выходные: чётко определяйте, что виджет принимает в качестве входных данных, какие переменные он может изменять, а какие переменные нужны только для использования внутри виджета и должны быть скрыты от пользователя.

    Контекстные переменные виджета можно связывать с контекстом формы или контекстом приложения.
    В качестве примера создадим виджет для настроенного в предыдущей книге приложения Отпуск. Виджет должен вычислять количество рабочих дней за период исходя из настроек рабочего календаря.

    Чтобы создать виджет, откройте раздел Отпуска и нажмите на значок шестерёнки рядом с его названием. Выберите пункт Интерфейсы. На открывшейся странице в правом верхнем углу нажмите +Создать и выберите Виджет. Наш виджет будет называться days_count. Подробнее о создании виджетов читайте в статье справки «Создание интерфейсов».
    Перейдём к настройке виджета. Сначала определим его контекст.

    Для работы виджета нужны две даты — начало периода и конец периода. Выберем для этих переменных тип Дата/время, опцию Дата. Это будут входные переменные виджета.

    Для вывода результата понадобится переменная типа Число, в которую будет записываться количество рабочих дней. Укажем, что число может быть дробным, так как в рабочем календаре можно указать укороченные рабочие дни. Это будет выходная переменная виджета.

    Добавим данные свойства на вкладке Контекст дизайнера интерфейсов и отметим, какие из них будут входными и выходными:

    [​IMG]
    Подробнее о настройке контекстных переменных читайте в статье справки «Настроить контекст пользовательского виджета».

    Контекстные переменные виджета готовы. Далее необходимо выполнить настройку отображения данных. Её мы разберём в следующей главе.

    Связь между контекстами


    Рассмотрим разные типы контекста и их связь на примере приложения Отпуск:

    [​IMG]

    Жёлтым цветом выделены свойства из контекста приложения: Дата начала, Дата окончания, Продолжительность и Согласующий.

    У приложения есть три формы: форма создания, форма просмотра и форма редактирования. При настройке любой из этих форм вам доступны свойства из контекста приложения, к которому она привязана, а также переменные из её собственного контекста. Например, в контекст формы создания мы добавили свойство workminutes — оно не является свойством приложения.

    На форме создания расположен отдельный виджет days_count. У него также есть контекст, но «встроенной» привязки к приложению у него уже нет. Свойства необходимо явным образом связать.

    Рекомендации

    При формировании контекста давайте переменным имена на английском. Это позволяет работать в коде с правильными именами, а не с названиями, написанными транслитом:

    Код:
    
    // Плохо
    Context.data.sposob_oplaty
    // Хорошо
    Context.data.payment_type
    При этом вы всегда можете изменить Отображаемое имя свойства:

    [​IMG]
    Последнее редактирование: 21 авг 2023