Вопрос

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

Добрый день, коллеги.

Есть задача в разделе Обращения [Case] добавить справочник с множественным выбором.

Большая просьба подсказать, что я делаю не правильно?

1. Создал Объект, Название = [UsrTemplate], Заголовок = [Шаблоны].
Родительский объект = Базовый справочник

2. В объекте [Case] добавил Поле, тип справочник, Название = [UsrNewTemplateSpr].
Для поля [UsrNewTemplateSpr] в разделе Справочник выбрал значение [Шаблоны]

3. Наполнил справочник [Шаблоны] данными.

4. В схеме [CasePage] добавил код в разделе [methods]

methods: {

                      
    openUsrNewTemplateSprLookup: function() 
    {    
                        
        var config = 
        {
               entitySchemaName: "UsrTemplate",
               multiSelect: true,
               columns: ["Name"]
        };
        
                this.openLookup(config, this.addCallBack, this);
     },

 

    addCallBack: function(args) 
    {
        this.selectedRows = args.selectedRows.getItems();
        this.selectedItems = [];
        /// this.selectedRows.forEach(function(item) {}, this);
    },

},

5. Сохраняю схему,  но множественного выбора в разделе [Case] в справочнике [UsrNewTemplateSpr] так и не получилось сделать.

 

 

Очень надеюсь на обратную связь.

С уважением,

Дмитрий.

У меня такой же вопрос

25 комментариев

1) Привидите весь код страницы

2)  Поясните что значит

>но множественного выбора в разделе [Case] в справочнике [UsrNewTemplateSpr] так и не получилось

И как в раздел вы добавляете справочник?

Григорий Чех пишет:

1) Привидите весь код страницы

2)  Поясните что значит

>но множественного выбора в разделе [Case] в справочнике [UsrNewTemplateSpr] так и не получилось

И как в раздел вы добавляете справочник?

Григорий Чех,

Георгий, спасибо.

1) Код CasePage:

==

define("CasePage", [], function() {
    return {
        entitySchemaName: "Case",
        attributes: {},
        modules: /**SCHEMA_MODULES*/{}/**SCHEMA_MODULES*/,
        details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
        businessRules: /**SCHEMA_BUSINESS_RULES*/{
            "UsrNewTemplateSpr": {
                "88cf5000-655d-4765-969d-14b79c4b2a87": {
                    "uId": "88cf5000-655d-4765-969d-14b79c4b2a87",
                    "enabled": true,
                    "removed": false,
                    "ruleType": 1,
                    "baseAttributePatch": "UsrLogic",
                    "comparisonType": 3,
                    "type": 1,
                    "attribute": "UsrLogic"
                }
            },
            "UsrOldTemplateSpr": {
                "ebd03987-37ae-4531-9338-c87ee009dbc5": {
                    "uId": "ebd03987-37ae-4531-9338-c87ee009dbc5",
                    "enabled": true,
                    "removed": false,
                    "ruleType": 1,
                    "baseAttributePatch": "UsrLogic",
                    "comparisonType": 3,
                    "type": 1,
                    "attribute": "UsrLogic"
                }
            }
        }/**SCHEMA_BUSINESS_RULES*/,
        methods: {
                    
                    addCallBack: function(args) 
                    {
                            this.selectedRows = args.selectedRows.getItems();
                            this.selectedItems = [];
                            /// this.selectedRows.forEach(function(item) {}, this);
                    },
                    
                    openUsrNewTemplateSprLookup: function() 
                    {    
                        
                        var config = 
                        {
                            entitySchemaName: "UsrTemplate",
                            multiSelect: true,
                            columns: ["Name"]
                        };
                        
                        this.openLookup(config, this.addCallBack, this);
                     },
                     
                },
        dataModels: /**SCHEMA_DATA_MODELS*/{}/**SCHEMA_DATA_MODELS*/,
        diff: /**SCHEMA_DIFF*/[
            {
                "operation": "merge",
                "name": "ProcessingTab",
                "values": {
                    "order": 0
                }
            },
            {
                "operation": "merge",
                "name": "ESNTab",
                "values": {
                    "order": 5
                }
            },
            {
                "operation": "merge",
                "name": "SolutionTab",
                "values": {
                    "order": 1
                }
            },
            {
                "operation": "merge",
                "name": "SatisfactionLevelComment",
                "values": {
                    "layout": {
                        "colSpan": 24,
                        "rowSpan": 1,
                        "column": 0,
                        "row": 1
                    }
                }
            },
            {
                "operation": "merge",
                "name": "CaseInformationTab",
                "values": {
                    "order": 2
                }
            },
            {
                "operation": "insert",
                "name": "UsrLogic9f0f812c-bb72-4617-8c90-6f19661b00d1",
                "values": {
                    "layout": {
                        "colSpan": 24,
                        "rowSpan": 1,
                        "column": 0,
                        "row": 3,
                        "layoutName": "CaseInformation_gridLayout"
                    },
                    "bindTo": "UsrLogic"
                },
                "parentName": "CaseInformation_gridLayout",
                "propertyName": "items",
                "index": 3
            },
            {
                "operation": "insert",
                "name": "UsrNewTemplateSpr4dc847cf-00f3-4d64-a814-04acaed66407",
                "values": {
                    "layout": {
                        "colSpan": 12,
                        "rowSpan": 1,
                        "column": 0,
                        "row": 4,
                        "layoutName": "CaseInformation_gridLayout"
                    },
                    "bindTo": "UsrNewTemplateSpr"
                },
                "parentName": "CaseInformation_gridLayout",
                "propertyName": "items",
                "index": 4
            },
            {
                "operation": "insert",
                "name": "UsrNewTemplate953c074b-a456-4786-98d2-5abb6a3bf38d",
                "values": {
                    "layout": {
                        "colSpan": 12,
                        "rowSpan": 1,
                        "column": 12,
                        "row": 4,
                        "layoutName": "CaseInformation_gridLayout"
                    },
                    "bindTo": "UsrNewTemplate"
                },
                "parentName": "CaseInformation_gridLayout",
                "propertyName": "items",
                "index": 5
            },
            {
                "operation": "insert",
                "name": "UsrOldTemplateSpr402b5c7a-3848-4df4-b26f-dc8fa1e56c48",
                "values": {
                    "layout": {
                        "colSpan": 12,
                        "rowSpan": 1,
                        "column": 0,
                        "row": 5,
                        "layoutName": "CaseInformation_gridLayout"
                    },
                    "bindTo": "UsrOldTemplateSpr"
                },
                "parentName": "CaseInformation_gridLayout",
                "propertyName": "items",
                "index": 6
            },
            {
                "operation": "insert",
                "name": "UsrOldTemplate86822e69-1e25-442b-b648-ea0b5816675d",
                "values": {
                    "layout": {
                        "colSpan": 12,
                        "rowSpan": 1,
                        "column": 12,
                        "row": 5,
                        "layoutName": "CaseInformation_gridLayout"
                    },
                    "bindTo": "UsrOldTemplate"
                },
                "parentName": "CaseInformation_gridLayout",
                "propertyName": "items",
                "index": 7
            },
            {
                "operation": "merge",
                "name": "NotesFilesTab",
                "values": {
                    "order": 4
                }
            },
            {
                "operation": "move",
                "name": "ResoluitonContainer",
                "parentName": "ProfileContainer",
                "propertyName": "items",
                "index": 0
            },
            {
                "operation": "move",
                "name": "ServiceItem",
                "parentName": "ProfileContainer",
                "propertyName": "items",
                "index": 5
            },
            {
                "operation": "move",
                "name": "SolutionCaptionProfile",
                "parentName": "ResolutionGridLayout",
                "propertyName": "items",
                "index": 0
            },
            {
                "operation": "move",
                "name": "ParentCase",
                "parentName": "SolutionTab_gridLayout",
                "propertyName": "items",
                "index": 1
            },
            {
                "operation": "move",
                "name": "FirstSolutionProvidedOn",
                "parentName": "TermsControlGroup_GridLayout",
                "propertyName": "items",
                "index": 3
            }
        ]/**SCHEMA_DIFF*/
    };
});
 

==

 

2) Нет возможности выбрать несколько записей справочника, только одну

 

Григорий Чех,

3. И как в раздел вы добавляете справочник?

Справочник создавал через конфигурацию системы, добавлял справочник в раздел через Мастер разделов

mdv,

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

Андреев Андрей Сергеевич пишет:

mdv,

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

Андреев Андрей Сергеевич,

Андрей, спасибо, задача состоит в том,  чтобы можно было выбрать несколько записей из справочника, а дальше в функции  addCallBack: function(args)     { }  я выбранные записи сохраню в нужных дополнительных полях. 

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

Спасибо.

 

mdv, 

 

mdv пишет:
чтобы в разделе открывался справочник с возможностью мультивыбора?

что означает "в разделе"? насколько я понимаю заполнения поля происходят в карточке этого раздела.
Карточка вот так выглядит: 

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

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

Андреев Андрей Сергеевич,

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

Есть тип Обращений по актуализации Логик и Шаблонов, названия которых необходимо указать в обращении, в специально созданных текстовых полях. Затем в отчетах Excel удобно будет выбирать необходимую информацию по этому типу обращений с названиями логик и шаблонов.

 
Связь Логик и Шаблонов - одна (Логика) ко многим (Шаблоны).
Я настроил через бизнес-правила фильтр, чтобы при выборе значения в справочнике Логика, в справочнике Шаблоны отображаются все названия Шаблонов, которые связаны с выбранной Логикой.

На данный момент, задача заключается в следующем:
1. При открытии справочника "Шаблоны" сделать возможным выбор несколько записей.
2. Обработать значения выбранных записей из справочника "Шаблоны" и записать данные в дополнительно созданные текстовые поля в таблицу Обращение [CASE].

 

При открытии сейчас открывается справочник, как на рис.1.

Рис.1.

А хотелось, чтобы открывался справочник с мультивыбором, например, как на рис. 2  

Спасибо.

 

mdv,

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

Вместо лукапного поля Новые шаблоны(выбор) добавить кнопку с обработчиком при нажатии: 
 

// кнопка в массиве diff
{
    "operation": "insert",
    "parentName": "Header",
    "propertyName": "items",
    "name": "SelectTemplateButton",
    "values": {
        "itemType": Terrasoft.ViewItemType.BUTTON,
        "style": Terrasoft.controls.ButtonEnums.style.GREEN,
        "caption": {"bindTo": "Resources.Strings.SelectTemplateCaption"},
        "classes": {"textClass": "actions-button-margin-right"},
    // Тут обработчик
        "click": {"bindTo": "onOpenTemplateLookup"},
    // Размещение в контейнере страницы вместо своего поля
        "layout": {
            "colSpan": 10,
            "rowSpan": 1,
            "column": 0,
            "row": 5,
            "layoutName": "Header"
        }
    }
},

где в onOpenTemplateLookup:

 

onOpenTemplateButton: function {
    let config = {
        // Название схемы объекта, записи которого будут отображены в справочнике.
        entitySchemaName: "UseTemplates",
        // Возможность множественного выбора.
        multiSelect: true,
        // Колонки, которые будут использованы в справочнике, например, для сортировки.
        columns: ["Number", "Date", "Type"]
    };
    // Тут фильтры накладываешь свои
    let FiltersGroup = this.Terrasoft.createFilterGroup();
    config.filters = FiltersGroup;
    this.openLookup(config, this.addCallBack, this);
}

Ну потом все как всегда, в колбеке свою логику пишешь и всё.

Андреев Андрей Сергеевич,

Андрей, огромное спасибо за идею и реализацию, внесу изменения  и по результатам обязательно отпишусь. Хороших выходных!

Андреев Андрей Сергеевич,

Андрей, не отображается кнопка на странице [Case] на вкладке [Информация по обращению].

Как Вы и советовали я в схеме [CasePage] закомментировал  код справочника [Новые шаблоны (выбор)]. Справочник перестал отображаться.

    /*{
                "operation": "insert",
                "name": "UsrNewTemplateSpr4dc847cf-00f3-4d64-a814-04acaed66407",
                "values": {
                    "layout": {
                        "colSpan": 12,
                        "rowSpan": 1,
                        "column": 0,
                        "row": 5,
                        "layoutName": "CaseInformation_gridLayout"
                    },
                    "bindTo": "UsrNewTemplateSpr"
                },
                "parentName": "CaseInformation_gridLayout",
                "propertyName": "items",
                "index": 5
            },*/

Затем по аналогии добавил код для кнопки [SelectTemplateButton]

    {
                    "operation": "insert",
                    "parentName": "CaseInformation_gridLayout",
                    "name": "SelectTemplateButton",
                    "propertyName": "items",
                    "values": {
                                "itemType": Terrasoft.ViewItemType.BUTTON,
                                "style": Terrasoft.controls.ButtonEnums.style.GREEN,
                                "caption": {"bindTo": "Resources.Strings.SelectTemplateCaption"},
                                "classes": {"textClass": "actions-button-margin-right"},
                                "click": {"bindTo": "onOpenTemplateButton"},
                                "layout": {
                                    "colSpan": 12,
                                    "rowSpan": 1,
                                    "column": 0,
                                    "row": 5,
                                    "layoutName": "CaseInformation_gridLayout"
                                },
                               "bindTo": "SelectTemplateButton",
                               },
                    "index": 5
            },

В чем моя ошибка, почему кнопка не отображается  на странице [Case] на вкладке [Информация по обращению]?

Спасибо.

Андрей, хотя в дизайнере страницы кнопка присутствует

 

 

mdv,

"caption": {"bindTo": "Resources.Strings.SelectTemplateCaption"},

Это локализованная строчка в схеме карточки и скорее всего у тебя её нет. Тебе нужно её добавить.
Сюда: 

Название должно быть равно SelectTemplateCaption ну и значение сам подберешь. 

Андреев Андрей Сергеевич,

Спасибо, 

SelectTemplateCaption нужно добавить в модуль BaseModulePageV2?

Андреев Андрей Сергеевич,

Андрей, огромное спасибо.

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

Осталось настроить фильтрацию справочника [Шаблоны] по выбранному предварительно значению из справочника [Логики].

 

Спасибо.

 

mdv,

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

Про фильтрацию можно почитать тут.
Фильтр может выглядеть так: 

 

// UsrLogic название твоего поля в Entity Case и шаблонов
const LogicId = this.get("UsrLogic").value;
config.filters = Terrasoft.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL, "UsrLogic", LogicId);

Андреев Андрей Сергеевич,

Огромное спасибо!!!

mdv,

Андреев Андрей Сергеевич,

Андрей, а можно реализовать фильтрацию многие ко многим?

Например, если я выбираю несколько логик, то при выборе шаблонов должны быть доступны только те шаблоны, которые связаны с выбранными логиками?

Я по аналогии с [Шаблонами] сделал кнопку для мультивыбора [Логики].

Для этого удалили в объекте [Case] поле справочник [UsrLogic], который был связан с объектом [UsrLogic].

По кнопке у меня открывается для мультивыбора содержимое объекта [UsrLogic].

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

onOpenTemplateButton: function () 
                    {
                        let config = {
                            
                            entitySchemaName: "UsrTemplate",
                            multiSelect: true,
                            columns: ["Name"]
                        };
                            
                        let FiltersGroup = this.Terrasoft.createFilterGroup();
                        config.filters = FiltersGroup;
                        this.openLookup(config, this.addCallBack, this);
                        
                        const LogicId = this.get("UsrLogic").value;
                        config.filters = Terrasoft.createColumnFilterWithParameter
                        (Terrasoft.ComparisonType.EQUAL, "Usrlogic", LogicId);

                    },
 

Спасибо.

 

mdv,

// Массив для Id-шек твоей логики которые ты должен сюда записать и потом фильтр что ниже прикрепить для фильтрации шаблонов.
let logicIds = [];
// .... тут должно быть заполнение массива. 
let logicFilters = this.Terrasoft.createColumnInFilterWithParameters("UsrLogic", logicIds);
 
config.filters.add(logicFilter);

в колбеке выбора логик записывай выбранные записи сразу в массив logicIds или перед этим в атрибут. Про атрибуты можно почитать тут.

Андреев Андрей Сергеевич,

Андрей, спасибо.

Можно пару вопросов?

У меня нет ID-шек у объекта  [Логики]. Есть только поля [Название] и [Описание] .

У объекта [Шаблоны] есть поля  [Название], [Описание] и [UsrLogic]

Справочники [Логики] и [Шаблоны] связаны по полям

[Шаблоны].[UsrLogic]  и [Логики].[Название]

Я правильно понимаю, что мне нужно в колбеке логик собрать массив из выбранных из справочника  [Логики].[Название]?

т.е. 

addCallBackNewLogic: function(args) 
{
    var items = args.selectedRows.collection.items;
    var count = 0;
    let logicIds = [];
    Terrasoft.each(items, function (item) {
                    logicIds [count] = item.displayValue;
                    count++;
                      }, this);
},

 

Спасибо.

mdv, 

 

Что-то мне не верится что у тебя нету Id(-шек). Скрин Entity Логики и Шаблонов скинь.
Что-то такое должно у тебя быть, если ты от базового(-ых) объектов наследовался: 

 

Даже если, как ты говоришь, у тебя нету Id(-шек), тогда можно сделать следующим образом:
1. Оставить кнопку только выбрать шаблоны.
2. При нажатии открывается справочник выбор логик. 
3. В колбеке выбора логик получается коллекция имен в дебагере можешь узнать как именно её получить. Далее, вызывается метод в который ты передаешь массив и по нему фильтруешь шаблоны и открываешь окно выбора.
4. А дальше все по плану.
 

Андреев Андрей Сергеевич,

Андрей, спасибо. С вами скоро станешь "монстром" в справочниках. :)

Спасибо за очередную идею, попробую реализовать.

Вот скрины, оба объекта от базового справочника. Нo ID не отображается.

 

 

 

 

mdv,

Раз: 

Два: 

и должны появится твои колонки в том числе и Id. 

Андреев Андрей Сергеевич пишет:

mdv, 

Что-то мне не верится что у тебя нету Id(-шек). Скрин Entity Логики и Шаблонов скинь.
Что-то такое должно у тебя быть, если ты от базового(-ых) объектов наследовался: 

Даже если, как ты говоришь, у тебя нету Id(-шек), тогда можно сделать следующим образом:
1. Оставить кнопку только выбрать шаблоны.
2. При нажатии открывается справочник выбор логик. 
3. В колбеке выбора логик получается коллекция имен в дебагере можешь узнать как именно её получить. Далее, вызывается метод в который ты передаешь массив и по нему фильтруешь шаблоны и открываешь окно выбора.
4. А дальше все по плану.
 

Андреев Андрей Сергеевич,

Андрей, огромнейшее спасибо, реализовал вашу последнюю идею, всё получилось шикарно.

mdv,

Пожалуйста!
*Если не делал на основании Id, то лучше переделать на Id. 

Андреев Андрей Сергеевич,

понял, спасибо!

Войдите или зарегистрируйтесь, чтобы комментировать