Деталь

PDF
Основы

Деталь — элемент интерфейса на странице записи, который отображает записи определенного объекта. Как правило, это записи, связанные с текущей записью. Например, на странице контакта детали используются для хранения информации о связанных с ним активностях, адресах, документах, и т. д. Большинство деталей имеют собственный реестр. Отдельные детали, например, Средства связи, отображаются не в виде реестра. Визуально деталь отличается от группы полей наличием панели инструментов для управления данными (добавления и изменения записей, сортировки, фильтрации, настройки детали и других действий).

Детали предназначены для отображения дополнительных данных для основного объекта раздела. Детали раздела отображаются во вкладках страницы редактирования раздела в контейнере вкладок.

В зависимости от метода ввода и отображения данных, различают следующие типы деталей:

  • Деталь с полями редактирования — данные вводятся и редактируются непосредственно в полях данных, размещенных в детали. При необходимости в деталь можно добавить новое поле (1). Примером такой детали может служить деталь Средства связи.

    Деталь с полями — деталь, которая может включать несколько групп полей редактирования. Базовая деталь с полями реализована в схеме BaseFieldsDetail пакета BaseFinance, доступного в банковских продуктах Creatio — Financial Services Creatio sales edition, customer journey edition и lending edition. Модель представления записи детали реализована в схеме BaseFieldRowViewModel.

    Базовая деталь с полями редактирования позволяет выполнять следующие действия:

    • Добавлять записи на деталь без сохранения страницы, на которой эта деталь размещена.
    • Работать с деталью как со страницей записи.
    • Использовать базовую валидацию полей с возможностью добавления пользовательской.
    • Добавлять виртуальную запись.
    • Расширять логику поведения записей.

    На основе базовой детали с полями редактирования может быть создана пользовательская деталь. Для этого при создании схемы пользовательской детали следует унаследовать ее от схемы базовой детали.

  • Деталь со страницей добавления — данные вводятся и редактируются на странице детали. К этому типу относится, например, деталь Адреса контакта, данные каждого адреса которой вводятся и редактируются на странице Адрес контакта.

    Деталь со страницей добавления является стандартной деталью приложения Creatio и может быть добавлена в раздел при помощи мастера детали и мастера разделов.

    Общая последовательность действий для добавления детали со страницей добавления в существующий раздел системы:

    1. Создать схему объекта детали.
    2. Создать схему модели представления реестра детали и схему модели представления страницы детали с помощью мастера детали.
    3. Разместить деталь на странице записи раздела с помощью мастера раздела.

    Ниже будет рассмотрен способ добавления детали со страницей добавления без использования мастера деталей.

    Для добавления пользовательской детали со страницей добавления в существующий раздел необходимо:

    1. Создать схему объекта детали.
    2. Создать схему реестра детали.
    3. Создать схему страницы записи детали.
    4. Выполнить настройку детали в схеме замещающей модели представления страницы раздела.
    5. Зарегистрировать связи между схемами объекта, реестра детали и страницы записи детали при помощи специальных SQL-запросов в системные таблицы.
    6. Выполнить настройку полей детали.

    Важно.

    Чтобы связать пользовательские схемы создаваемой детали, необходимо внести изменения в системные таблицы [SysModuleEdit], [SysModulentity] и [SysDetail] базы данных Creatio при помощи SQL-запросов.

    Однако при составлении и выполнении SQL-запроса к базе данных следует быть предельно внимательным. Выполнение неправильно составленного SQL-запроса может привести к повреждению существующих данных и нарушению работы системы.

  • Деталь с редактируемым реестром — данные отображаются в списочном виде, вводятся и редактируются непосредственно в реестре. Примером служит деталь Продукт в заказе.

    Поскольку деталь с редактируемым реестром не является стандартной деталью приложения Creatio, то она не может быть добавлена в раздел при помощи мастера деталей.

    Для добавления пользовательской детали с редактируемым реестром в существующий раздел необходимо:

    1. Создать схему объекта детали.
    2. Создать и сконфигурировать схему детали.
    3. Выполнить настройку детали в схеме замещающей модели представления страницы раздела.
    4. Выполнить настройку полей детали.
  • Деталь с выбором из справочника — данные детали выбираются из справочника, который отображается в модальном окне. Например, для детали Продукт в лиде отображаемые данные выбираются из справочника в модальном диалоговом окне Выбор: Продукт.

    Деталь Продукт в лиде с выбором из данных из справочника
    Выбор продуктов из справочника детали Продукт в лиде

    Поскольку деталь с выбором из справочника не является стандартной деталью приложения Creatio, то для ее добавления в раздел не достаточно использования мастера деталей. Ниже будет рассмотрен способ добавления этой детали на страницу записи раздела.

    Для добавления пользовательской детали с выбором из справочника в существующий раздел необходимо:

    1. Создать схему объекта детали.
    2. Создать деталь с помощью мастера деталей и добавить ее в раздел.
    3. Сконфигурировать схему детали.
    4. Выполнить настройку полей детали.

Каждой детали соответствует схема бизнес-объекта, связанная с объектом текущего раздела. Так, детали Адреса Контакта соответствует схема объекта Адрес контакта (ContactAddress) пакета Base. Связь с объектом раздела выполняется по обязательной колонке Контакт объекта детали.

Состав, расположение и поведение элементов пользовательского интерфеса детали конфигурируется схемой детали. Так, например, деталь Адреса Контакта конфигурируется схемой Деталь адресов контакта (ContactAddressDetailV2) , наследующей схему Базовая схема детали с реестром (BaseAddressDetailV2) пакета UIv2. Схемы деталей приложения унаследованы от базовой схемы детали с реестром (BaseGridDetailV2) и базовой схемы детали (BaseDetailV2) пакета NUI.

Страница детали конфигурируется схемой страницы записи. Например, свойства страницы детали Адреса Контакта задаются схемой Страница адреса контакта (ContactAddressPageV2), которая унаследована от Базовой страницы адреса (BaseAddressPageV2) пакета UIv2.

Деталь Файлы и ссылки (Attachments) предназначена для хранения файлов и ссылок на web-ресурсы и статьи базы знаний, связанные с записью раздела. Деталь доступна во всех разделах Creatio (см. "Файлы и примечания"). Основная функциональность детали реализована в схеме FileDetailV2 пакета UIv2.

Важно. Порядок добавления детали Файлы и ссылки (Attachments), который описан в статье, актуален для версии приложения 7.12.0 или ниже. 

Чтобы добавить деталь на страницу записи раздела, необходимо выполнить следующие шаги:

1. С помощью мастера деталей создать обычную деталь, используя схему объекта раздела Название объекта разделаFile (см. статью "Создать новый раздел").

2. Изменить родительский объект для схемы модуля реестра детали.

3. С помощью мастера разделов добавить деталь на страницу записи.

4. Выполнить дополнительную настройку детали.

Деталь Файлы и ссылки (Attachments) предназначена для хранения файлов и ссылок на web-ресурсы и статьи базы знаний, связанные с записью раздела. Деталь доступна во всех разделах Creatio (см. статью "Файлы и примечания"). Основная функциональность детали реализована в схеме FileDetailV2 пакета UIv2.

По умолчанию деталь Файлы и ссылки (Attachments) настроена так, что в ее списочном представлении отображаются только колонки Название (Name) и Версия (Version). Также на странице добавления новой ссылки доступна колонка Описание (Description) (рис. 1). Но в реестре детали она не отображается.

Рис. 1. — Отображение поля Описание (Description) на странице добавления

На заметку.

В плиточном представлении детали Файлы и ссылки (Attachments) всегда отображается только колонка Название (Name) и ссылка или файл.

Настройку реестра детали удобно выполнять с помощью функциональности настройки колонок реестра. Однако для детали Файлы и ссылки (Attachments) эта функциональность по умолчанию отключена.

Чтобы добавить функциональность настройки колонок реестра детали, необходимо выполнить следующие действия:

  • В пользовательском пакете создать схему замещающей модели представления детали FileDetailV2.
  • В схеме замещающей модели представления реализовать вызов метода открытия страницы настройки колонок реестра.

Множественное добавление записей на деталь 

Обычно деталь позволяет добавлять только одну запись. С помощью миксина LookupMultiAddMixin можно осуществлять множественное добавление записей на деталь.

Миксин LookupMultiAddMixin предназначен для расширения схем деталей. Он позволяет расширить действие добавления записи на деталь, предоставляя пользователю возможность выбирать несколько записей из справочника одновременно.

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

1. Создать схему замещающей модели представления детали.

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

Удалить деталь 

Чтобы удалить пользовательскую деталь Creatio, необходимо иметь доступ к конфигурации системы и базе данных.

Важно. Прежде чем удалить пользовательскую деталь, необходимо снять блокировку с соответствующих этой детали файлов в хранилище версий SVN.

В первую очередь потребуется удалить записи из базы данных. Для удаления детали воспользуйтесь следующим скриптом:

DECLARE @Caption nvarchar(max);
SET @Caption = 'ToDelete';
DECLARE @UId UNIQUEIDENTIFIER;
select @UId = EntitySchemaUId from SysDetail
where Caption = @Caption
delete from SysDetail where EntitySchemaUId = @UId

Значение “ToDelete” необходимо заменить на название схемы детали, которое можно посмотреть в разделе Управление конфигурацией (Advanced settings) дизайнера системы. После удаления данных из БД нужно удалить схему пользовательской детали при помощи конфигурации системы. Пункт дизайнера системы Управление конфигурацией (Advanced settings) также позволяет удалить объект, на котором основывается данная деталь.

Создать деталь с помощью мастера
Средний

Описание кейса 

Создать пользовательскую деталь Удостоверение личности для раздела Контакты. Деталь должна отображать серию и номер удостоверения личности контакта. Один контакт может иметь несколько удостоверений личности.

Алгоритм реализации кейса 

1. Создание схемы объекта детали 

Процесс создания схемы объекта подробно описан в статье "Cоздать схему объекта".

Исходя из условий кейса, необходимо создать схему объекта со следующими значениями свойств:

  • Заголовок (Title) — "Удостоверение личности контакта" ("Contact Identity Card").
  • Название (Name) — "UsrContactIdentityCard".
  • Пакет (Package)— "Custom" или любой пользовательский пакет.
  • Родительский объект (Parent object) — "Базовый объект" ("Base object") пакета Base.

В созданную схему объекта нужно добавить три колонки, описание которых приведено в таблице 1.

Табл. 1. — Свойства колонок схемы объекта детали
Заголовок (Title) Название (Name) Тип (Data type) Справочник (Lookup)
Серия (Series) UsrSeries

Строка (50 символов)

(Text (50 characters))

-
Номер (Number) UsrNumber

Строка (50 символов)

(Text (50 characters))

-
Контакт (Contact) UsrContact

Справочник (Lookup)

Контакт (Contact)

После внесения изменений схему требуется опубликовать.

На заметку.

Колонки можно добавить, используя мастер деталей.

2. Создание схемы клиентского модуля реестра детали и схемы страницы детали с помощью мастера деталей 

Важно.

Если необходимо вести разработку в пользовательском пакете, то нужно удостовериться в том, что он указан в системной настройке Текущий пакет (Current package). В противном случае мастер деталей не сможет сохранить свои изменения в пакет, в котором выполняется разработка.

Чтобы создать новую деталь при помощи мастера, необходимо в дизайнере системы в группе Настройка системы (System setup) перейти по ссылке Мастер деталей (Detail wizard).

На шаге ДЕТАЛЬ (DETAIL) мастера необходимо указать заголовок детали и выбрать основной объект детали (рис. 1).

Рис. 1. — Шаг ДЕТАЛЬ (DETAIL) мастера детали

На шаге СТРАНИЦА (PAGE) мастера нужно разместить колонки детали в требуемом порядке (рис. 2).

Рис. 2. — Шаг СТРАНИЦА (PAGE) мастера детали

После настройки страницы, деталь необходимо сохранить.

В результате работы мастера в пользовательском пакете будут созданы схема клиентского модуля реестра детали и схема страницы детали.

3. Разместить деталь на странице записи раздела с помощью мастера раздела 

Для этого необходимо открыть мастер в разделе Контакты и на шаге СТРАНИЦА (PAGE) нажать на кнопку НОВАЯ ДЕТАЛЬ (NEW DETAIL). В появившемся диалоговом окне нужно выбрать созданную деталь Удостоверение личности контакта и настроить связь между колонками объекта детали и объекта раздела (рис. 3).

Рис. 3. — Настройка свойств детали

Деталь отобразится в конструкторе страницы записи раздела (рис. 4).

Рис. 4. — Отображение детали в конструкторе страницы записи раздела

После настройки страницы записи раздела изменения необходимо сохранить.

В результате работы мастера разделов в пользовательском пакете будут созданы схема замещающего объекта страницы раздела и схема замещающей модели представления страницы записи раздела.

После обновления страницы браузера деталь появится на странице записи (рис. 5).

Рис. 5. — Результат выполнения кейса

Важно.

Чтобы на детали отобразились колонки, необходимо выполнить их настройку с помощью меню детали. Также необходимо добавить нужное количество записей (рис. 6).

Рис. 6. — Добавление записи на деталь
Создать деталь с полями
Сложный

Описание кейса 

Реализовать пользовательскую деталь с полями для регистрации документов. На деталь должны добавляться записи с полями Номер(Number) и Серия(Series) документа. Деталь разместить на вкладке История(History) страницы контакта (физ. лица).

Алгоритм реализации кейса 

1. Создать схему объекта детали 

Для этого необходимо в пользовательском пакете создать новую схему объекта со следующими значениями свойств (рис. 1):

  • [Заголовок] ([Title]) — "Регистрационный документ" ("Registration document").
  • [Название] ([Name]) — "UsrRegDocument".
  • [Пакет] ([Package]) — пакет, в котором схема объекта будет размещена после публикации. По умолчанию содержит название пакета, выбранного перед созданием схемы. Значение может быть изменено на любое из выпадающего списка.
  • [Родительский объект] ([Parent object]) — "Базовый объект" ("Base object"), реализованный в пакете Base.
Рис. 1. — Свойства схемы объекта детали с полями

В структуру объекта необходимо добавить три колонки, свойства которых приведены в таблице 1. Как добавить колонку в схему объекта подробно описано в статье "Cоздать схему объекта".

Табл. 1. — Свойства колонок схемы объекта детали UsrRegDocument
Заголовок (Title) Название (Name) Тип данных (Data Type)
Контакт (Contact) UsrContact Справочник (Lookup)
Серия (Series) UsrSeries Строка (50 символов) (Text (50 characters))
Номер (Number) UsrNumber Целое (Integer)

Для применения изменений схему необходимо опубликовать.

2. Создать схему модели представления пользовательской детали с полями 

Для этого необходимо в пользовательском пакете добавить клиентскую схему Схема модели представления детали с полями (Schema of the Detail View Model with Fields) (рис. 2).

Рис. 2. — Добавление клиентской схемы модели представления детали с полями

Для созданной схемы необходимо установить следующие значения свойств (рис. 3):

  • [Заголовок] ([Title]) — "Регистрационные документы" ("Registration documents").
  • [Название] ([Name]) — "UsrRegDocumentFieldsDetail".
  • [Пакет] ([Package]) — пакет, в котором схема объекта будет размещена после публикации. По умолчанию содержит название пакета, выбранного перед созданием схемы. Значение может быть изменено любым из выпадающего списка.
  • [Родительский объект] ([Parent object]) — "Базовая деталь с полями" ("Base fields detail"), реализованная в пакете BaseFinance.
Рис. 3. — Свойства клиентской схемы UsrRegDocumentFieldsDetail

Свойству Значение (Value) локализуемой строки Caption необходимо присвоить значение "Регистрационные документы" ("Registration documents") (рис. 4).

Рис. 4. — Свойства локализуемой строки

В исходном коде схемы необходимо создать описание модуля и переопределить в нем базовый метод getDisplayColumns(), возвращающий массив с названиями колонок, отображающихся как поля в детали. По умолчанию этот метод возвращает все обязательные колонки и колонку, которая отмечена признаком Отображаемое значение в схеме объекта.

Исходный код схемы:

define("UsrRegDocumentFieldsDetail", [],
    function() {
        return {
            entitySchemaName: "UsrRegDocument",
            diff: /**SCHEMA_DIFF*/ [], /**SCHEMA_DIFF*/
            methods: {
                getDisplayColumns: function() {
                    return ["UsrSeries", "UsrNumber"];
                }
            }
        };
    });

Для применения изменений схему необходимо сохранить.

3. Создать схему замещающей модели представления страницы записи, на которой будет размещена созданная деталь 

Для этого необходимо создать схему замещающей модели представления страницы контакта (ContactPageV2). Основные свойства замещающей схемы (рис. 5):

  • [Заголовок] ([Title]) — "Схема отображения карточки физ. лица" ("Display schema - Contact card").
  • [Название] ([Name]) — "ContactPageV2".
  • [Пакет] ([Package]) — пакет, в котором схема объекта будет размещена после публикации. По умолчанию содержит название пакета, выбранного перед созданием схемы. Значение может быть изменено любым из выпадающего списка.
  • [Родительский объект] ([Parent object]) — "Схема отображения карточки физ. лица" ("Display schema - Contact card"), реализованная в пакете UIv2.
Рис. 5. — Свойства схемы замещающей модели представления ContactPageV2

В исходном коде схемы необходимо:

Исходный код схемы замещающей модели представления:

define("ContactPageV2", [], function() {
    return {
        entitySchemaName: "Contact",
        details: /**SCHEMA_DETAILS*/ {
            // Добавление детали с полями.
            "UsrRegDocumentFieldsDetail": {
                // Название клиентской схемы детали.
                "schemaName": "UsrRegDocumentFieldsDetail",
                // Фильтрация записей детали текущего контакта (физ. лица).
                "filter": {
                    // Колонка объекта детали.
                    "detailColumn": "UsrContact",
                    // Колонка идентификатора контакта.
                    "masterColumn": "Id"
                }
            }
        } /**SCHEMA_DETAILS*/ ,
        diff: /**SCHEMA_DIFF*/ [{
            // Добавление нового элемента.
            "operation": "insert",
            // Название элемента.
            "name": "UsrRegDocumentFieldsDetail",
            // Конфигурационный объект значений.
            "values": {
                // Тип элемента.
                "itemType": Terrasoft.ViewItemType.DETAIL
            },
            // Имя элемента-контейнера.
            "parentName": "HistoryTab",
            // Имя свойства элемента-контейнера, 
            // содержащего коллекцию вложенных элементов.
            "propertyName": "items",
            // Индекс добавляемого в коллекцию элемента.
            "index": 0
        }] /**SCHEMA_DIFF*/
    };
});

Для применения изменений схему необходимо сохранить.

В результате выполнения кейса на вкладке История(History) страницы контакта (физ. лица) появится пользовательская деталь с полями Регистрационные документы (Registration documents) (рис. 6).

Рис. 6. — Результат выполнения кейса

Важно.

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

Расширить настройки детали с полями
Сложный

Добавление пользовательских стилей 

Описание кейса 

Для детали, реализованной в кейсе статьи "Создание детали с полями", переопределить стиль отображения подписей полей, установив для них синий цвет.

На заметку.

Переопределить базовые CSS-классы стилей отображения записей деталей можно с помощью методов getLeftRowContainerWrapClass() и getRightRowContainerWrapClass().

Алгоритм реализации кейса 

1. Создать схему модуля, в которой определить стили отображения записей 

Важно.

В схеме модели представления страницы детали задать стили для отображения нельзя. Поэтому необходимо создать новую схему модуля, определить в ней необходимые стили и добавить этот модуль в зависимости модуля детали.

Для этого необходимо в пользовательском пакете создать новую схему модуля со следующими значениями свойств (рис. 1):

  • [Заголовок] ([Title]) — "UsrRegDocumentRowViewModel".
  • [Название] ([Name]) — "UsrRegDocumentRowViewModel".
  • [Пакет] ([Package]) — пакет, в котором схема будет размещена после публикации. По умолчанию содержит название пакета, выбранного перед созданием схемы. Значение может быть изменено на любое из выпадающего списка.
Рис. 1. — Свойства клиентской схемы UsrRegDocumentRowViewModel

В исходном коде схемы необходимо создать описание модуля и определить в нем класс Terrasoft.configuration.UsrRegDocumentRowViewModel, унаследованный от Terrasoft.configuration.BaseFieldRowViewModel.

Исходный код схемы модуля:

define("UsrRegDocumentRowViewModel", ["BaseFieldRowViewModel"], function() {
    Ext.define("Terrasoft.configuration.UsrRegDocumentRowViewModel", {
        extend: "Terrasoft.BaseFieldRowViewModel",
        alternateClassName: "Terrasoft.UsrRegDocumentRowViewModel"
    });
    return Terrasoft.UsrRegDocumentRowViewModel;
});

Для корректного отображения записей детали необходимо определить CSS-классы, используемые для отображения. Для этого на вкладке LESS дизайнера модуля необходимо добавить следующие CSS-классы:

.reg-document-left-row-container {
    .t-label {
        color: blue;
    }
}
.field-detail-row {
    width: 100;
    display: inline-flex;
    margin-bottom: 10px;

    .field-detail-row-left {
        display: flex;
        flex-wrap: wrap;
        width;
        
        .control-width-15 {
            min-width: 300px;
            width: 50;
            margin-bottom: 5px;
        }
        .control-width-15:only-child {
            width !important;
        }
    }
    .field-detail-row-left.singlecolumn {
        width: 50%;
    }
}

Для применения изменений схему необходимо сохранить.

2. Модифицировать схему модели представления детали 

Чтобы использовать созданный модуль и его стили в схеме детали, необходимо добавить его в зависимости модуля, определенного в схеме детали.

Также в определение модуля схемы детали нужно добавить два метода:

  • getRowViewModelClassName() — возвращает имя класса модели представления записи на детали.
  • getLeftRowContainerWrapClass() — возвращает массив строк с названиями CSS-классов, используемых для генерации представления контейнеров, содержащих подписи полей записей.

Исходный код модифицированной схемы:

define("UsrRegDocumentFieldsDetail", ["UsrRegDocumentRowViewModel", "css!UsrRegDocumentRowViewModel"],
    function() {
        return {
            entitySchemaName: "UsrRegDocument",
            diff: /**SCHEMA_DIFF*/ [], /**SCHEMA_DIFF*/
            methods: {
                getDisplayColumns: function() {
                    return ["UsrSeries", "UsrNumber"];
                },
                getRowViewModelClassName: function() {
                    return "Terrasoft.UsrRegDocumentRowViewModel";
                },
                getLeftRowContainerWrapClass: function() {
                    return ["reg-document-left-row-container", "field-detail-row"];
                }
            }
        };
    });

Для применения изменений схему необходимо сохранить.

В результате выполнения кейса на вкладке История (History) страницы контакта (физ. лица) названия полей детали будут отображаться синим цветом (рис. 2).

Рис. 2. — Результат выполнения кейса

Добавление дополнительной пользовательской логики для записей детали 

Описание кейса 

Для детали, реализованной в кейсе статьи "Создание детали с полями" и модифицированной в предыдущем кейсе, добавить валидацию поля Номер(Number). Значение, введенное в поле, не должно быть отрицательным.

Алгоритм реализации кейса 

1. Добавить локализуемую строку с сообщением о неверном значении номера 

Для этого необходимо в схеме UsrRegDocumentRowViewModel, открытой в дизайнере модуля, на вкладке Структура (Structure) добавить локализуемую строку со

следующими значениями свойств (рис. 3):

  • [Название] ([Name]) — "NumberMustBeGreaterThenZeroMessage".
  • [Значение] ([Value]) — "Number must be greater thаn zero!".
Рис. 3. — Результат выполнения кейса

На заметку.

Поскольку локализуемая строка является ресурсом схемы, для того чтобы ее значение появилось в клиентской части приложения, в зависимости модуля UsrRegDocumentRowViewModel необходимо добавить модуль ресурсов UsrRegDocumentRowViewModelResources.

Для применения изменений схему необходимо сохранить.

2. Добавить программную логику валидации 

Для реализации программной логики валидации значения поля в модуль UsrRegDocumentRowViewModel необходимо добавить три метода:

  • validateNumberMoreThenZero() — содержит логику валидации значения поля.
  • setValidationConfig() — связывает колонку [Number] и метод-валидатор validateNumberMoreThenZero().
  • init() — переопределенный базовый метод, в котором выполняется вызов базовой логики и метода setValidationConfig().

Исходный код модифицированной схемы:

define("UsrRegDocumentRowViewModel", ["UsrRegDocumentRowViewModelResources", "BaseFieldRowViewModel"],
    function(resources) {
        Ext.define("Terrasoft.configuration.UsrRegDocumentRowViewModel", {
            extend: "Terrasoft.BaseFieldRowViewModel",
            alternateClassName: "Terrasoft.UsrRegDocumentRowViewModel",
            validateNumberMoreThenZero: function(columnValue) {
                var invalidMessage;
                if (columnValue < 0) {
                    invalidMessage = resources.localizableStrings.NumberMustBeGreaterThanZeroMessage;
                }
                return {
                    fullInvalidMessage: invalidMessage,
                    invalidMessage: invalidMessage
                };
            },
            setValidationConfig: function() {
                this.addColumnValidator("UsrNumber", this.validateNumberMoreThenZero);
            },
            init: function() {
                this.callParent(arguments);
                this.setValidationConfig();
            }
        });
        return Terrasoft.UsrRegDocumentRowViewModel;
    });

Для применения изменений схему необходимо сохранить.

В результате выполнения кейса на вкладке История(History) страницы контакта (физ. лица) при вводе отрицательного значения в поле Номер(Number) будет выведено соответствующее предупреждение (рис. 4).

Рис. 4. — Результат выполнения кейса

Возможность добавления виртуальной записи 

Виртуальная запись позволяет отображать блок полей редактирования сразу же при загрузке детали, не нажимая на кнопку добавления. При этом, если ни одно поле не было заполнено, то во время сохранения страницы, на которой размещена деталь, запись в базу данных произведена не будет.

Для активации данной возможности необходимо в схеме детали UsrRegDocumentFieldsDetail определить метод useVirtualRecord(), возвращающий значение true

useVirtualRecord: function() {
return true;
}

В результате при открытии вкладки с деталью будет отображена виртуальная запись (рис. 5).

Рис. 5. — Отображение виртуальной записи
Создать деталь со страницей добавления
Сложный

Описание примера 

Создать пользовательскую деталь Курьеры (Couriers) для раздела Заказы (Orders). Деталь должна отображать список курьеров для текущего заказа.

Исходный код 

Пакет с реализацией примера можно скачать по ссылке.

Алгоритм реализации примера 

1. Создать схему объекта детали 

В разделе Конфигурация на вкладке Схемы выполните пункт меню ДобавитьОбъект (AddObject) (рис. 1).

Рис. 1. — Добавление схемы объекта детали

Для схемы объекта детали в открывшемся дизайнере объектов заполните ее свойства как на рисунке 2.

Рис. 2. — Настройка свойств схемы объекта детали

В схему объекта добавьте справочную колонку Заказ (Order), по которой будет осуществляться связь с разделом Заказ, и справочную колонку Контакт (Contact), в которой будет храниться контакт курьера. Для обеих колонок установите признак обязательности для заполнения, чтобы избежать добавления пустых записей. Настройки свойств колонок показаны на рисунках 3 и 4.

Рис. 3. — Настройка свойств колонки Заказ (Order)
Рис. 4. — Настройка свойств колонки Контакт (Contact)

Схему объекта сохраните и опубликуйте.

2. Создать схему реестра детали 

В разделе Конфигурация на вкладке Схемы выполните пункт меню ДобавитьСхема модели представления карточки (AddSchema of the Edit Page View Model) (рис. 1).

Созданный модуль должен наследовать функциональность базовой схемы детали с реестром BaseGridDetailV2, которая определена в пакете NUI. Для этого укажите эту схему в качестве родительской для создаваемой схемы реестра детали (рис. 5). Остальные свойства установите так, как показано на рисунке 5.

Рис. 5. — Свойства схемы детали

Установите значение Курьеры (Couriers) для локализуемой строки Caption схемы реестра детали (рис. 6). В локализуемой строке Caption хранится заголовок детали, отображаемый на странице записи.

Рис. 6. — Установка значения локализуемой строки Caption

Ниже исходный код схемы реестра детали, который нужно добавить в секцию Исходный код дизайнера клиентского модуля. Здесь определяется название схемы реестра детали и ее связь со схемой объекта.

define("UsrCourierDetail", [], function() {
    return {
        // Название схемы объекта детали.
        entitySchemaName: "UsrCourierInOrder",
        details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
        methods: {},
        diff: /**SCHEMA_DIFF*/[]/**SCHEMA_DIFF*/
    };
});

Для применения внесенных изменений сохраните созданную схему реестра детали.

3. Создать схему страницы записи детали 

В разделе Конфигурация на вкладке Схемы выполните пункт меню ДобавитьСхема модели представления карточки (AddSchema of the Edit Page View Model) (рис. 1).

Создаваемая схема страницы записи детали должна наследовать функциональность базовой схемы карточки BasePageV2, которая определена в пакете NUI. Для этого укажите эту схему в качестве родительской (рис. 7). Остальные свойства установите как показано на рисунке 7.

Рис. 7. — Свойства схемы страницы детали

Для настройки полей, отображаемых на странице записи детали, в секцию Исходный код дизайнера клиентского модуля добавьте следующий код. Здесь в массиве модификаций diff указываются конфигурационные объекты метаданных для добавления, определения местоположения и привязки полей ввода значений заказа и контакта курьера.

define("UsrCourierDetailPage", [], function() {
    return {
        // Название схемы объекта детали.
        entitySchemaName: "UsrCourierInOrder",
        details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
        // Массив модификаций.
        diff: /**SCHEMA_DIFF*/[
            // Метаданные для добавления поля [Заказ].
            {
                "operation": "insert",
                //Название поля.
                "name": "Order",
                "values": {
                    // Настройка расположения поля на странице записи.
                    "layout": {
                        "colSpan": 12,
                        "rowSpan": 1,
                        "column": 0,
                        "row": 0,
                        "layoutName": "Header"
                    },
                    // Привязка к колонке [Order] схемы объекта.
                    "bindTo": "UsrOrder"
                },
                "parentName": "Header",
                "propertyName": "items",
                "index": 0
            },
            // Метаданные для добавления поля [Контакт].
            {
                "operation": "insert",
                //Название поля.
                "name": "Contact",
                "values": {
                    // Настройка расположения поля на странице записи.
                    "layout": {
                        "colSpan": 12,
                        "rowSpan": 1,
                        "column": 12,
                        "row": 0,
                        "layoutName": "Header"
                    },
                    // Привязка к колонке [Contact] схемы объекта.
                    "bindTo": "UsrContact"
                },
                "parentName": "Header",
                "propertyName": "items",
                "index": 1
            }
        ]/**SCHEMA_DIFF*/,
        methods: {},
        rules: {}
    };
});

4. Выполнить настройку детали в замещающей схеме страницы записи раздела 

Чтобы отобразить деталь на странице заказа, создайте замещающий клиентский модуль, в котором в качестве родительского объекта укажите Страница редактирования заказа (Order edit page, OrderPageV2) (рис. 8). Процесс создания замещающей страницы описан в статье "Cоздать клиентскую схему".

Рис. 8. — Свойства замещающей схемы страницы заказа

Для отображения детали Курьеры (Couriers) на вкладке Доставка (Delivery) страницы заказа добавьте следующий исходный код. Здесь в секции details определяется новая деталь CourierDetail, а ее расположение на странице записи раздела задается в секции массива модификаций diff.

define("OrderPageV2", [], function() {
    return {
        // Название схемы объекта страницы записи.
        entitySchemaName: "Order",
        // Перечень добавляемых деталей страницы записи.
        details: /**SCHEMA_DETAILS*/{
            // Настройка детали [Курьеры].
            "CourierDetail": {
                // Название схемы детали.
                "schemaName": "UsrCourierDetail",
                // Название схемы объекта детали.
                "entitySchemaName": "UsrCourierInOrder",
                // Фильтрация отображения контактов только для текущего заказа.
                "filter": {
                    // Колонка схемы объекта детали.
                    "detailColumn": "UsrOrder",
                    // Колонка схемы объекта раздела.
                    "masterColumn": "Id"
                }
            }
        }/**SCHEMA_DETAILS*/,
        // Массив модификаций.
        diff: /**SCHEMA_DIFF*/[
            // Метаданные для добавления детали [Курьеры].
            {
                "operation": "insert",
                // Название детали.
                "name": "CourierDetail",
                "values": {
                    "itemType": 2,
                    "markerValue": "added-detail"
                },
                // Родительский контейнер (Вкладка [Доставка]).
                "parentName": "OrderDeliveryTab",
                // Контейнер, в котором размещена деталь.
                "propertyName": "items",
                // Индекс в списке добавляемых элементов.
                "index": 3
            }
        ]/**SCHEMA_DIFF*/,
        methods: {},
        rules: {}
    };
});

Уже на этом этапе деталь отображается на странице записи раздела Заказы (Orders), однако добавить новую запись в деталь нельзя до тех пор, пока не будут зарегистрированы связи между схемами детали.

5. Зарегистрировать связи между схемами при помощи SQL-запросов в системные таблицы 

Чтобы зарегистрировать связь между схемой объекта детали и схемой реестра детали, выполните SQL-запрос.

DECLARE
-- Название схемы создаваемой детали.
@DetailSchemaName NCHAR(100) = 'UsrCourierDetail',
-- Заголовок детали.
@DetailCaption NCHAR(100) = 'Couriers',
--Название схемы объекта, к которому привязывается деталь.
@EntitySchemaName NCHAR(100) = 'UsrCourierInOrder'

INSERT INTO SysDetail(
    ProcessListeners,
    Caption,
    DetailSchemaUId,
    EntitySchemaUId
)
VALUES (
    0,
    @DetailCaption,
    (SELECT TOP 1 UId
    FROM SysSchema
    WHERE name = @DetailSchemaName),
    (SELECT TOP 1 UId
    FROM SysSchema
    WHERE name = @EntitySchemaName)
)

Для регистрации связи между схемой объекта детали и схемой страницы записи детали выполните следующий SQL-запрос.

DECLARE
-- Название схемы страницы детали.
@CardSchemaName NCHAR(100) = 'UsrCourierDetailPage',
-- Название схемы объекта, к которому привязывается деталь.
@EntitySchemaName NCHAR(100) = 'UsrCourierInOrder',
-- Заголовок страницы детали.
@PageCaption NCHAR(100) = '"Courier in order" detail edit page',
-- Пустая строка.
@Blank NCHAR(100) = ''

-- Добавление записи в таблицу SysModuleEntity.
INSERT INTO SysModuleEntity(
    ProcessListeners,
    SysEntitySchemaUId
)
VALUES(
    0,
    (SELECT TOP 1 UId
    FROM SysSchema
    WHERE Name = @EntitySchemaName
    )
)

-- Добавление записи в таблицу SysModuleEdit
INSERT INTO SysModuleEdit(
    SysModuleEntityId,
    UseModuleDetails,
    Position,
    HelpContextId,
    ProcessListeners,
    CardSchemaUId,
    ActionKindCaption,
    ActionKindName,
    PageCaption
)
VALUES (
    (SELECT TOP 1 Id
    FROM SysModuleEntity
    WHERE SysEntitySchemaUId = (
        SELECT TOP 1 UId
        FROM SysSchema
        WHERE Name = @EntitySchemaName
        )
    ),
    1,
    0,
    @Blank,
    0,
    (SELECT TOP 1 UId
     FROM SysSchema
     WHERE name = @CardSchemaName
    ),
    @Blank,
    @Blank,
    @PageCaption
)

Важно.

Чтобы эти изменения применились на уровне приложения, перезапустите сайт в IIS или скомпилируйте приложение в разделе Конфигурация.

6. Выполнить настройку колонок реестра детали 

На этом этапе деталь уже полностью работоспособна, однако записи контактов на детали не отображаются, поскольку не указаны колонки для отображения. Вызовите меню действий детали и настройте отображаемые колонки (рис. 9).

Рис. 9. — Меню действий детали
Создать деталь с выбором из справочника
Сложный

Описание примера 

Создать пользовательскую деталь Акты выполненных работ на вкладке Доставка для раздела Заказы. Деталь должна отображать список документов — актов выполненных работ для текущего заказа.

Исходный код 

Пакет с реализацией примера можно скачать по ссылке.

Алгоритм реализации примера 

1. Создать схему объекта детали 

В разделе Конфигурация (Configuration) на вкладке Схемы (Schemas) выполните пункт меню Добавить (Add) — Объект (Object) (рис. 1).

Рис. 1. — Добавление схемы объекта детали

В качестве родительского объекта выберите "Базовый объект" "Base object" (рис. 2).

Свойства объекта:

  • [Название] ([Name]) — "UsrCourierCertInOrder";
  • [Заголовок] ([Title]) — "Акт выполненных работ доставки в заказе" ("Acceptance certificates for deliveries of orders").

Подробнее об установке свойств схемы объекта в дизайнере объекта изложено в статье "Дизайнер объектов".

Рис. 2. — Настройка свойств схемы объекта детали

В схему объекта добавьте справочную колонку Заказ (Order), по которой будет осуществляться связь с разделом Заказы (Orders), и справочную колонку Документ (Document), в которой будет храниться акт выполненных работ. Для обеих колонок установите признак обязательности для заполнения, чтобы избежать добавления пустых записей. Настройки свойств колонок отображены на рисунках 3 и 4.

Рис. 3. — Настройка свойств колонки Заказ (Order)
Рис. 4. — Настройка свойств колонки Документ (Document)

Схему объекта сохраните и опубликуйте.

2. Создать деталь и добавить ее в раздел 

С помощью мастера деталей создайте деталь Акты выполненных работ (Acceptance certificates) (рис. 5). Затем с помощью мастера разделов добавьте деталь на страницу раздела Заказы (Orders) во вкладку Доставка (Delivery) (рис. 6).

Рис. 5. — Создание детали
Рис. 6. — Добавление детали в раздел

В результате в пакете разработки будут созданы схема детали UsrSchema1Detail и замещающая схема раздела OrderPageV2.

Важно.

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

При переименовании замените название схемы детали на новое в замещающей схеме раздела OrderPageV2.

3. Сконфигурировать деталь 

Внесите изменения в исходный код схемы созданной детали:

  1. Добавьте зависимость от модуля ConfigurationEnums.
  2. Добавьте методы-обработчики событий onDocumentInsert(), onCardSaved(), метод вызова модального окна справочника openDocumentLookup() и вспомогательные методы управления данными.
  3. В массив модификаций diff добавьте необходимые конфигурационные объекты.

В примере используется класс Terrasoft.EntitySchemaQuery для выполнения запросов к базе данных. Подробнее об использовании EntitySchemaQuery можно узнать из статьи Примеры формирования путей к колонкам. Для упрощения примера были заблокированы пункты меню детали, отвечающие за редактирование и копирование записей реестра детали.

Исходный код схемы детали:

// Определение схемы и установка ее зависимостей от других модулей.
define("UsrCourierCertDetail", ["ConfigurationEnums"],
    function(configurationEnums) {
        return {
            // Название схемы объекта детали.
            entitySchemaName: "UsrCourierCertInOrder",
            // Методы схемы детали.
            methods: {
                //Возвращает колонки, которые выбираются запросом.
                getGridDataColumns: function() {
                    return {
                        "Id": {path: "Id"},
                        "Document": {path: "UsrDocument"},
                        "Document.Number": {path: "UsrDocument.Number"}
                    };
                },

                //Конфигурирует и отображает модальное окно справочника.
                openDocumentLookup: function() {
                    //Конфигурационный объект
                    var config = {
                        // Название схемы объекта, записи которого будут отображены в справочнике.
                        entitySchemaName: "Document",
                        // Возможность множественного выбора.
                        multiSelect: true,
                        // Колонки, которые будут использованы в справочнике, например, для сортировки.
                        columns: ["Number", "Date", "Type"]
                    };
                    var OrderId = this.get("MasterRecordId");
                    if (this.Ext.isEmpty(OrderId)) {
                        return;
                    }
                    // Экземпляр класса [EntitySchemaQuery].
                    var esq = this.Ext.create("Terrasoft.EntitySchemaQuery", {
                        // Установка корневой схемы.
                        rootSchemaName: this.entitySchemaName
                    });
                    // Добавление колонки [Id].
                    esq.addColumn("Id");
                    // Добавление колонки [Id] из схемы [Document].
                    esq.addColumn("Document.Id", "DocumentId");
                    // Создание и добавление фильтров в коллекцию запроса.
                    esq.filters.add("filterOrder", this.Terrasoft.createColumnFilterWithParameter(
                        this.Terrasoft.ComparisonType.EQUAL, "UsrOrder", OrderId));
                    // Получение всей коллекции записей и отображение ее в модальном окне справочника.
                    esq.getEntityCollection(function(result) {
                        var existsDocumentsCollection = [];
                        if (result.success) {
                            result.collection.each(function(item) {
                                existsDocumentsCollection.push(item.get("DocumentId"));
                            });
                        }
                        // Добавление фильтра в конфигурационный объект.
                        if (existsDocumentsCollection.length > 0) {
                            var existsFilter = this.Terrasoft.createColumnInFilterWithParameters("Id",
                                existsDocumentsCollection);
                            existsFilter.comparisonType = this.Terrasoft.ComparisonType.NOT_EQUAL;
                            existsFilter.Name = "existsFilter";
                            config.filters = existsFilter;
                        }
                        // Вызов модального окна справочника
                        this.openLookup(config, this.addCallBack, this);
                    }, this);
                },

                // Обработчик события сохранения страницы записи.
                onCardSaved: function() {
                    this.openDocumentLookup();
                },

                //Открывает справочник документов в случае если страница заказа была ранее сохранена.
                addRecord: function() {
                    var masterCardState = this.sandbox.publish("GetCardState", null, [this.sandbox.id]);
                    var isNewRecord = (masterCardState.state === configurationEnums.CardStateV2.ADD ||
                    masterCardState.state === configurationEnums.CardStateV2.COPY);
                    if (isNewRecord === true) {
                        var args = {
                            isSilent: true,
                            messageTags: [this.sandbox.id]
                        };
                        this.sandbox.publish("SaveRecord", args, [this.sandbox.id]);
                        return;
                    }
                    this.openDocumentLookup();
                },

                // Добавление выбранных продуктов.
                addCallBack: function(args) {
                    // Экземпляр класса пакетного запроса BatchQuery.
                    var bq = this.Ext.create("Terrasoft.BatchQuery");
                    var OrderId = this.get("MasterRecordId");
                    // Коллекция выбранных в справочнике документов.
                    this.selectedRows = args.selectedRows.getItems();
                    // Коллекция, передаваемая в запрос.
                    this.selectedItems = [];
                    // Копирование необходимых данных.
                    this.selectedRows.forEach(function(item) {
                        item.OrderId = OrderId;
                        item.DocumentId = item.value;
                        bq.add(this.getDocumentInsertQuery(item));
                        this.selectedItems.push(item.value);
                    }, this);
                    // Выполнение пакетного запроса, если он не пустой.
                    if (bq.queries.length) {
                        this.showBodyMask.call(this);
                        bq.execute(this.onDocumentInsert, this);
                    }
                },

                //Возвращает запрос на добавление текущего объекта.
                getDocumentInsertQuery: function(item) {
                    var insert = Ext.create("Terrasoft.InsertQuery", {
                        rootSchemaName: this.entitySchemaName
                    });
                    insert.setParameterValue("UsrOrder", item.OrderId, this.Terrasoft.DataValueType.GUID);
                    insert.setParameterValue("UsrDocument", item.DocumentId, this.Terrasoft.DataValueType.GUID);
                    return insert;
                },

                // Метод, вызываемый при добавлении записей в реестр детали.
                onDocumentInsert: function(response) {
                    this.hideBodyMask.call(this);
                    this.beforeLoadGridData();
                    var filterCollection = [];
                    response.queryResults.forEach(function(item) {
                        filterCollection.push(item.id);
                    });
                    var esq = Ext.create("Terrasoft.EntitySchemaQuery", {
                        rootSchemaName: this.entitySchemaName
                    });
                    this.initQueryColumns(esq);
                    esq.filters.add("recordId", Terrasoft.createColumnInFilterWithParameters("Id", filterCollection));
                    // Создание модели представления.
                    esq.on("createviewmodel", this.createViewModel, this);
                    esq.getEntityCollection(function(response) {
                        this.afterLoadGridData();
                        if (response.success) {
                            var responseCollection = response.collection;
                            this.prepareResponseCollection(responseCollection);
                            this.getGridData().loadAll(responseCollection);
                        }
                    }, this);
                },

                // Метод, вызываемый при удалении выбранных записей детали.
                deleteRecords: function() {
                    var selectedRows = this.getSelectedItems();
                    if (selectedRows.length > 0) {
                        this.set("SelectedRows", selectedRows);
                        this.callParent(arguments);
                    }
                },

                // Скрыть пункт меню [Копировать].
                getCopyRecordMenuItem: Terrasoft.emptyFn,
                 // Скрыть пункт меню [Изменить].
                getEditRecordMenuItem: Terrasoft.emptyFn,
                // Возвращает имя колонки по умолчанию для фильтра.
                getFilterDefaultColumnName: function() {
                    return "UsrDocument";
                }
            },
            // Массив модификаций.
            diff: /**SCHEMA_DIFF*/[
                {
                    // Тип операции — слияние.
                    "operation": "merge",
                    // Название элемента схемы, над которым производится действие.
                    "name": "DataGrid",
                    // Объект, свойства которого будут объединены со свойствами элемента схемы.
                    "values": {
                        "rowDataItemMarkerColumnName": "UsrDocument"
                    }
                },
                {
                    // Тип операции — слияние.
                    "operation": "merge",
                    // Название элемента схемы, над которым производится действие.
                    "name": "AddRecordButton",
                    // Объект, свойства которого будут объединены со свойствами элемента схемы.
                    "values": {
                        "visible": {"bindTo": "getToolsVisible"}
                    }
                }
            ]/**SCHEMA_DIFF*/
        };
    }
);

4. Выполнить настройку колонок реестра детали 

На этом этапе деталь уже полностью работоспособна, однако записи контактов на детали не отображаются, поскольку не указаны колонки для отображения. Для отображения колонок вызовите меню действий детали и настройте отображаемые колонки (рис. 7).

Рис. 7. — Меню действий детали

В результате новая деталь позволит добавлять записи из справочника документов с помощью модального окна (рис. 8).

Рис. 8. — Результат выполнения примера
Создать деталь с редактируемым реестром
Сложный

Описание примера 

Создать пользовательскую деталь "Курьерские службы" для раздела Заказы. Деталь должна отображать список курьерских служб для текущего заказа.

Исходный код 

Пакет с реализацией примера можно скачать по ссылке.

Алгоритм реализации примера 

1. Создать схему объекта детали 

В разделе Конфигурация на вкладке Схемы выполните действие ДобавитьОбъект (AddObject) (рис. 1).

Рис. 1. — Добавление схемы объекта детали

Для создаваемой схемы объекта установите (рис.2):

  • [Название] ([Name]) — "UsrCourierService";
  • [Заголовок] ([Title]) — "CourierService";
  • [Родительский объект] ([Parent object]) — [Базовый объект] ([Base object]).
Рис. 2. — Настройка свойств схемы объекта детали

В схему объекта добавьте справочную колонку Заказ (Order), по которой будет осуществляться связь с разделом Заказ, и справочную колонку Контрагент (Account), в которой будет храниться контрагент, осуществляющий доставку по данному заказу. Для обеих колонок установите признак обязательности для заполнения, чтобы избежать добавления пустых записей. Настройки свойств колонок показаны на рисунках 3 и 4.

Рис. 3. — Настройка свойств колонки Заказ (Order)
Рис. 4. — Настройка свойств колонки Контрагент (Account)

Схему объекта сохраните и опубликуйте.

2. Создать схему детали 

В разделе Конфигурация на вкладке Схемы выполните пункт меню ДобавитьСхема модели представления карточки (AddSchema of the Edit Page View Model) (рис. 1).

В качестве родительской схемы укажите базовую схему детали с реестром BaseGridDetailV2, которая определена в пакете NUI.

Установите остальные свойства (рис. 5):

  • [Название] ([Name]) — "UsrCourierServiceDetail";
  • [Заголовок] ([Title]) — "Схема детали "Курьерская служба в заказе"" ("Courier Service in Order detail schema").
Рис. 5. — Свойства схемы детали

Установите значение Курьерcкая служба (Courier Service) для локализуемой строки Caption схемы реестра детали (рис. 6). В локализуемой строке Caption хранится заголовок детали, отображаемый на странице записи.

Рис. 6. — Установка значения локализуемой строки Caption

Для того чтобы сделать реестр детали редактируемым, в ее схеме необходимо:

  1. Добавить зависимости от модулей ConfigurationGrid, ConfigurationGridGenerator, ConfigurationGridUtilities.
  2. Подключить миксин ConfigurationGridUtilities.
  3. Установить для атрибута IsEditable значение true.
  4. В массив модификаций diff добавить конфигурационный объект, в котором устанавливаются свойства и выполняется привязка методов-обработчиков событий реестра детали.

Исходный код схемы детали с подробными комментариями:

// Определение схемы и установка ее зависимостей от других модулей.
define("UsrCourierServiceDetail", ["ConfigurationGrid", "ConfigurationGridGenerator",
    "ConfigurationGridUtilities"], function() {
    return {
        // Название схемы объекта детали.
        entitySchemaName: "UsrCourierService",
        // Перечень атрибутов схемы.
        attributes: {
            // Признак возможности редактирования.
            "IsEditable": {
                // Тип данных — логический.
                dataValueType: Terrasoft.DataValueType.BOOLEAN,
                // Тип атрибута — виртуальная колонка модели представления.
                type: Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
                // Устанавливаемое значение.
                value: true
            }
        },
        // Используемые миксины.
        mixins: {
            ConfigurationGridUtilities: "Terrasoft.ConfigurationGridUtilities"
        },
        // Массив модификаций модели представления.
        diff: /**SCHEMA_DIFF*/[
            {
                // Тип операции — слияние.
                "operation": "merge",
                // Название элемента схемы, над которым производится действие.
                "name": "DataGrid",
                // Объект, свойства которого будут объединены со свойствами элемента схемы.
                "values": {
                    // Имя класса
                    "className": "Terrasoft.ConfigurationGrid",
                    // Генератор представления должен генерировать только часть представления.
                    "generator": "ConfigurationGridGenerator.generatePartial",
                    // Привязка события получения конфигурации элементов редактирования
                    // активной строки к методу-обработчику.
                    "generateControlsConfig": {"bindTo": "generateActiveRowControlsConfig"},
                    // Привязка события смены активной записи к методу-обработчику.
                    "changeRow": {"bindTo": "changeRow"},
                    // Привязка события отмены выбора записи к методу-обработчику.
                    "unSelectRow": {"bindTo": "unSelectRow"},
                    // Привязка  события клика на реестре к методу-обработчику.
                    "onGridClick": {"bindTo": "onGridClick"},
                    // Действия, производимые с активной записью.
                    "activeRowActions": [
                        // Настройка действия [Сохранить].
                        {
                            // Имя класса элемента управления, с которым связано действие.
                            "className": "Terrasoft.Button",
                            // Стиль отображения — прозрачная кнопка.
                            "style": this.Terrasoft.controls.ButtonEnums.style.TRANSPARENT,
                            // Тег.
                            "tag": "save",
                            // Значение маркера.
                            "markerValue": "save",
                            // Привязка к изображению кнопки.
                            "imageConfig": {"bindTo": "Resources.Images.SaveIcon"}
                        },
                        // Настройка действия [Отменить].
                        {
                            "className": "Terrasoft.Button",
                            "style": this.Terrasoft.controls.ButtonEnums.style.TRANSPARENT,
                            "tag": "cancel",
                            "markerValue": "cancel",
                            "imageConfig": {"bindTo": "Resources.Images.CancelIcon"}
                        },
                        // Настройка действия [Удалить].
                        {
                            "className": "Terrasoft.Button",
                            "style": this.Terrasoft.controls.ButtonEnums.style.TRANSPARENT,
                            "tag": "remove",
                            "markerValue": "remove",
                            "imageConfig": {"bindTo": "Resources.Images.RemoveIcon"}
                        }
                    ],
                    // Привязка к методу, который инициализирует подписку на события
                    // нажатия кнопок в активной строке.
                    "initActiveRowKeyMap": {"bindTo": "initActiveRowKeyMap"},
                    // Привязка события выполнения действия активной записи к методу-обработчику.
                    "activeRowAction": {"bindTo": "onActiveRowAction"},
                    // Признак возможности выбора нескольких записей.
                    "multiSelect": {"bindTo": "MultiSelect"}
                }
            }
        ]/**SCHEMA_DIFF*/
    };
});

Для применения внесенных изменений сохраните созданную схему реестра детали.

3. Выполнить настройку детали в схеме замещающей модели представления страницы записи раздела 

Чтобы отобразить деталь на странице заказа, создайте схему замещающей модели представления, в которой в качестве родительского объекта укажите Страница редактирования заказа (Order edit page, OrderPageV2) (рис. 7). Процесс создания схемы замещающей модели представления описан в статье "Cоздать клиентскую схему".

Рис. 7. — Свойства схемы замещающей модели представления страницы заказа

Для отображения детали Курьерcкие службы (Courier Service) на вкладке Доставка (Delivery) страницы заказа добавьте следующий исходный код. Здесь в секции details определяется новая деталь UsrCourierServiceDetail, а ее расположение на странице записи раздела задается в секции массива модификаций diff.

define("OrderPageV2", [], function() {
    return {
        // Название схемы объекта страницы записи.
        entitySchemaName: "Order",
        // Перечень добавляемых деталей страницы записи.
        details: /**SCHEMA_DETAILS*/{
            // Настройка детали [Курьерcкие службы].
            "UsrCourierServiceDetail": {
                // Название схемы детали.
                "schemaName": "UsrCourierServiceDetail",
                // Название схемы объекта детали.
                "entitySchemaName": "UsrCourierService",
                // Фильтрация отображения контактов только для текущего заказа.
                "filter": {
                    // Колонка схемы объекта детали.
                    "detailColumn": "UsrOrder",
                    // Колонка схемы объекта раздела.
                    "masterColumn": "Id"
                }
            }
        }/**SCHEMA_DETAILS*/,
        // Массив модификаций.
        diff: /**SCHEMA_DIFF*/[
            // Метаданные для добавления детали [Курьерские службы].
            {
                "operation": "insert",
                // Название детали.
                "name": "UsrCourierServiceDetail",
                "values": {
                    "itemType": Terrasoft.core.enums.ViewItemType.DETAIL,
                    "markerValue": "added-detail"
                },
                // Контейнеры, в котором размещена деталь.
                // Деталь размещена на вкладке [Доставка].
                "parentName": "OrderDeliveryTab",
                "propertyName": "items",
                // Индекс в списке добавляемых элементов.
                "index": 3
            }
        ]/**SCHEMA_DIFF*/
    };
});

Сохраните схему замещающей модели представления страницы записи.

4. Выполнить настройку колонок реестра детали 

На этом этапе деталь уже полностью работоспособна. Однако записи контрагентов на детали не отображаются, поскольку не указаны колонки для отображения. Для исправления этого недостатка вызовите меню действий детали и настройте отображаемые колонки (рис. 8).

Рис. 8. — Меню действий детали

Мастер деталей, мастер раздела и деталь с редактируемым реестром 

Поскольку деталь с редактируемым реестром не является стандартной деталью приложения Creatio, то она не может быть добавлена в раздел при помощи мастера деталей. Поэтому при выполнении команды Настроить деталь (Detail setup) (рис. 8) появится сообщение о том, что деталь не зарегистрирована. Также информация о том, что деталь не зарегистрирована, отображается в мастере разделов (рис. 9) уже после того, как она была добавлена вручную.

Рис. 9. — Отображение незарегистрированной детали в мастере разделов

В общем случае регистрация детали с редактируемым реестром в системе не нужна. Однако, если по каким-либо причинам деталь все же нужно зарегистрировать в системе, то для этого выполните следующий SQL-сценарий:

DECLARE 
    -- Название схемы представления создаваемой миникарточки.
    @ClientUnitSchemaName NVARCHAR(100) = 'UsrCourierServiceDetail',
    -- Название схемы объекта, к которому привязывается миникарточка.
    @EntitySchemaName NVARCHAR(100) = 'UsrCourierService',
    -- Название детали.
    @DetailCaption NVARCHAR(100) = 'Курьерская служба'

INSERT INTO SysDetail(Caption, DetailSchemaUId, EntitySchemaUId)
VALUES(@DetailCaption,
     (SELECT TOP 1 UId
      from SysSchema
      WHERE Name = @ClientUnitSchemaName),
      (SELECT TOP 1 UId
      from SysSchema
      WHERE Name = @EntitySchemaName))

Важно.

Для того чтобы осуществить регистрацию создаваемой детали в системе, необходимо внести изменения в системную таблицу SysDetails базы данных Creatio при помощи SQL-запроса.

Однако при составлении и выполнении SQL-запроса к базе данных следует быть предельно внимательным. Выполнение неправильно составленного SQL-запроса может привести к повреждению существующих данных и нарушению работы системы.

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

Рис. 10. — Отображение зарегистрированной детали в мастере разделов
Добавить многострочный текст в деталь с редактируемым реестром
Средний

Начиная с версии 7.14.0 в редактируемом реестре добавлена функциональность многострочного поля ввода.

На заметку. Пример является продолжением статьи "Создание детали с редактируемым реестром". Для корректной работы предварительно установите пакет с реализацией примера по созданию детали с редактируемым реестром.

Описание примера 

Добавить в деталь "Курьерские службы" текстовое поле Описание Description с возможностью многострочного ввода текста.

Исходный код 

Пакет с реализацией примера можно скачать по ссылке.

Алгоритм выполнения примера 

1. Создать схему замещающего объекта детали 

В разделе Конфигурация на вкладке Схемы выполните действие ДобавитьЗамещающий объект (AddReplacing Object) (рис. 1).

Рис. 1. — Добавление схемы объекта детали
 

Для создаваемой схемы объекта установите (рис.2):

  • [Родительский объект] ([Parent object]) — [CourierService] из пакета sdkCreateDetailWithEditableGrid.
Рис. 2. — Настройка свойств схемы объекта детали

В схему объекта добавьте текстовую колонку Описание (Description). Настройки свойств колонки показаны на рисунке 3.

Рис. 3. — Настройка свойств колонки Заказ (Order)

Схему объекта сохраните и опубликуйте.

2. Создать схему замещающей модели представления детали 

Создайте схему замещающей модели представления, в которой в качестве родительского объекта укажите схему Схема детали "Курьерская служба в заказе" (Courier Service in Order detail schema, UsrCourierServiceDetail) из пакета sdkCreateDetailWithEditableGrid (рис. 4). Процесс создания схемі замещающей модели представления описан в статье "Cоздать клиентскую схему".

Рис. 4. — Свойства схемы замещающей модели представления детали
 

Исходный код схемы детали:

    define("UsrCourierServiceDetail", [],
        function() {
            return {
                // Перечень атрибутов схемы.
                attributes: {
                    // Колонка описания.
                    "UsrDescription": {
                        // Тип отображения - длинный текст.
                        "contentType": Terrasoft.ContentType.LONG_TEXT
                    }
                }
            };
        }
    );
    

3. Выполнить настройку колонки 

Вызовите меню действий детали и настройте отображаемые колонки.

В результате на странице заказа в детали Курьерская служба (Courier Service) отобразится колонка Описание с возможностью ввода многострочного текста (рис. 5).

Рис. 5. — Результат выполнения примера
 
Скрыть команды меню детали с реестром
Средний

Для управления записями реестра детали предназначены команды меню детали Копировать (Copy), Редактировать (Edit) и Удалить (Delete) (рис. 1).

Рис. 1. — Меню детали Адреса (Addresses)
 

Чтобы скрыть команды меню детали необходимо:

1. Создать схему замещающей модели представления реестра детали. Например, для детали Адреса (Addresses) страницы контрагента это будет схема Деталь адресов контрагента (Account addresses detail). Как создать схему замещающей модели представления описано в статье "Cоздать клиентскую схему".

2. В созданную схему добавить следующий код:

define("AccountAddressDetailV2", [], function() {
    return {
        entitySchemaName: "AccountAddress",
        methods: {
            // Удаление команды [Копировать] ([Copy])
            getCopyRecordMenuItem: Terrasoft.emptyFn,
            // Удаление команды [Редактировать] ([Edit])
            getEditRecordMenuItem: Terrasoft.emptyFn,
            // Удаление команды [Удалить] ([Delete])
            getDeleteRecordMenuItem: Terrasoft.emptyFn
        },
        diff: /**SCHEMA_DIFF*/[]/**SCHEMA_DIFF*/
    };
});

3. Сохранить изменения.

4. Обновить страницу браузера.

В результате команды будут удалены из меню детали (рис. 2).

Рис. 2. — Меню детали Адреса (Addresses) без команд управления записями детали
Реализовать множественное добавление записей на деталь
Сложный

Описание примера 

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

Исходный код 

Пакет с реализацией примера можно скачать по ссылке.

Алгоритм выполнения примера 

1. Создать схему замещающей модели представления детали 

В пакете разработки создайте схему замещающей модели представления детали (рис. 1). Процесс создания схемы замещающей модели представления подробно описан в статье "Cоздать клиентскую схему".

Рис. 1. — Добавление схемы замещающей модели представления

Для созданной схемы замещающей модели представления детали в качестве родительского объекта укажите схему OpportunityContactDetailV2 (рис. 2).

Рис. 2. — Свойства схемы замещающей модели представления

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

Для использования миксина LookupMultiAddMixin в схеме, добавьте его в свойстве mixins и инициализируйте в переопределенном методе init() схемы детали. Подробная информация о переопределении метода init() доступна в статье "Принципы модульной разработки в Creatio".

Для реализации необходимой функциональности переопределите методы отображения кнопки добавления getAddRecordButtonVisible(), сохранения страницы детали onCardSaved() и добавления записи на деталь addRecord().

В методах сохранения страницы детали и добавления записи используется метод вызова справочного окна для множественного выбора openLookupWithMultiSelect() и связанный с ним метод getMultiSelectLookupConfig(), выполняющий конфигурирование справочного окна. Описание и основные параметры этих методов приведены в таблице 1.

Табл. 1. — Методы вызова и конфигурирования справочного окна
Метод Описание
openLookupWithMultiSelect(isNeedCheckOfNew) Открывает окно справочника с множественным выбором. Параметр isNeedCheckOfNew {bool} указывает на необходимость выполнять проверку является ли запись новой.
getMultiSelectLookupConfig()

Возвращает объект конфигурации для справочного окна. Свойства объекта:

rootEntitySchemaName — корневая схема объекта;

rootColumnName — связующая колонка, указывающая на запись корневой схемы;

relatedEntitySchemaName — связанная схема;

relatedColumnName — колонка, указывающая на запись связанной схемы.

В этом примере справочное окно будет использовать данные из таблицы OpportunityContact, используя колонки Opportunity и Contact.

Исходный код схемы детали:

define("OpportunityContactDetailV2", ["LookupMultiAddMixin"], function() {
    return {
        mixins: {
            // Подключение миксина к схеме.
            LookupMultiAddMixin: "Terrasoft.LookupMultiAddMixin"
        },
        methods: {
            // Переопределение базового метода инициализации схемы.
            init: function() {
                this.callParent(arguments);
                //Инициализация миксина.
                this.mixins.LookupMultiAddMixin.init.call(this);
            },
            // Переопределение базового метода отображения кнопки добавления.
            getAddRecordButtonVisible: function() {
                //Отображать кнопку добавления если деталь развернута, даже если для детали не реализована страница записи.
                return this.getToolsVisible();
            },
            // Переопределение базового метода.
            // Обработчик события сохранения страницы записи детали.
            onCardSaved: function() {
                // Открывает справочное окно с множественным выбором записей.
                this.openLookupWithMultiSelect();
            },
            // Переопределение базового метода добавления записи на деталь.
            addRecord: function() {
                // Открывает справочное окно с множественным выбором записей.
                this.openLookupWithMultiSelect(true);
            },
            // Метод, возвращающий конфигурационный объект для справочного окна.
            getMultiSelectLookupConfig: function() {
                return {
                    // Корневая схема — [Продажа].
                    rootEntitySchemaName: "Opportunity",
                    // Колонка корневой схемы.
                    rootColumnName: "Opportunity",
                    // Связанная схема — [Контакт].
                    relatedEntitySchemaName: "Contact",
                    // Колонка связанной схемы.
                    relatedColumnName: "Contact"
                };
            }
        }
    };
});

После сохранения схемы и обновления страницы приложения у пользователя по нажатию на кнопку добавления записи на деталь (рис. 3) появится возможность выбрать не одну, а несколько записей из справочника (рис. 4). После подтверждения все выбранные записи будут добавлены на деталь Контакты (Contacts) на странице записи раздела Продажи (Opportunities) (рис.5).

Рис. 3. — Добавление новых записей на деталь
Рис. 4. — Выбор необходимых записей из справочника
Рис. 5. — Результат выполнения кейса. Все выбранные записи добавлены на деталь
Добавить деталь [Файлы и ссылки]
Сложный

Описание кейса 

На страницу редактирования записи пользовательского раздела Фотографии (Photos) добавить деталь Файлы и ссылки. Все схемы раздела Фотографии и детали Файлы и ссылки должны храниться в пользовательском пакете (например, sdkDetailAttachment).

На заметку.

Для создания раздела необходимо использовать мастер разделов (см. статьи "Создать новый раздел").

Важно.

Поскольку разработку необходимо вести в пользовательском пакете, нужно удостовериться в том, что он указан в системной настройке Текущий пакет (Current package). В противном случае мастер сохранит изменения в пакет Custom.

Алгоритм выполнения кейса 

1. Создать деталь, используя схему объекта раздела [Название объекта раздела]File 

В результате работы мастера разделов (рис. 1) в пользовательском пакете будет создано несколько схем объектов и клиентских модулей. Название схемы основного объекта раздела — UsrPhotos (рис. 2). Название схемы объекта раздела, который необходимо использовать для детали файлы и ссылки — UsrPhotosFile.

Рис. 1. — Свойства раздела Фотографии (Photos) в мастере разделов
Рис. 2. — Схемы, созданные мастером разделов в пользовательском пакете

Создание детали мастером подробно описано в статье "Создать деталь с помощью мастера". На первом шаге мастера деталей необходимо ввести заголовок детали и указать в качестве основного объекта детали объект Объект для детали файлы и ссылки объекта раздела [Фотографии (Photos attachment) (рис. 3). На второй шаг мастера переходить не обязательно.

Рис. 3. — Свойства детали в мастере деталей

В результате работы мастера в пользовательском пакете будут созданы схема клиентского модуля реестра детали и схема страницы редактирования детали (рис. 4).

Рис. 4. — Схемы, созданные мастером деталей в пользовательском пакете

На заметку.

Названия схем генерируются мастером автоматически и могут отличаться от указанных на рисунке 4.

2. Изменить родительский объект для схемы модуля реестра детали 

С помощью мастера деталей была создана деталь со страницей добавления. В качестве родительского объекта схемы клиентского модуля реестра детали UsrSchema3Detail указана схема Базовая схема детали с реестром (Base schema - Detail with list) пакета NUI (рис. 5).

Рис. 5. — Родительский объект по умолчанию

Чтобы созданная мастером деталь получила функциональность детали Файлы и ссылки, необходимо в качестве родительского объекта схемы UsrSchema3Detail указать схему FileDetailV2 (рис. 6).

Рис. 6. — Родительский объект — схема FileDetailV2

На заметку.

Как указать родительский объект подробно описано в статье "Разработка конфигурационных элементов".

После внесения изменений схему необходимо сохранить.

3. С помощью мастера разделов добавить деталь на страницу редактирования записи 

Добавление детали на страницу редактирования записи с помощью мастера разделов подробно описано в статье "Создать деталь с помощью мастера". Во время добавления детали в мастере разделов нужно настроить связь между колонками детали и основного объекта раздела (рис. 7).

Рис. 7. — Настройка связи между колонками

После сохранения изменений в мастере деталь появится на странице редактирования записи (рис. 8).

Рис. 8. — Деталь на странице редактирования

На заметку.

Деталь можно добавить на любую вкладку страницы редактирования. Также для нее можно создать отдельную вкладку со стандартным названием Файлы и примечания.

4. Выполнить дополнительную настройку детали 

После выполнения предыдущих шагов деталь полностью работоспособна, но внешне отличается от детали Файлы и ссылки стандартных разделов приложения. Чтобы пользовательская деталь была внешне похожа на стандартную, необходимо определить для нее CSS-стили.

Важно.

Схема клиентского модуля реестра детали UsrSchema3Detail является схемой модели представления и в ней определить стили для отображения детали нельзя. Поэтому необходимо создать новую схему модуля, определить в ней необходимые стили и добавить этот модуль в зависимости модуля детали.

Для этого необходимо в пользовательском пакете создать новую схему модуля со следующими значениями свойств:

  • [Заголовок] ([Title]) — "UsrSchema3DetailCSS".
  • [Название] ([Name]) — "UsrSchema3DetailCSS".
  • [Пакет] ([Package]) — "sdkDetailAttachment".

На вкладке LESS дизайнера модуля необходимо добавить следующие CSS-селекторы:

div[id*="UsrSchema3Detail"] {
    .grid-status-message-empty {
        display: none;
    }
    .grid-empty > .grid-bottom-spinner-space {
        height: 5px;
    }
    .dropzone {
        height: 35px;
        width: 100%;
        border: 1px dashed #999999;
        text-align: center;
        line-height: 35px;
    }
    .dropzone-hover {
        border: 1px dashed #4b7fc7;
    }
    .DragAndDropLabel {
        font-size: 1.8em;
        color: rgb(110, 110, 112);
    }
}

div[data-item-marker*="added-detail"] {
    div[data-item-marker*="tiled"], div[data-item-marker*="listed"] {
        .entity-image-class {
            width: 165px;
        }
        .entity-image-container-class {
            float: right;
            width: 128px;
            height: 128px;
            text-align: center;
            line-height: 128px;
        }
        .entity-image-view-class {
            max-width: 128px;
            max-height: 128px;
            vertical-align: middle;
        }
        .images-list-class {
            min-height: 0.5em;
        }
        .images-list-class > .selectable {
            margin-right: 10px;
            display: inline-block;
        }
        .entity-label {
            display: block;
            max-width: 128px;
            margin-bottom: 10px;
            text-align: center;
        }
        .entity-link-container-class > a {
            font-size: 1.4em;
            line-height: 1.5em;
            display: block;
            max-width: 128px;
            margin-bottom: 10px;
            color: #444;
            text-decoration: none;
            text-overflow: ellipsis;
            overflow: hidden;
            white-space: nowrap;
        }
        .entity-link-container-class > a:hover {
            color: #0e84cf;
        }
        .entity-link-container-class {
            float: right;
            width: 128px;
            text-align: center;
        }
        .select-entity-container-class {
            float: left;
            width: 2em;
        }
        .listed-mode-button {
            border-top-right-radius: 1px;
            border-bottom-right-radius: 1px;
        }
        .tiled-mode-button {
            border-top-left-radius: 1px;
            border-bottom-left-radius: 1px;
        } 
        .tiled-mode-button, .listed-mode-button {
            padding-left: 0.308em;
            padding-right: 0.462em;
        }
    }
    .button-pressed {
        background: #fff;
        
        .t-btn-image {
            background-position: 0 16px !important;
        }
    }
    div[data-item-marker*="tiled"] {
        .tiled-mode-button {
            .button-pressed;
        }
    }
    div[data-item-marker*="listed"] {
        .listed-mode-button {
            .button-pressed;
        }
    }
}

На заметку.

Стили, определенные в исходном коде выше, практически полностью совпадают со стилями, определенными в схеме модуля FileDetailCssModule пакета UIv2. Они предназначены для схемы FileDetailV2, используемой в качестве родительского объекта.

Использовать модуль FileDetailCssModule напрямую нельзя, т. к. маркеры и идентификаторы НТML-элементов стандартной детали и детали, созданной с помощью мастера, отличаются.

Для применения изменений схему необходимо сохранить.

Чтобы использовать созданный модуль и его стили в схеме клиентского модуля реестра детали UsrSchema3Detail, необходимо добавить его в зависимости модуля, определенного в схеме детали.

Исходный код модифицированной схемы:

define("UsrSchema3Detail", ["css!UsrSchema3DetailCSS"], function() {
    return {
        entitySchemaName: "UsrPhotosFile",
        details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
        methods: {},
        diff: /**SCHEMA_DIFF*/[]/**SCHEMA_DIFF*/
    };
});

Для применения изменений схему необходимо сохранить.

В результате выполнения кейса на странице редактирования записи пользовательского раздела Фотографии (Photos) будет добавлена деталь Файлы и ссылки, практически идентичная стандартной (рис. 9).

Рис. 9. — Результат выполнения кейса
Отобразить дополнительные колонки на детали [Файлы и ссылки]
Сложный

Описание кейса 

Для детали Файлы и ссылки (Attachments) подключить возможность настройки колонок реестра, добавив соответствующий пункт в меню кнопки Действия (Actions).

Алгоритм выполнения кейса 

1. Заместить схему детали FileDetailV2 

Как создать схему замещающей модели представления подробно описано в статье "Cоздать клиентскую схему". В пользовательском пакете нужно создать схему замещающей модели представления со следующими свойствами:

  • [Заголовок] ([Title]) — "FileDetailV2".
  • [Название] ([Name]) — "FileDetailV2".
  • [Пакет] ([Package]) — пакет, в котором схема объекта будет размещена после публикации. По умолчанию содержит название пакета, выбранного перед созданием схемы. Значение может быть изменено на любое из выпадающего списка.
  • [Родительский объект] ([Parent object]) — "FileDetailV2".

2. Реализовать вызов метода открытия страницы настройки колонок реестра 

Для этого в исходном коде замещающей схемы необходимо в описании модуля переопределить базовый метод getGridSettingsMenuItem(), возвращающий пункт меню детали, связанный с вызовом базового метода openGridSettings(), определенном в миксине GridUtilities.

Исходный код схемы:

define("FileDetailV2", [], function() {
    return {
        methods: {
            getGridSettingsMenuItem: function() {
                return this.getButtonMenuItem({
                    Caption: {"bindTo": "Resources.Strings.SetupGridMenuCaption"},
                    Click: {"bindTo": "openGridSettings"}
                });
            }
        }
    };
});

После внесения изменений схему необходимо сохранить.

В результате выполнения кейса в меню кнопки Действия (Actions) детали появится новая команда Настройка колонок (Columns setup) (рис. 2).

Рис. 2. — Добавленная команда для настройки колонок реестра на детали
 

После выполнения этой команды откроется страница настройки отображения колонок реестра, на которой можно добавить колонку Описание (Description) (рис. 3).

Рис. 3. — Страница настройки отображения колонок реестра детали

После сохранения настроек в списочном представлении детали будет отображаться добавленная колонка (рис. 4)

Рис. 4. — Результат выполнения кейса
Схема BaseDetailV2
Сложный

Для того чтобы мастер деталей мог корректно работать с созданной разработчиком деталью, ее необходимо зарегистрировать. Для регистрации детали необходимо в таблицу SysDetail добавить запись с указанием заголовка детали, идентификатора схемы детали DetailSchemaUid (колонка UId таблицы SysSchema) и идентификатора схемы объекта детали EntitySchemaUId (колонка UId таблицы SysSchema).

Все схемы деталей должны быть наследниками базовой схемы детали BaseDetailV2. В схеме реализована базовая логика инициализации данных и общения со страницей записи.

Сообщения 

Сообщения предназначены для общения детали со страницей записи. Полный перечень сообщений, их режим вещания и направление приведены в таблице.

Сообщения базовой детали
Название Режим Направление Описание
GetCardState Адресное Публикация Возвращает состояние страницы записи.
SaveRecord Адресное Публикация Сообщает странице записи о необходимости сохранить данные.
DetailChanged Адресное Публикация Сообщает странице записи об изменении данных детали.
UpdateDetail Адресное Подписка Подписка на обновление страницы записи.
OpenCard Адресное Публикация Открывает страницу записи.

Виды режимов сообщений определены в перечислении Terrasoft.core.enums.MessageMode, а направление сообщений — в перечислении Terrasoft.core.enums.MessageDirectionType. Подробнее о них можно узнать из библиотеки классов клиентской части ядра платформы.

Атрибуты 

Свойство attributes содержит атрибуты модели представления детали.

CanAtd BOOLEAN

Признак возможности добавления данных.

CanEdit BOOLEAN

Признак возможности редактирования данных.

CanDelete BOOLEAN

Признак возможности удаления данных.

Collection COLLECTION

Коллекция данных детали.

Filter CUSTOM_OBJECT

Фильтр детали. Используется для фильтрации данных в детали.

DetailColumnName STRING

Имя колонки, по которой выполняется фильтрация.

MasterRecordId GUID

Значение ключа родительской записи.

IsDetailCollapsed BOOLEAN

Признак свернутости детали.

DefaultValues CUSTOM_OBJECT

Значения колонок модели по умолчанию.

Caption STRING

Заголовок детали.

Возможные типы данных атрибутов представлены перечислением Terrasoft.DataValueType. Подробнее о типах данных можно узнать из библиотеки классов клиентской части ядра платформы.

Методы 

init

Инициализирует страницу детали.

Параметры
{Function} callback Функция обратного вызова.
{Object} scope Контекст выполнения метода.
initProfile

Инициализирует профиль схемы. По умолчанию содержит значение Terrasoft.emptyFn.

initDefaultCaption

Устанавливает заголовок детали по умолчанию.

initDetailOptions

Инициализирует коллекцию данных представления реестра.

subscribeSandboxEvents

Подписывается на сообщения, необходимые для работы детали.

getUpdateDetailSandboxTags

Генерирует массив тегов для сообщения UpdateDetail.

updateDetail

Обновляет деталь согласно переданным параметрам. По умолчанию содержит значение Terrasoft.emptyFn.

Параметры
{Object} config Конфигурационный объект, содержащий свойства детали.
initData

Инициализирует коллекцию данных представления реестра.

Параметры
{Function} callback Функция обратного вызова.
{Object} scope Контекст выполнения метода.
getEditPageName

Возвращает имя страницы записи в зависимости от типа выбранной записи (при редактировании) или от выбранного типа записи для добавления (при добавлении).

onDetailCollapsedChanged

Обработчик сворачивания или разворачивания детали.

Параметры
{Boolean} isCollapsed Признак свернутой/развернутой детали.
getToolsVisible

Возвращает значение свернутости детали.

getDetailInfo

Публикует сообщение для получения информации о детали.

Массив модификаций 

В массиве модификаций diff базовой детали определен только базовый контейнер для представления детали:

diff: /**SCHEMA_DIFF*/[
  // Базовый контейнер для представления детали.
  {
     "operation": "insert",
     "name": "Detail",
     "values": {...}
  }
]/**SCHEMA_DIFF*/
Схема BaseGridDetailV2
Сложный

Является наследником BaseDetailV2. Все детали с реестром должны быть наследниками BaseGridDetailV2. В схеме BaseGridDetailV2 реализована базовая логика работы с реестром (загрузка, фильтрация), удаление, добавление и редактирование записей на детали.

Процесс создания пользовательской детали с реестром подробно изложен в статье.

Сообщения 

Основные сообщения схемы BaseGridDetailV2 приведены в таблице.

Сообщения базовой детали с реестром
Название Режим Направление Описание
getCardInfo Адресное Подписка Возвращает информацию о странице записи — значения по умолчанию, название колонки типизации, значение колонки типизации.
CardSaved Широковещательное Подписка Обрабатывает сообщение сохранения страницы записи.
UpdateFilter Широковещательное Подписка Обновляет фильтры в детали.
GetColumnsValues Адресное Публикация

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

Виды режимов сообщений определены в перечислении Terrasoft.core.enums.MessageMode, а направление сообщений — в перечислении Terrasoft.core.enums.MessageDirectionType. Подробнее о них можно узнать из библиотеки классов клиентской части ядра платформы.

Атрибуты 

ActiveRow GUID

Значение первичной колонки активной записи реестра.

IsGridEmpty BOOLEAN

Признак того, что реестр пуст.

MultiSelect BOOLEAN

Признак, разрешен ли множественный выбор.

SelectedRows COLLECTION

Массив выбранных записей.

RowCount INTEGER

Количество строк в реестре.

IsPageable BOOLEAN

Признак активности постраничной загрузки.

SortColumnIndex INTEGER

Индекс колонки сортировки.

CardState TEXT

Режим открытия страницы записи.

EditPageUId GUID

Уникальный идентификатор страницы записи.

ToolsButtonMenu COLLECTION

Коллекция выпадающего списка функциональной кнопки.

DetailFilters COLLECTION

Коллекция фильтров детали.

IsDetailWizardAvailable BOOLEAN

Признак, что мастер детали доступен.

Возможные типы данных атрибутов представлены перечислением Terrasoft.DataValueType. Подробнее о типах данных детали можно узнать из библиотеки классов клиентской части ядра платформы.

Миксины 

GridUtilities Terrasoft.GridUtilities

Миксин для работы с реестром.

WizardUtilities Terrasoft.WizardUtilities

Миксин для работы с мастером деталей.

Подробнее миксин GridUtilities описан ниже.

Методы 

init 

Замещает метод класса BaseDetailV2. Вызывает логику метода init родителя, регистрирует сообщения, инициализирует фильтры.

Параметры
{Function} callback Функция обратного вызова.
{Object} scope Контекст выполнения метода.
initData 

Замещение метода класса BaseDetailV2. Вызывает логику метода initData родительского класса, инициализирует коллекцию данных представления реестра.

Параметры
{Function} callback Функция обратного вызова.
{Object} scope Контекст выполнения метода.
loadGripata 

Выполняет загрузку данных реестра.

initGripata 

Выполняет инициализацию значений по умолчанию для работы со списком.

getGripata 

Возвращает коллекцию реестра.

getFilters 

Возвращает коллекцию фильтров детали.

getActiveRow 

Возвращает идентификатор выбранной записи в реестре.

atdRecord 

Добавляет новую запись в реестр. Сохраняет страницу записи в случае необходимости.

Параметры
{String} editPageUId Идентификатор типизированной страницы записи.
copyRecord 

Копирует запись и открывает страницу записи.

Параметры
{String} editPageUId Идентификатор типизированной страницы записи.
editRecord 

Открывает страницу выбранной записи.

Параметры
{Object} record Модель записи для редактирования.
subscribeSandboxEvents 

Подписывается на сообщения, необходимые для работы детали.

updateDetail 

Замещение метода класса BaseDetailV2. Вызывает логику метода updateDetail родителя, обновляет деталь.

Параметры
{Object} config Конфигурационный объект, содержащий свойства детали.
openCard 

Открывает страницу записи.

Параметры
{String} operation Тип операции (добавление/редактирование).
{String} typeColumnValue Значение колонки типизации записи.
{String} recordId Идентификатор записи.
onCardSaved 

Обрабатывает событие сохранения страницы записи, в которой находится деталь.

atdToolsButtonMenuItems 

Добавляет элементы в коллекцию выпадающего списка функциональной кнопки.

Параметры
{Terrasoft.BaseViewModelCollection} toolsButtonMenu Коллекция выпадающего списка функциональной кнопки.
initDetailFilterCollection 

Инициализирует фильтр детали.

setFilter 

Устанавливает значение фильтров детали.

Параметры
{String} key Тип фильтров.
{Object} value Значение фильтров.
loadQuickFilter 

Загружает быстрый фильтр.

Параметры
{Object} config Параметры загрузки модуля фильтров.
destroy 

Очищает данные, выгружает деталь.

Массив модификаций 

В массиве модификаций diff базовой детали определен только базовый контейнер для представления детали:

Массив модификаций diff
diff: /**SCHEMA_DIFF*/ [
  {
    // Элемент для отображения реестра.
    "operation": "insert",
    "name": "DataGrid",
    "parentName": "Detail",
    "propertyName": "items",
    "values": {
      "itemType": Terrasoft.ViewItemType.GRID,
      …
    }
  },
  {
    // Кнопка дозагрузки реестра.
    "operation": "insert",
    "parentName": "Detail",
    "propertyName": "items",
    "name": "loadMore",
    "values": {
      "itemType": Terrasoft.ViewItemType.BUTTON,
      …
    }
  },
  {
    // Кнопка добавления записи.
    "operation": "insert",
    "name": "AddRecordButton",
    "parentName": "Detail",
    "propertyName": "tools",
    "values": {
      "itemType": Terrasoft.ViewItemType.BUTTON,
      …
    }
  },
  {
    // Кнопка добавления типизированной записи.
    "operation": "insert",
    "name": "AddTypedRecordButton",
    "parentName": "Detail",
    "propertyName": "tools",
    "values": {
      "itemType": Terrasoft.ViewItemType.BUTTON,
      …
    }
  },
  {
    // Меню детали.
    "operation": "insert",
    "name": "ToolsButton",
    "parentName": "Detail",
    "propertyName": "tools",
    "values": {
      "itemType": Terrasoft.ViewItemType.BUTTON,
      …
    }
  }
] /**SCHEMA_DIFF*/
Миксин GridUtilitiesV2
Сложный

GridUtilitiesV2 — миксин, реализующий логику работы с элементом управления "реестр". В классе Terrasoft.configuration.mixins.GridUtilities реализованы:

  1. Подписка на сообщения.
  2. Загрузка данных.
  3. Работа с реестром:
    • выбор записей (поиск активных);
    • добавление, удаление, редактирование записей;
    • установка фильтров;
    • сортировка;
    • экспорт в файл;
    • проверка прав доступа к записям реестра.

Методы 

init

Осуществляет подписку на события.

destroy

Очищает подписки на события.

loadGridData

Выполняет загрузку данных реестра.

beforeLoadGridData

Подготавливает модель представления перед загрузкой данных.

afterLoadGridData

Подготавливает модель представления после загрузки данных.

onGridDataLoaded

Обработчик события загрузки данных. Выполняется, когда сервер возвращает данные.

Параметры
{Object} response Результат выборки данных из БД.
addItemsToGridData

Добавляет коллекцию новых элементов в коллекцию реестра.

Параметры
{Object} dataCollection Коллекция новых элементов.
{Object} options Параметры добавления.
reloadGridData

Выполняет перезагрузку реестра.

initQueryOptions

Инициализирует настройки (постраничность, иерархичность) экземпляра запроса.

Параметры
{Terrasoft.EntitySchemaQuery} esq Запрос, в котором будут инициализированы необходимые настройки.
initQuerySorting

Инициализирует колонки сортировки.

Параметры
{Terrasoft.EntitySchemaQuery} esq Запрос, в котором будут инициализированы необходимые настройки.
prepareResponseCollection

Модифицирует коллекцию данных перед загрузкой в реестр.

Параметры
{Object} collection Коллекция элементов реестра.
getFilters

Возвращает примененные в данной схеме фильтры. Переопределяется в наследниках.

exportToFile

Экспортирует содержимое реестра в файл.

sortGrid

Выполняет сортировку в реестре.

Параметры
{String} tag Ключ, указывающий, каким образом пересортировать реестр.
deleteRecords

Инициирует удаление выбранных записей.

checkCanDelete

Проверяет возможность удаления записи.

Параметры
{Array} items Идентификаторы выбранных записей.
{Function} callback Функция обратного вызова.
{Object} scope Контекст выполнения метода.
onDeleteAccept

Выполняет удаление после подтверждения пользователем.

getSelectedItems

Возвращает выбранные записи в реестре.

removeGridRecords

Убирает из реестра удаленные записи.

Параметры
{Array} records Удаленные записи.
Модуль ConfigurationGrid
Сложный

Модуль ConfigurationGrid содержит реализацию элемента управления "Конфигурационный реестр". Класс Terrasoft.ConfigurationGrid является наследником класса Terrasoft.Grid.

Методы 

init

Инициализирует компонент. Осуществляет подписку на события.

activateRow

Выделяет строку и добавляет элементы редактирования.

Параметры
{String|Number} id Идентификатор строки реестра.
deactivateRow

Снимает выделение строки и удаляет элементы редактирования.

Параметры
{String|Number} id Идентификатор строки реестра.
formatCellContent

Форматирует данные ячейки строки.

Параметры
{Object} cell Ячейка.
{Object} data Данные.
{Object} column Конфигурация ячейки.
onUpdateItem

Обработчик события обновления записи.

Параметры
{Terrasoft.BaseViewModel} item Элемент коллекции.
onDestroy

Уничтожает реестр и его компоненты.

Модуль ConfigurationGridGenerator
Сложный

Класс Terrasoft.ConfigurationGridGenerator генерирует конфигурацию реестра и является наследником класса Terrasoft.ViewGenerator.

Методы 

addLinks

Переопределенный метод класса Terrasoft.ViewGenerator. В редактируемый реестр не будут добавлены ссылки.

generateGridCellValue

Переопределенный метод класса Terrasoft.ViewGenerator. Генерирует конфигурацию значения в ячейке.

Параметры
{Object} config Конфигурация колонки.
Модуль ConfigurationGridUtilities
Сложный

Класс Terrasoft.ConfigurationGridUtilities содержит методы инициализации модели представления строки реестра, обработки действий активной записи и обработки горячих клавиш.

Свойства 

currentActiveColumnName String

Имя текущей выделенной колонки.

columnsConfig Object

Конфигурация колонок.

systemColumns Array

Коллекция названий системных колонок.

Методы 

onActiveRowAction

Обрабатывает нажатие действия активной записи.

Параметры
{String} buttonTag Тег выбранного действия.
{String} primaryColumnValue Идентификатор активной записи.
saveRowChanges

Сохраняет запись.

Параметры
{Object} row Строка реестра.
{Function} [callback] Функция обратного вызова.
{Object} scope Контекст вызова функции обратного вызова.
activeRowSaved

Обрабатывает результат сохранения записи.

Параметры
{Object} row Строка реестра.
{Function} [callback] Функция обратного вызова.
{Object} scope Контекст вызова функции обратного вызова.
initActiveRowKeyMap

Инициализирует подписку на события нажатия кнопок в активной строке.

Параметры
{Array} keyMap Описание событий.
getCellControlsConfig

Возвращает конфигурацию элементов редактирования ячейки реестра.

Параметры
{Terrasoft.EntitySchemaColumn} entitySchemaColumn Колонка ячейки реестра.
copyRow

Копирует и добавляет запись в реестр.

Параметры
{String} recordId Идентификатор копируемой записи.
initEditableGridRowViewModel

Инициализирует классы элементов коллекции редактируемого реестра.

Параметры
{Function} [callback] Функция обратного вызова.
{Object} scope Контекст вызова функции обратного вызова.