Здравствуйте, возможно ли открыть страницу записи детали по URL ссылке, используя Id записи?



Проблема, на странице редактирования "Контакта" есть деталь, хотелось бы получить url записей этой детали, при открытии детали в адресной строке браузера по прежнему такое 



http://[someSite]/Nui/ViewModule.aspx#CardModuleV2/ContactPageV2/edit/a36a54a2-3c6c-44eb-aa2f-a7e75305270a , 



не url детали.

Спасибо

Нравится

2 комментария
Лучший ответ

Добрый день!

Да, BPM не меняет адрес в адресной строке.

Адрес записи детали будет следующим:

ttp://[someSite]/Nui/ViewModule.aspx#CardModuleV2/[Страница редактирования записи детали]/edit/[Id записи детали]

Добрый день!

Да, BPM не меняет адрес в адресной строке.

Адрес записи детали будет следующим:

ttp://[someSite]/Nui/ViewModule.aspx#CardModuleV2/[Страница редактирования записи детали]/edit/[Id записи детали]

Сидоров Александр В.,

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

Показать все комментарии

Здравствуйте!

Есть три сущности:

Order (id)

OrderProduct (id, OrderId, usrDocumentId)

usrDocument (id, usrName)

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

В sql запрос выглядит следующим образом:

Select d.Name

from Order o

join OrderProduct op on op.OrderId = o.id

join Document d on d.id = op.DocumentId

 

Как правильно прописать связь в detailColumn?

            "DocumentsDetail": {

                "schemaName": "DocumentsDetailV2",

                "entitySchemaName": "Document",

                "filter": {

                    "masterColumn": "Id",

                    "detailColumn": "Связь"

                },

            },

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

 

Ответ: в detailColumn  нужно прописать: [OrderProduct:Document:Id].Order

Нравится

6 комментариев
Лучший ответ
Павел, в detailColumn нужно прописать следующее выражение
detailColumn: "[OrderProduct:Order:Id].Document"

 

Вам нужно реализовать Ваш метод фильтрации, добавив свойство 'filterMethod' при объявлении детали и в методах реализовать нужную фильтрацию.

Для примера в базовой конфигурации можете посмотреть реализацию для детали Relationships в AccountPageV2.

Спасибо, думал об этом, но стало не на много легче, т.к. не очень понимаю как перевести sql запрос в формат esq.

            declare orderId = id_заказ

            

            Select d.usrName

            from usrDocument d

            join OrderProduct op on op.DocumentId = d.id

            where op.OrderId = orderId

Павел, в detailColumn нужно прописать следующее выражение
detailColumn: "[OrderProduct:Order:Id].Document"

 

Трефилов Павел Сергеевич,

Выше Александр привел пример построения связей.

Вы можете реализовать Вашу задачу либо способом предложенным мной, либо Александром.

В данном случае решение, предложенное Александром 'более красивое' yes

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

Связь строится по следующему принципу:

[Имя_присоединяемой_схемы:Имя_колонки_для_связи_присоединяемой_схемы:Имя_колонки_для_связи_текущей_схемы].Колонка_присоединяемой_схемы

Значит связь выглядит так [OrderProduct:Document:Id].Order

Видимо запрос в первом посте ввел в заблуждение Александра.

Трефилов Павел Сергеевич,

Вот в этом и заключается сила community smiley

Совместными усилиями и знаниями нашли самое подходящее решение!

Показать все комментарии

Всем доброго времени суток!

Добавляю деталь в мобильное приложение - http://prntscr.com/mx7ioh

добавлял следующим образом:

 

Terrasoft.sdk.Details.add("Activity", {
	name: "WaConsultationSubjectInVisitDetail",
	title: "WaConsultationSubjectInVisitCaption",
	model: "WaConsultationSubjectInVisit",
	parentColumnName: "Activity",
	masterColumnName: "Id",
	position: 0
});

Модуль зарегистрировал в манифесте.

так же добавил отображение грида для детали:

 

Terrasoft.sdk.GridPage.setTitle("WaConsultationSubjectInVisit", "WaConsultationSubjectInVisitGridTitle");
 
Terrasoft.sdk.GridPage.setPrimaryColumn("WaConsultationSubjectInVisit", "WaConsultationSubject");
Terrasoft.sdk.GridPage.setSubtitleColumns("WaConsultationSubjectInVisit", ["WaLoyalty","WaPotential"]);

При переходе на деталь вываливаются ошибки - http://prntscr.com/mx7jtz

Подскажите что делаю не так?

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

Нравится

1 комментарий

Такое сообщение говорит о попытке писать в поле типа boolean неподходящее значение. Вероятно, в этой новой детали что-то не так сделали с одним из логических полей. Более точно узнать причину можно, изучив саму добавляемую деталь или посмотреть в Fiddler, какой запрос идёт к веб-сервису OData. 

Показать все комментарии

Как можно сделать что бы страница редактирования была как в детали "деталь со страницей редактирования", а страница добавления была как в "детали с выбором из справочника", что бы при выборе записи она не появлялась в списке когда снова войти в выбор для добавления?

Нравится

2 комментария
Лучший ответ

Переопределите обработчик нажатия на кнопку [+] добавления новой записи. Обычно она называется AddRecordButton. Обработчик кнопки реализуйте аналогично примера на Академии. В методе openDocumentLookup накладывайте нужные фильтры, чтобы уже добавленная запись в списке выбора не появлялась.

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

 

Так же для добавления можно создать свою мини карточку детали тут

Переопределите обработчик нажатия на кнопку [+] добавления новой записи. Обычно она называется AddRecordButton. Обработчик кнопки реализуйте аналогично примера на Академии. В методе openDocumentLookup накладывайте нужные фильтры, чтобы уже добавленная запись в списке выбора не появлялась.

Показать все комментарии

Всем привет,

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

Попробовал прокидывать сообщение из карточки в метод init детали, и в зависимости от этого менять ProfileKey (предварительно задал свои настройки колонок с разными ключами). Работает, но проблема в том, что метод init детали не отрабатывает, когда ходишь по карточкам в Combined mode.

Кто-нибудь сталкивался с подобной задачей? В какаую сторону капать?

 

Нравится

4 комментария
Лучший ответ

Сталкивались,

смотри метод render() подробнее тут

Сталкивались,

смотри метод render() подробнее тут

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

Спасибо за ответ. А можно немного поподробней о вашем решении? Не совсем понимаю как вы подменяете настройки грида в методе render.

Тёскин Дмитрий Валерьевич,

Это был ответ на 

о проблема в том, что метод init детали не отрабатывает, когда ходишь по карточкам в Combined mode.

Метод render отрабатывает, когда ходишь по карточкам в Combined mode. 

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

Спасибо за уточнение. Метод onGridDataLoaded тоже вроде отрабатывает каждый раз, но по моему у него не тот контекст и подменить ProfileKey там не получится...

Показать все комментарии

На странице добавлены две детали с редактируемым реестром. Создал первую и понял, что неправильно. Потом создал вторую корректно и захотел первую удалить (создавал кодом). В мастере ее удалить нельзя. Открыл конфигурацию и удалил строки из схемы раздела, а именно details и diff, касающихся этой детали. Сохранил и очистил кэш. После этого перестали отображаться детали вообще и в консоли появилась ошибка cannot read property "findPrimary". После возвращения кода детали обе появились и работают. Как убрать первую деталь? 

Нравится

3 комментария
Лучший ответ

Очень похоже, что как-то не так удаляете деталь со страницы. Если корректно удалить из details и diff, делать должна удалиться.

Очень похоже, что как-то не так удаляете деталь со страницы. Если корректно удалить из details и diff, делать должна удалиться.

Тёскин Дмитрий Валерьевич,

Проблема в том, что даже ошибиться негде

Вот код страницы полностью:

define("UsrConcertProgram1Page", [],

function() {

    return {

        entitySchemaName: "UsrConcertProgram",

        attributes: {

            "UsrActiveEveryday": {

                    "dataValueType": Terrasoft.DataValueType.INTEGER,

                    "type": Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,

                    "caption": "UsrActiveEveryday",

                    "value" : "0"

                }

        },

        modules: /**SCHEMA_MODULES*/{}/**SCHEMA_MODULES*/,

        details: /**SCHEMA_DETAILS*/{

            "Files": {

                "schemaName": "FileDetailV2",

                "entitySchemaName": "UsrConcertProgramFile",

                "filter": {

                    "masterColumn": "Id",

                    "detailColumn": "UsrConcertProgram"

                }

            },

            "UsrPerformanceDetail": {

                "schemaName": "UsrPerformanceDetail",

                "entitySchemaName": "UsrPerformance",

                "filter": {

                    "detailColumn": "UsrConcertProgram",

                    "masterColumn": "Id"

                },

            },

            "UsrSchema1Detail660d66ee": {

                "schemaName": "UsrSchema1Detail",

                "entitySchemaName": "UsrConcertPerformance",

                "filter": {

                    "detailColumn": "UsrConcertProgram",

                    "masterColumn": "Id"

                }

            }

        }/**SCHEMA_DETAILS*/,

        businessRules: /**SCHEMA_BUSINESS_RULES*/{}/**SCHEMA_BUSINESS_RULES*/,

        methods: {

            getActiveEverydayConcerts: function() {

                var esq = this.Ext.create("Terrasoft.EntitySchemaQuery", {

                    rootSchemaName: "UsrConcertProgram"

                });

                

                var filterGroup = this.Terrasoft.createFilterGroup();

                

                filterGroup.logicalOperation = this.Terrasoft.LogicalOperatorType.AND;

                filterGroup.add("concertsIsActive",

                this.Terrasoft.createColumnFilterWithParameter(this.Terrasoft.ComparisonType.EQUAL, "UsrIsActive", "1"));

                filterGroup.add("performancePeriodEveryday",

                this.Terrasoft.createColumnFilterWithParameter(this.Terrasoft.ComparisonType.EQUAL,

                "UsrPerformancePeriod", "85A8C133-FF83-4290-9F69-B34EAF627F8C"));

                

                esq.filters = filterGroup;

                

                esq.getEntityCollection(function(result) {

                    if (result.success)

                    {

                        this.set("UsrActiveEveryday", result.collection.getCount());

                    }

                }, this);

            },

            maxEverydayActive: function() {

                var invalidMessage = "";

                var maxActiveEverydayConcertCount = 0;

                var activeEverydayConcertCount = this.get("UsrActiveEveryday");

                this.Terrasoft.SysSettings.querySysSettingsItem("UsrMaxEverydayActiveProgram", function(value) {

                    maxActiveEverydayConcertCount = value;

                }, this);

                

                if (this.get("UsrPerformancePeriod").value == "85A8C133-FF83-4290-9F69-B34EAF627F8C".toLowerCase() &&

                this.get("UsrIsActive") && (activeEverydayConcertCount > maxActiveEverydayConcertCount) && !this.isAddMode()) {

                    invalidMessage = "Допускается не более " + maxActiveEverydayConcertCount +

                    " активных ежедневных концертных программ.";

                }

                if(this.get("UsrPerformancePeriod").value == "85A8C133-FF83-4290-9F69-B34EAF627F8C".toLowerCase() &&

                this.get("UsrIsActive") && (activeEverydayConcertCount >= maxActiveEverydayConcertCount) && this.isAddMode()) {

                    invalidMessage = "Допускается не более " + maxActiveEverydayConcertCount +

                    " активных ежедневных концертных программ.";

                }

                return {

                    fullInvalidMessage: invalidMessage,

                    invalidMessage: invalidMessage

                };

            },

            setValidationConfig: function() {

                this.callParent(arguments);

                this.addColumnValidator("UsrIsActive", this.maxEverydayActive);

                this.addColumnValidator("UsrPerformancePeriod", this.maxEverydayActive);

            },

            onEntityInitialized: function() {

                this.callParent(arguments);

                this.getActiveEverydayConcerts();

            }

        },

        dataModels: /**SCHEMA_DATA_MODELS*/{}/**SCHEMA_DATA_MODELS*/,

        diff: /**SCHEMA_DIFF*/[

            {

                "operation": "insert",

                "name": "UsrName9ed0e254-4ab5-4862-9e79-b18e052d92ab",

                "values": {

                    "layout": {

                        "colSpan": 24,

                        "rowSpan": 1,

                        "column": 0,

                        "row": 0,

                        "layoutName": "ProfileContainer"

                    },

                    "bindTo": "UsrName"

                },

                "parentName": "ProfileContainer",

                "propertyName": "items",

                "index": 0

            },

            {

                "operation": "insert",

                "name": "STRING3bea7972-86d7-4d0e-b4d7-5731d5a6a6b6",

                "values": {

                    "layout": {

                        "colSpan": 24,

                        "rowSpan": 1,

                        "column": 0,

                        "row": 1,

                        "layoutName": "ProfileContainer"

                    },

                    "bindTo": "UsrConcertCode",

                    "enabled": true

                },

                "parentName": "ProfileContainer",

                "propertyName": "items",

                "index": 1

            },

            {

                "operation": "insert",

                "name": "LOOKUP2c6c3d90-34b5-4a43-9b28-26c5c29c6c48",

                "values": {

                    "layout": {

                        "colSpan": 24,

                        "rowSpan": 1,

                        "column": 0,

                        "row": 2,

                        "layoutName": "ProfileContainer"

                    },

                    "bindTo": "UsrOwner",

                    "enabled": true,

                    "contentType": 3

                },

                "parentName": "ProfileContainer",

                "propertyName": "items",

                "index": 2

            },

            {

                "operation": "insert",

                "name": "UsrIsActive3354c9f0-c35f-4c7c-85ec-0b3cc01376b8",

                "values": {

                    "layout": {

                        "colSpan": 12,

                        "rowSpan": 1,

                        "column": 0,

                        "row": 0,

                        "layoutName": "Header"

                    },

                    "bindTo": "UsrIsActive"

                },

                "parentName": "Header",

                "propertyName": "items",

                "index": 0

            },

            {

                "operation": "insert",

                "name": "CreatedOn770eb82e-0b06-4f93-be35-bdd0ddac28b8",

                "values": {

                    "layout": {

                        "colSpan": 12,

                        "rowSpan": 1,

                        "column": 12,

                        "row": 0,

                        "layoutName": "Header"

                    },

                    "bindTo": "CreatedOn"

                },

                "parentName": "Header",

                "propertyName": "items",

                "index": 1

            },

            {

                "operation": "insert",

                "name": "UsrActiveEveryday",

                "values": {

                    "bindTo": "getActiveEverydayConcerts",

                    "caption": "UsrActiveEveryday",

                    "layout": {

                        "colSpan": 12,

                        "rowSpan": 1,

                        "column": 0,

                        "row": 1

                    }

                },

                "parentName": "Header",

                "propertyName": "items",

                "index": 2

            },

            {

                "operation": "insert",

                "name": "Tab75eff25dTabLabel",

                "values": {

                    "caption": {

                        "bindTo": "Resources.Strings.Tab75eff25dTabLabelTabCaption"

                    },

                    "items": []

                },

                "parentName": "Tabs",

                "propertyName": "tabs",

                "index": 0

            },

            {

                "operation": "insert",

                "name": "Tab75eff25dTabLabelGroup46c8d52b",

                "values": {

                    "caption": {

                        "bindTo": "Resources.Strings.Tab75eff25dTabLabelGroup46c8d52bGroupCaption"

                    },

                    "itemType": 15,

                    "markerValue": "added-group",

                    "items": []

                },

                "parentName": "Tab75eff25dTabLabel",

                "propertyName": "items",

                "index": 0

            },

            {

                "operation": "insert",

                "name": "Tab75eff25dTabLabelGridLayoutd14f72b6",

                "values": {

                    "itemType": 0,

                    "items": []

                },

                "parentName": "Tab75eff25dTabLabelGroup46c8d52b",

                "propertyName": "items",

                "index": 0

            },

            {

                "operation": "insert",

                "name": "UsrTeama25e968a-f7f0-4c80-bde3-ed860af75538",

                "values": {

                    "layout": {

                        "colSpan": 12,

                        "rowSpan": 1,

                        "column": 0,

                        "row": 0,

                        "layoutName": "Tab75eff25dTabLabelGridLayoutd14f72b6"

                    },

                    "bindTo": "UsrTeam"

                },

                "parentName": "Tab75eff25dTabLabelGridLayoutd14f72b6",

                "propertyName": "items",

                "index": 0

            },

            {

                "operation": "insert",

                "name": "UsrComment8c10205e-2bf8-42d0-b7fa-605cc32a37af",

                "values": {

                    "layout": {

                        "colSpan": 12,

                        "rowSpan": 2,

                        "column": 12,

                        "row": 0,

                        "layoutName": "Tab75eff25dTabLabelGridLayoutd14f72b6"

                    },

                    "bindTo": "UsrComment",

                    "enabled": true,

                    "contentType": 0,

                    "labelConfig": {

                        "caption": {

                            "bindTo": "Resources.Strings.UsrComment8c10205e2bf842d0b7fa605cc32a37afLabelCaption"

                        }

                    }

                },

                "parentName": "Tab75eff25dTabLabelGridLayoutd14f72b6",

                "propertyName": "items",

                "index": 1

            },

            {

                "operation": "insert",

                "name": "UsrPerformancePeriod8fdfacd0-81ef-4bf3-9ccc-4cb9ab0f5b7b",

                "values": {

                    "layout": {

                        "colSpan": 12,

                        "rowSpan": 1,

                        "column": 0,

                        "row": 1,

                        "layoutName": "Tab75eff25dTabLabelGridLayoutd14f72b6"

                    },

                    "bindTo": "UsrPerformancePeriod",

                    "enabled": true,

                    "contentType": 5

                },

                "parentName": "Tab75eff25dTabLabelGridLayoutd14f72b6",

                "propertyName": "items",

                "index": 2

            },

            {

                "operation": "insert",

                "name": "UsrSchema1Detail660d66ee",

                "values": {

                    "itemType": 2,

                    "markerValue": "added-detail"

                },

                "parentName": "TabsContainer",

                "propertyName": "items",

                "index": 1

            },

            {

                "operation": "insert",

                "name": "NotesAndFilesTab",

                "values": {

                    "caption": {

                        "bindTo": "Resources.Strings.NotesAndFilesTabCaption"

                    },

                    "items": []

                },

                "parentName": "Tabs",

                "propertyName": "tabs",

                "index": 1

            },

            {

                "operation": "insert",

                "name": "Files",

                "values": {

                    "itemType": 2

                },

                "parentName": "NotesAndFilesTab",

                "propertyName": "items",

                "index": 0

            },

            {

                "operation": "insert",

                "name": "NotesControlGroup",

                "values": {

                    "itemType": 15,

                    "caption": {

                        "bindTo": "Resources.Strings.NotesGroupCaption"

                    },

                    "items": []

                },

                "parentName": "NotesAndFilesTab",

                "propertyName": "items",

                "index": 1

            },

            {

                "operation": "insert",

                "name": "Notes",

                "values": {

                    "bindTo": "UsrNotes",

                    "dataValueType": 1,

                    "contentType": 4,

                    "layout": {

                        "column": 0,

                        "row": 0,

                        "colSpan": 24

                    },

                    "labelConfig": {

                        "visible": false

                    },

                    "controlConfig": {

                        "imageLoaded": {

                            "bindTo": "insertImagesToNotes"

                        },

                        "images": {

                            "bindTo": "NotesImagesCollection"

                        }

                    }

                },

                "parentName": "NotesControlGroup",

                "propertyName": "items",

                "index": 0

            },

            {

                "operation": "insert",

                "name": "UsrPerformanceDetail",

                "values": {

                    "itemType": 2,

                    "markerValue": "added-detail"

                },

                //"parentName": "TabsContainer",

                "propertyName": "items",

                "index": 2

            }

        ]/**SCHEMA_DIFF*/

    };

});

 

Удаляю я все с деталью UsrPerformanceDetail

 

Можно подойти к решению с другой стороны: откатиться до стандартной страницы из «коробки» без обеих деталей, затем добавить вторую.

Показать все комментарии

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

Преамбула.

Есть раздел Доп соглашение, на странице редактирования есть деталь Дочернее доп соглашение, которая берется с этого же раздела. Есть поле Основное доп соглашение, которое заполняется при добавлении дочернего доп соглашения. Между страницей редактирования и деталью настроен обмен сообщениями (message) реагирующими на изменение поля Основное доп соглашение, если поле заполнено - кнопка добавления записей невидима, если поле пустое - видима. 

Собственно проблема.

При добавлении записи в деталь (нажатии на "+") открывается карточка редактирования этого же раздела и в поле Основное доп соглашение проставляется ссылка на родителя, НО сообщение о заполнении поля не отправляется на деталь и соответственно кнопка добавления записи остаётся видима.

Насколько я понял это происходит из-за того что фактически текущей страницей является родительская (с которой нажали кнопку добавления записи). Может кто-нибудь знает как можно передать сообщение с открывшейся карточки добавления записи на её деталь для того что бы скрыть кнопку добавления записи и отменить создание "матрёшки" (дочка в дочке в дочке в дочке и т.п.)

Нравится

5 комментариев
Лучший ответ

На onEntityInitialized вызовите функцию которая обрабатывает изменение поля Основное доп соглашение и отправляет сообщение в деталь.

Игорь, добрый день! После добавления записи с карточки детали, сама запись отображается в детали на форме? Так же, запись существует в таблице БД?

На onEntityInitialized вызовите функцию которая обрабатывает изменение поля Основное доп соглашение и отправляет сообщение в деталь.

engineer7,

Добрый день. Сама запись на форме отображается и в БД существует.

Есть карточка детали(то есть та же карточка что и родитель) и есть схема детали, вы передаете на деталь сообщение? на детале ведь та кнопка добавить

Радчук Виталий Владимирович,

Да, именно так.

Показать все комментарии

Коллеги доброго времени суток!

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

define("AbAccountProductDetail",
	["ConfigurationEnums", "ConfigurationGrid", "ConfigurationGridGenerator", "ConfigurationGridUtilities"],
	function (enums) {
		return {
			entitySchemaName: "AbAccountProduct",
			attributes: {
				"IsEditable": {
					dataValueType: Terrasoft.DataValueType.BOOLEAN,
					type: Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
					value: true
				}
			},
			mixins: {
				ConfigurationGridUtilities: "Terrasoft.ConfigurationGridUtilities"
			},
			methods:{
				init: function() {
					this.callParent(arguments);
					this.sandbox.subscribe("[AbAccountProductEntityEventListner]:[RequestToPlatform]:[Exception]", this.accountProductEntityListnerMsgHandler, this);
				},
 
				/*Overrided "BaseGridDetailV2"*/
				editRecord: function(record) {
					var activeRow = record || this.getActiveRow();
					if (!activeRow) {
						return;
					}
					if (!this.getIsCardValid()) {
						return;
					}
					var isCardChanged = this.getIsCardChanged();
					var primaryColumnValue = typeof activeRow === "object" ? activeRow.get(activeRow.primaryColumnName) : activeRow;
					var typeColumnValue = this.getTypeColumnValue(activeRow);
					this.setLastActiveRow(primaryColumnValue);
					if (isCardChanged) {
						this.set("CardState", enums.CardStateV2.EDIT);
						this.set("EditPageUId", typeColumnValue);
						this.set("PrimaryValueUId", primaryColumnValue);
						var args = {
							isSilent: true,
							messageTags: [this.sandbox.id]
						};
						this.sandbox.publish("SaveRecord", args, [this.sandbox.id]);
					} else {
						this.openCard(enums.CardStateV2.EDIT, typeColumnValue, primaryColumnValue);
					}
				},
 
				accountProductEntityListnerMsgHandler: function() {
					Terrasoft.ServerChannel.on(Terrasoft.EventName.ON_MESSAGE,
					function(scope, message){
							if (!message || message.Header.Sender !== "[AbAccountProductEntityEventListner]:[RequestToPlatform]:[Exception]") {
							return;
						}
						var message2 = message.Body;
						if (!this.Ext.isEmpty(message2)) {
							window.console.info(message2);
							this.Terrasoft.showInformation(message2);
						}
					}, this);
				}
			},
			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": "card",
								"markerValue": "card",
								"imageConfig": { "bindTo": "Resources.Images.CardIcon" }
							},
							{
								"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": false
					}
				}
			]
		};
	});

Пришлось переопределить editRecord():

 

var primaryColumnValue = typeof activeRow === "object" ? activeRow.get(activeRow.primaryColumnName) : activeRow;

т.к. дальше не срабатывало.

сейчас работает - http://prntscr.com/lfe61n

но при переходе на страницу редактирования поле для связи не заполняется - http://prntscr.com/lfe6k4

Подскажите в чем может быть дело?

Заранее благодарен.

Нравится

2 комментария
Лучший ответ

Попробуйте например вызывать openCardInChain и передавать туда значения по умолчанию

 

addChildRecord: function(typeColumnValue, date) {
var selectedItem = this.get("ActiveRow");
var defaultValues = [];
defaultValues.push({
	name: "ParentId",
	value: typeColumnValue
});
defaultValues.push({
	name: "UsrDate",
	value: date
});
var config = {
	sandbox: this.sandbox,
	schemaName: this.getEditPageSchemaName(typeColumnValue),
	operation: ConfigurationEnums.CardStateV2.ADD,
	moduleId: this.getChainCardModuleSandboxId(typeColumnValue),
	defaultValues: defaultValues
};
this.openCardInChain(config);
},

 

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

В разделе справочников есть с редактируемым реестром и карточкой, там всё работает; нужно посмотреть, как там сделали.

Попробуйте например вызывать openCardInChain и передавать туда значения по умолчанию

 

addChildRecord: function(typeColumnValue, date) {
var selectedItem = this.get("ActiveRow");
var defaultValues = [];
defaultValues.push({
	name: "ParentId",
	value: typeColumnValue
});
defaultValues.push({
	name: "UsrDate",
	value: date
});
var config = {
	sandbox: this.sandbox,
	schemaName: this.getEditPageSchemaName(typeColumnValue),
	operation: ConfigurationEnums.CardStateV2.ADD,
	moduleId: this.getChainCardModuleSandboxId(typeColumnValue),
	defaultValues: defaultValues
};
this.openCardInChain(config);
},

 

Показать все комментарии

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

Изображение удалено.

 

Нравится

1 комментарий

Дело может быть в том, что объект детали «Продукт в продаже» (OpportunityProductInterest) сделан на основе базового объекта, а другие подобные детали «Продукт в заказе» (OrderProduct) и «Продукт в счете» (InvoiceProduct) — на основе виртуального объекта «Базовое вхождение продукта» (BaseProductEntry). Соответственно, у объектов OrderProduct и InvoiceProduct есть поле «Название» и оно является первичным для отображения.

Сравните между собой детали и попробуйте сделать аналогично.

Показать все комментарии

Версия 7.12.4.

Добавил деталь в р. "Обращения портала"

При инициализации детали получаю ошибку: 

Изображение удалено.

После отладки выявлено, что ошибка связана с вызовом не существующего сallback в методе initDetailRunProcessButtonMenu миксина  ProcessEntryPointUtilities.

В результате этой ошибки деталь не отображается в карточке Обращения на портале.



 

 

Нравится

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

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

/**
 * Initializes "Run process" menu items in detail.
 * @param {Function} callback Callback function.
 * @param {Object} scope Execution context.
 * @protected
 */
initDetailRunProcessButtonMenu: function(callback, scope) {
	var processButtonMenu = this.get("RunProcessButtonMenuItems");
	if (!processButtonMenu) {
		processButtonMenu = this.Ext.create("Terrasoft.BaseViewModelCollection");
		this.set("RunProcessButtonMenuItems", processButtonMenu);
	}
	if (Terrasoft.ProcessEntryPointUtilities.getCanRunProcessFromSection()) {
		this._initDetailAvailableProcessList(processButtonMenu, callback, scope);
	} else {
		callback.call(scope);
	}
},

Возможно, для стандартной детали до else и не доходит.

Илья, добрый день.

В том то и дело, что 

Terrasoft.ProcessEntryPointUtilities.getCanRunProcessFromSection() и проверяет, не является ли пользователь пользователем портала, и в интерфейсе сотрудника возвращает true, и как следствие выполняется this._initDetailAvailableProcessList(processButtonMenu, callback, scope);

НО если пользователь является пользователем портала, то выполняется callback.call(scope);, а callback в этот метод не передается и равен undefind

Т.о. при выводе детали для пользователя портала  получаем ошибку

Сравните с другой деталью тоже на портале, как там работает эта функция.

Мотков Илья,

Деталей на портале нет. 

Вопрос в том, почему в initDetailRunProcessButtonMenu не передаётся callback

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

Мотков Илья,

Метод initDetailRunProcessButtonMenu  вызывается в BaseGridDetailV2 в методе initData и не принимает аргументы (см. https://yadi.sk/i/UoJ5M8kHo9s1kw)

Но в условии else вызывается callback.call(scope);, который по определению вернёт ошибку( т.к. initDetailRunProcessButtonMenu  не принимает аргументов)

Сам метод initDetailRunProcessButtonMenu   описан в схеме-миксине ProcessEntryPointUtilities



Я пытаюсь указать на баг базовой функциональности, который ограничивает использование деталей на портале пользователей.



Для себя временной решение я уже нашёл, но хотелось бы получить исправление в коробочной версии.

Либо переделайте initData, чтобы передавала в функцию эти два параметра, либо в самой initDetailRunProcessButtonMenu добавьте проверку на заполненность параметра, либо, если initData — это единственное место в системе, где функцию initDetailRunProcessButtonMenu вызывают и else не сможет отработать в принципе, исключите нижнюю ветвь.

Мотков Илья,

Илья, решение я уже нашёл (заместил 

BaseGridDetailV2 и метод initDetailRunProcessButtonMenu.)

Целью этой публикации на community является обратить внимание поддержки Terrasoft на не корректную реализацию метода initDetailRunProcessButtonMenu и на проблемы, которые, эта реализация вызывает. 

Чтобы это по возможности было исправлено в следующих релизах.

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

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

Показать все комментарии