Creatio development guide
PDF
Документация по разработке

Создание детали с выбором из справочника

Glossary Item Box

Общие положения

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

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

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

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

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

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

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

Исходный код

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

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

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 можно узнать из статьи "Использование 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.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. — Результат выполнения примера

Смотрите также:

© Terrasoft 2002-2019.

Был ли данный материал полезен?

Как можно улучшить эту статью?