Профиль связанной сущности

PDF
Сложный

Элемент управления Профиль связанной сущности (класс Profile) — это конфигурационный модуль, который по умолчанию представляет собой информационный блок, наполняемый при загрузке страницы записи информацией о связанной Entity-сущности. В системе этот элемент используется как профиль связанной записи на странице записи раздела. Например, при открытии страницы записи раздела Контакт в элементе Профиль отобразится профиль контакта и информация о связанном контрагенте (связь по колонке Контрагент объекта Контакт). Подробнее о профилях записи и связанной записи можно узнать из статьи.

Классы, реализующие функциональность 

Родительским классом для класса Profile является BaseProfileSchema — базовая схема для создания любых профилей связанных записей в системе.

Профиль объекта Контакт
Связанный с контактом профиль связанной сущности Контрагент

Родительским классом для класса Profile является BaseProfileSchema — базовая схема для создания любых профилей связанных записей в системе.

Важно. Все профили должны наследоваться от BaseProfileSchema.

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

Способ описания представления ничем не отличается от страницы записи, т.е. описывается свойством diff. При встраивании модуля в страницу записи в атрибутах модуля необходимо указать параметр masterColumnName, в котором хранится название колонки, по которой происходит связь профиля с основной схемой страницы записи. Опираясь на значение этой колонки, Profile будет загружать данные.

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

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

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

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

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

Устройство BaseProfileSchema 

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

  • OpenCard — инициирует открытие страницы добавления записи, используя стандартный механизм.
  • UpdateCardProperty — обновляет значение атрибута страницы записи.
  • GetColumnInfo — возвращает информацию о поле связи.
  • GetColumnsValues — возвращает значения запрошенных колонок страницы записи.
  • GetEntityColumnChanges — подписка на изменение данных на странице записи.
  • CardModuleResponse — результат добавления новой записи через профиль.

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

Схема профиля BaseMultipleProfileSchema 

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

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

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

Пример конфигурации схемы профиля
Сложный

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

Реализация примера 

Конфигурация схемы профиля представлена ниже.

ContactProfileSchema
define("ContactProfileSchema", ["ProfileSchemaMixin"],
function () {
    return {
        // Название схемы объекта.
        entitySchemaName: "Contact",
        // Миксины.
        mixins: {
            // Миксин, содержащий функции для получения иконок и картинок профиля.
            ProfileSchemaMixin: "Terrasoft.ProfileSchemaMixin"
        },
        // Массив модификаций diff.
        diff: /**SCHEMA_DIFF*/[
            {
                // Операция вставки.
                "operation": "insert",
                // Имя сущности.
                "name": "Account",
                // Имя родительского элемента, в который производится вставка.
                "parentName": "ProfileContentContainer",
                // Свойство элемента родителя, с которым производится операция.
                "propertyName": "items",
                // Значения вставляемого элемента.
                "values": {
                    // Привязка к значению свойства Account объекта Contact.
                    "bindTo": "Account",
                    // Конфигурация разметки. Позиционирование элемента.
                    "layout": {
                        "column": 5,
                        "row": 1,
                        "colSpan": 19
                    }
                }
            }
            // ...Другие конфигурационные объекты массива модификаций.
        ]/**SCHEMA_DIFF*/
    };
});
Пример встраивания профиля в страницу записи
Сложный

Пример. Выполнить встраивание профиля на страницу записи.

Реализация примера 

Встраивание профиля на страницу записи представлено ниже.

ContactPageV2
    //Определение схемы страницы записи и ее зависимостей.
    define("ContactPageV2", ["BaseFiltersGenerateModule", "BusinessRuleModule", "ContactPageV2Resources",
                "ConfigurationConstants", "ContactCareer", "DuplicatesSearchUtilitiesV2"],
    function (BaseFiltersGenerateModule, BusinessRuleModule, resources, ConfigurationConstants, ContactCareer) {
        return {
            entitySchemaName: "Contact",
            // Используемые модули.  
            modules: /**SCHEMA_MODULES*/{
                // Модуль профиля контрагента.
                "AccountProfile": {
                    // Конфигурация профиля.
                    "config": {
                        // Название схемы.
                        "schemaName": "AccountProfileSchema",
                        // Признак, сообщающий о том, что конфигурация схемы проинициализирована.
                        "isSchemaConfigInitialized": true,
                        // Признак, сообщающий о том, что не используется HistoryState.
                        "useHistoryState": false,
                        // Параметры профиля.
                        "parameters": {
                            // Конфигурация модели представления.
                            "viewModelConfig": {
                                // Название колонки связанной сущности.
                                masterColumnName: "Account"
                            }
                        }
                    }
                }
            }/**SCHEMA_MODULES*/,
            // Массив модификаций.
            diff: /**SCHEMA_DIFF*/[
                {
                    "operation": "insert",
                    "parentName": "LeftModulesContainer",
                    "propertyName": "items",
                    // Название профиля.
                    "name": "AccountProfile",
                    // Значения.
                    "values": {
                        // Тип элемента — модуль.
                        "itemType": Terrasoft.ViewItemType.MODULE
                    }
                }
            ]/**SCHEMA_DIFF*/
        };
    });
    

Схема профиля BaseMultipleProfileSchema 

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

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

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

    // Определение профиля.
    define("ClientProfileSchema", ["ProfileSchemaMixin"],
    function () {
        return {
            // Миксины.
            mixins: {
                ProfileSchemaMixin: "Terrasoft.ProfileSchemaMixin"
            },
            // Атрибуты.
            attributes: {
                // Видимость профиля контакта.
                "IsVisibleContactProfile": {
                    dataValueType: this.Terrasoft.DataValueType.BOOLEAN,
                    value: true
                }
            },
            // Методы.
            methods: {
                // Дата-маркер. Нужен для автотестов.
                getProfileModuleContainerDataMarker: function () {
                    return "client-profile-module-container";
                },
                // Возвращает заголовок.
                getBlankSlateHeaderCaption: function () {
                    return this.get("Resources.Strings.Client");
                },
                // Возвращает иконку-предупреждение.
                getWarningIcon: function () {
                    return this.getImageUrlByResourceKey("Resources.Images.WarningIcon");
                },
                // Проверка для отображения предупреждения.
                getIsVisibleWarning: function () {
                    var masterColumnNames = this.get("MasterColumnNames");
                    if (!masterColumnNames) {
                        return false;
                    }
                    var masterColumnValues = masterColumnNames.filter(function (columnName) {
                        var value = this.get(columnName);
                        return !this.Ext.isEmpty(value);
                    }, this);
                    return masterColumnValues.length > 1;
                },
                // Обработчик события изменения колонки профиля. 
                onProfileColumnChanged: function () {
                    this.set("IsVisibleContactProfile", !this.getIsVisibleWarning());
                    return this.callParent(arguments);
                },
                // Обработчик события изменения колонки.
                onColumnChanged: function () {
                    this.callParent(arguments);
                    this.set("IsVisibleContactProfile", !this.getIsVisibleWarning());
                },
                // Подсказка для кнопки [Очистить].
                getClearButtonHint: function () {
                    var clearActionCaption = this.get("Resources.Strings.ClearButtonCaption");
                    var masterColumnCaption = this.get("Resources.Strings.Client");
                    return this.Ext.String.format("{0} {1}", clearActionCaption, masterColumnCaption);
                }
            },
            // Модули схемы.
            modules: /**SCHEMA_MODULES*/{
                // Встраиваемый клиентский профиль контрагента.
                "AccountClientProfile": {
                    // Конфигурация профиля.
                    "config": {
                        "schemaName": "ClientAccountProfileSchema",
                        "isSchemaConfigInitialized": true,
                        "useHistoryState": false,
                        "parameters": {
                            "viewModelConfig": {
                                masterColumnName: "Account"
                            }
                        }
                    }
                },
                // Встраиваемый клиентский профиль контакта.
                "ContactClientProfile": {
                    "config": {
                        "schemaName": "ClientContactProfileSchema",
                        "isSchemaConfigInitialized": true,
                        "useHistoryState": false,
                        "parameters": {
                            "viewModelConfig": {
                                masterColumnName: "Contact"
                            }
                        }
                    }
                }
            }/**SCHEMA_MODULES*/,
            // Модификации отображения профиля.
            diff: /**SCHEMA_DIFF*/[
               {
                   "operation": "remove",
                   "name": "ProfileIcon"
               },
               {
                   "operation": "remove",
                   "name": "ProfileHeaderContainer"
               },
               {
                   "operation": "insert",
                   "name": "ClientProfilesContainer",
                   "parentName": "ProfileContentContainer",
                   "propertyName": "items",
                   "values": {
                       "itemType": this.Terrasoft.ViewItemType.CONTAINER,
                       "items": [],
                       "layout": {
                           "column": 0,
                           "row": 0,
                           "colSpan": 24,
                           "rowSpan": 24
                       }
                   }
               },
               {
                   "operation": "insert",
                   "name": "WarningIcon",
                   "parentName": "ClientProfilesContainer",
                   "propertyName": "items",
                   index: 0,
                   "values": {
                       "getSrcMethod": "getWarningIcon",
                       "readonly": true,
                       "generator": "ImageCustomGeneratorV2.generateSimpleCustomImage",
                       "visible": { "bindTo": "getIsVisibleWarning" },
                       "classes": {
                           "wrapClass": ["warning-icon"]
                       },
                       "hint": { "bindTo": "Resources.Strings.WarningMessage" }
                   }
               },
               {
                   "operation": "insert",
                   "parentName": "ClientProfilesContainer",
                   "propertyName": "items",
                   "name": "AccountClientProfile",
                   "values": {
                       "itemType": this.Terrasoft.ViewItemType.MODULE
                   }
               },
               {
                   "operation": "insert",
                   "parentName": "ClientProfilesContainer",
                   "propertyName": "items",
                   "name": "ContactClientProfile",
                   "values": {
                       "itemType": this.Terrasoft.ViewItemType.MODULE,
                       "visible": { "bindTo": "IsVisibleContactProfile" }
                   }
               }
            ]/**SCHEMA_DIFF*/
        };
    }
    );
    
    define("ClientContactProfileSchema", ["ProfileSchemaMixin"],
    function () {
        return {
            // Название схемы объекта.
            entitySchemaName: "Contact",
            // Миксины.
            mixins: {
                ProfileSchemaMixin: "Terrasoft.ProfileSchemaMixin"
            },
            // Методы.
            methods: {
                getProfileHeaderCaption: function () {
                    return this.get("Resources.Strings.ProfileHeaderCaption");
                }
            },
            // Массив модификаций.
            diff: /**SCHEMA_DIFF*/[
               {
                   "operation": "insert",
                   "name": "Account",
                   "parentName": "ProfileContentContainer",
                   "propertyName": "items",
                   "values": {
                       "bindTo": "Account",
                       "enabled": false,
                       "layout": {
                           "column": 5,
                           "row": 1,
                           "colSpan": 19
                       }
                   }
               },
               {
                   "operation": "insert",
                   "name": "Job",
                   "parentName": "ProfileContentContainer",
                   "propertyName": "items",
                   "values": {
                       "bindTo": "Job",
                       "enabled": false,
                       "layout": {
                           "column": 5,
                           "row": 2,
                           "colSpan": 19
                       }
                   }
               },
               {
                   "operation": "insert",
                   "name": "Type",
                   "parentName": "ProfileContentContainer",
                   "propertyName": "items",
                   "values": {
                       "bindTo": "Type",
                       "enabled": false,
                       "layout": {
                           "column": 5,
                           "row": 3,
                           "colSpan": 19
                       }
                   }
               },
               {
                   "operation": "insert",
                   "name": "MobilePhone",
                   "parentName": "ProfileContentContainer",
                   "propertyName": "items",
                   "values": {
                       "bindTo": "MobilePhone",
                       "enabled": false,
                       "layout": {
                           "column": 5,
                           "row": 4,
                           "colSpan": 19
                       }
                   }
               },
               {
                   "operation": "insert",
                   "name": "Phone",
                   "parentName": "ProfileContentContainer",
                   "propertyName": "items",
                   "values": {
                       "bindTo": "Phone",
                       "enabled": false,
                       "layout": {
                           "column": 5,
                           "row": 5,
                           "colSpan": 19
                       }
                   }
               },
               {
                   "operation": "insert",
                   "name": "Email",
                   "parentName": "ProfileContentContainer",
                   "propertyName": "items",
                   "values": {
                       "bindTo": "Email",
                       "enabled": false,
                       "layout": {
                           "column": 5,
                           "row": 6,
                           "colSpan": 19
                       }
                   }
               }
            ]/**SCHEMA_DIFF*/
        };
    });
    

Пример встраивания модуля клиентского профиля на страницу записи 

Встраивание модуля клиентского профиля на страницу записи
    // Модули страницы записи.
    modules: /**SCHEMA_MODULES*/{
        // Название модуля.
        "ClientProfile": {
            // Конфигурация.
            "config": {
                // Признак,сообщающий о том, что конфигурация схемы проинициализирована.
                "isSchemaConfigInitialized": true,
                // Признак, сообщающий о том, что не используется HistoryState.
                "useHistoryState": false,
                // Имя схемы.
                "schemaName": "ClientProfileSchema",
                // Параметры.
                "parameters": {
                    // Конфигурация модели представления.
                    "viewModelConfig": {
                        // Название колонки связанной сущности.
                        "masterColumnName": "Client"
                    }
                }
            }
        }
    }/**SCHEMA_MODULES*/,
    // Массив модификаций diff.
    diff: /**SCHEMA_DIFF*/[
       {
           "operation": "insert",
           // Название профиля.
           "name": "ClientProfile",
           "parentName": "LeftModulesContainer",
           "propertyName": "items",
           // Значения.
           "values": {
               // Тип элемента — модуль.
               "itemType": Terrasoft.ViewItemType.MODULE
           }
       }
    ]/**SCHEMA_DIFF*/
    
Пример модуля клиентского профиля BaseMultipleProfileSchema
Сложный

Пример. Выполнить реализацию модуля клиентского профиля BaseMultipleProfileSchema.

Реализация примера 

Реализация модуля клиентского профиля BaseMultipleProfileSchema представлена ниже.

BaseMultipleProfileSchema
// Определение профиля.
define("ClientProfileSchema", ["ProfileSchemaMixin"],
function () {
    return {
        // Миксины.
        mixins: {
            ProfileSchemaMixin: "Terrasoft.ProfileSchemaMixin"
        },
        // Атрибуты.
        attributes: {
            // Видимость профиля контакта.
            "IsVisibleContactProfile": {
                dataValueType: this.Terrasoft.DataValueType.BOOLEAN,
                value: true
            }
        },
        // Методы.
        methods: {
            // Дата-маркер. Нужен для автотестов.
            getProfileModuleContainerDataMarker: function () {
                return "client-profile-module-container";
            },
            // Возвращает заголовок.
            getBlankSlateHeaderCaption: function () {
                return this.get("Resources.Strings.Client");
            },
            // Возвращает иконку-предупреждение.
            getWarningIcon: function () {
                return this.getImageUrlByResourceKey("Resources.Images.WarningIcon");
            },
            // Проверка для отображения предупреждения.
            getIsVisibleWarning: function () {
                var masterColumnNames = this.get("MasterColumnNames");
                if (!masterColumnNames) {
                    return false;
                }
                var masterColumnValues = masterColumnNames.filter(function (columnName) {
                    var value = this.get(columnName);
                    return !this.Ext.isEmpty(value);
                }, this);
                return masterColumnValues.length > 1;
            },
            // Обработчик события изменения колонки профиля. 
            onProfileColumnChanged: function () {
                this.set("IsVisibleContactProfile", !this.getIsVisibleWarning());
                return this.callParent(arguments);
            },
            // Обработчик события изменения колонки.
            onColumnChanged: function () {
                this.callParent(arguments);
                this.set("IsVisibleContactProfile", !this.getIsVisibleWarning());
            },
            // Подсказка для кнопки [Очистить].
            getClearButtonHint: function () {
                var clearActionCaption = this.get("Resources.Strings.ClearButtonCaption");
                var masterColumnCaption = this.get("Resources.Strings.Client");
                return this.Ext.String.format("{0} {1}", clearActionCaption, masterColumnCaption);
            }
        },
        // Модули схемы.
        modules: /**SCHEMA_MODULES*/{
            // Встраиваемый клиентский профиль контрагента.
            "AccountClientProfile": {
                // Конфигурация профиля.
                "config": {
                    "schemaName": "ClientAccountProfileSchema",
                    "isSchemaConfigInitialized": true,
                    "useHistoryState": false,
                    "parameters": {
                        "viewModelConfig": {
                            masterColumnName: "Account"
                        }
                    }
                }
            },
            // Встраиваемый клиентский профиль контакта.
            "ContactClientProfile": {
                "config": {
                    "schemaName": "ClientContactProfileSchema",
                    "isSchemaConfigInitialized": true,
                    "useHistoryState": false,
                    "parameters": {
                        "viewModelConfig": {
                            masterColumnName: "Contact"
                        }
                    }
                }
            }
        }/**SCHEMA_MODULES*/,
        // Модификации отображения профиля.
        diff: /**SCHEMA_DIFF*/[
           {
               "operation": "remove",
               "name": "ProfileIcon"
           },
           {
               "operation": "remove",
               "name": "ProfileHeaderContainer"
           },
           {
               "operation": "insert",
               "name": "ClientProfilesContainer",
               "parentName": "ProfileContentContainer",
               "propertyName": "items",
               "values": {
                   "itemType": this.Terrasoft.ViewItemType.CONTAINER,
                   "items": [],
                   "layout": {
                       "column": 0,
                       "row": 0,
                       "colSpan": 24,
                       "rowSpan": 24
                   }
               }
           },
           {
               "operation": "insert",
               "name": "WarningIcon",
               "parentName": "ClientProfilesContainer",
               "propertyName": "items",
               index: 0,
               "values": {
                   "getSrcMethod": "getWarningIcon",
                   "readonly": true,
                   "generator": "ImageCustomGeneratorV2.generateSimpleCustomImage",
                   "visible": { "bindTo": "getIsVisibleWarning" },
                   "classes": {
                       "wrapClass": ["warning-icon"]
                   },
                   "hint": { "bindTo": "Resources.Strings.WarningMessage" }
               }
           },
           {
               "operation": "insert",
               "parentName": "ClientProfilesContainer",
               "propertyName": "items",
               "name": "AccountClientProfile",
               "values": {
                   "itemType": this.Terrasoft.ViewItemType.MODULE
               }
           },
           {
               "operation": "insert",
               "parentName": "ClientProfilesContainer",
               "propertyName": "items",
               "name": "ContactClientProfile",
               "values": {
                   "itemType": this.Terrasoft.ViewItemType.MODULE,
                   "visible": { "bindTo": "IsVisibleContactProfile" }
               }
           }
        ]/**SCHEMA_DIFF*/
    };
}
);
Пример встраиваемого клиентского профиля BaseRelatedProfileSchema
Сложный

Пример. Выполнить встраивание клиентского профиля BaseRelatedProfileSchema.

Реализация примера 

Встраивание клиентского профиля BaseRelatedProfileSchema представлена ниже.

BaseMultipleProfileSchema
define("ClientContactProfileSchema", ["ProfileSchemaMixin"],
function () {
    return {
        // Название схемы объекта.
        entitySchemaName: "Contact",
        // Миксины.
        mixins: {
            ProfileSchemaMixin: "Terrasoft.ProfileSchemaMixin"
        },
        // Методы.
        methods: {
            getProfileHeaderCaption: function () {
                return this.get("Resources.Strings.ProfileHeaderCaption");
            }
        },
        // Массив модификаций.
        diff: /**SCHEMA_DIFF*/[
           {
               "operation": "insert",
               "name": "Account",
               "parentName": "ProfileContentContainer",
               "propertyName": "items",
               "values": {
                   "bindTo": "Account",
                   "enabled": false,
                   "layout": {
                       "column": 5,
                       "row": 1,
                       "colSpan": 19
                   }
               }
           },
           {
               "operation": "insert",
               "name": "Job",
               "parentName": "ProfileContentContainer",
               "propertyName": "items",
               "values": {
                   "bindTo": "Job",
                   "enabled": false,
                   "layout": {
                       "column": 5,
                       "row": 2,
                       "colSpan": 19
                   }
               }
           },
           {
               "operation": "insert",
               "name": "Type",
               "parentName": "ProfileContentContainer",
               "propertyName": "items",
               "values": {
                   "bindTo": "Type",
                   "enabled": false,
                   "layout": {
                       "column": 5,
                       "row": 3,
                       "colSpan": 19
                   }
               }
           },
           {
               "operation": "insert",
               "name": "MobilePhone",
               "parentName": "ProfileContentContainer",
               "propertyName": "items",
               "values": {
                   "bindTo": "MobilePhone",
                   "enabled": false,
                   "layout": {
                       "column": 5,
                       "row": 4,
                       "colSpan": 19
                   }
               }
           },
           {
               "operation": "insert",
               "name": "Phone",
               "parentName": "ProfileContentContainer",
               "propertyName": "items",
               "values": {
                   "bindTo": "Phone",
                   "enabled": false,
                   "layout": {
                       "column": 5,
                       "row": 5,
                       "colSpan": 19
                   }
               }
           },
           {
               "operation": "insert",
               "name": "Email",
               "parentName": "ProfileContentContainer",
               "propertyName": "items",
               "values": {
                   "bindTo": "Email",
                   "enabled": false,
                   "layout": {
                       "column": 5,
                       "row": 6,
                       "colSpan": 19
                   }
               }
           }
        ]/**SCHEMA_DIFF*/
    };
});
Пример встраивания модуля клиентского профиля на страницу записи
Сложный

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

Реализация примера 

Встраивание модуля клиентского профиля на страницу записи представлено ниже.

Встраивание модуля клиентского профиля на страницу записи
    // Модули страницы записи.
    modules: /**SCHEMA_MODULES*/{
        // Название модуля.
        "ClientProfile": {
            // Конфигурация.
            "config": {
                // Признак,сообщающий о том, что конфигурация схемы проинициализирована.
                "isSchemaConfigInitialized": true,
                // Признак, сообщающий о том, что не используется HistoryState.
                "useHistoryState": false,
                // Имя схемы.
                "schemaName": "ClientProfileSchema",
                // Параметры.
                "parameters": {
                    // Конфигурация модели представления.
                    "viewModelConfig": {
                        // Название колонки связанной сущности.
                        "masterColumnName": "Client"
                    }
                }
            }
        }
    }/**SCHEMA_MODULES*/,
    // Массив модификаций diff.
    diff: /**SCHEMA_DIFF*/[
       {
           "operation": "insert",
           // Название профиля.
           "name": "ClientProfile",
           "parentName": "LeftModulesContainer",
           "propertyName": "items",
           // Значения.
           "values": {
               // Тип элемента — модуль.
               "itemType": Terrasoft.ViewItemType.MODULE
           }
       }
    ]/**SCHEMA_DIFF*/