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

Схема: GridUtilitiesV2.js

Метод: getEditableGridRowViewModelClassName

        getEditableGridRowViewModelClassName: function(config) {

            if (!config) {

                return null;

            }

            let className = "Terrasoft.BaseConfigurationGridRowViewModel";

            const entitySchemaName = this.getGridEntitySchemaName();

            const entityStructure = Terrasoft.configuration.EntityStructure[entitySchemaName];

            const rawData = config.rawData;

            const typeColumn = this.getTypeColumn(entitySchemaName);

            let schemaName = null;

            let pages = [];

            if (entityStructure) {

                pages = entityStructure.pages;

            } else {

                pages.push({cardSchema: this.getDefaultConfigurationGridItemSchemaName()});

            }

            this.Terrasoft.each(pages, function(page) {

                if (typeColumn) {

                    const path = typeColumn.path;

                    if (rawData.hasOwnProperty(path)) {

                        const typeColumnValue = rawData[path].value;

                        if (page.UId === typeColumnValue) {

                            schemaName = page.cardSchema;

                        }

                    }

                } else {

                    schemaName = page.cardSchema;

                }

            }, this);

            if (schemaName) {

                className = "Terrasoft." + schemaName + "ConfigurationGridRow" + entitySchemaName + "ViewModel";

            }

            return className;

        },





Вот в этой строке

const entityStructure = Terrasoft.configuration.EntityStructure[entitySchemaName];

мы получаем такой результат:

 

  1. attribute: "ProductCategory"
  2. entitySchemaName: "FinApplication"
  3. entitySchemaUId: "cdda1304-e571-42de-9df7-6dfe528ea7b6"
  4. pages: [{…}]
  5. searchRowSchema: ""



    Свойства attribute быть не должно, но я не знаю как его убрать. Возможно кто-то может объяснить что оно значит и как с ним работать при вызове Terrasoft.configuration.EntityStructure[entitySchemaName];

Нравится

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

Добрый день,

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

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

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

При обеих случаях заходит в метод указанный в prepareList, так же правильно берет данные, но если запись только добавлена в деталь(пока нету в БД) при set'е поля которое указанно в list, ничего не происходит.

 

Код генерации конфига ComboBoxEdit'а:

 

var result =
{
	className: "Terrasoft.ComboBoxEdit",
	value: {bindTo: "CountryOfNumber"},
	list: {bindTo: "CountryOfNumberList"},
	prepareList: {bindTo: "isSkypeAddress"}
};
return result;

Код метода подготовки листа(prepareList):

var esq = Ext.create("Terrasoft.EntitySchemaQuery", {
	rootSchemaName: "Country"
});
 
var test = this;
 
esq.addColumn("Id");
esq.addColumn("Id");
var nameColumn = esq.addColumn("Name");
 
nameColumn.orderDirection = Terrasoft.OrderDirection.ASC;
 
esq.getEntityCollection(function(result) {
	var collection = Ext.create("Terrasoft.Collection");
	if (result.success) {
		var selectedTags = result.collection;
		selectedTags.each(function(item) {
			var countryId = item.get("Id");
			var countryName = item.get("Name");
			var menuItemConfig = {
				value: countryId,
				displayValue: countryName
			};
			collection.add(countryId, menuItemConfig);
		}, this);
	}
	this.set("CountryOfNumberList", collection);
	var test = this.get("CountryOfNumberList");
}, this);
var collection = Ext.create("Terrasoft.Collection");
return collection;

PS. (https://community.terrasoft.ru/questions/lookup-pole-v-detali-sredstva-…)Данную статью видел, ничего полезного там нету 

Нравится

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

Добрый день, Василий.

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

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

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

Грубо говоря, перед исполнением основного действия (открытия лукап окошка), мне нужно добавить еще одно.

Как это можно реализовать?

Нравится

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

Антон, логика при открытии лукапа — в функции loadVocabulary схемы BaseSchemaViewModel:

		/**
		 * Open selection page from the directory or trying to add a record.
		 * @protected
		 * @param {Object} args Params.
		 * @param {Object} columnName Column name.
		 */
		loadVocabulary: function(args, columnName) {
			var multiLookupColumns = this.getMultiLookupColumns(columnName);
			var config = (Ext.isEmpty(multiLookupColumns))
				? this.getLookupPageConfig(args, columnName)
				: this.getMultiLookupPageConfig(args, columnName);
			this.openLookup(config, this.onLookupResult, this);
		},

Там проверяется наличие у колонок некоторого свойства (а именно multiLookupColumns) и если оно не пусто, запускается окно мультилукапа вместо обычного. То есть Вы можете переопределить, чтобы проверяло ещё какое-то свойства у поля на карточке и если оно есть, то произвести сохранение (например, при помощи отправки отсюда карточке команды на тихое сохранение через «песочницу»).

Антон, логика при открытии лукапа — в функции loadVocabulary схемы BaseSchemaViewModel:

		/**
		 * Open selection page from the directory or trying to add a record.
		 * @protected
		 * @param {Object} args Params.
		 * @param {Object} columnName Column name.
		 */
		loadVocabulary: function(args, columnName) {
			var multiLookupColumns = this.getMultiLookupColumns(columnName);
			var config = (Ext.isEmpty(multiLookupColumns))
				? this.getLookupPageConfig(args, columnName)
				: this.getMultiLookupPageConfig(args, columnName);
			this.openLookup(config, this.onLookupResult, this);
		},

Там проверяется наличие у колонок некоторого свойства (а именно multiLookupColumns) и если оно не пусто, запускается окно мультилукапа вместо обычного. То есть Вы можете переопределить, чтобы проверяло ещё какое-то свойства у поля на карточке и если оно есть, то произвести сохранение (например, при помощи отправки отсюда карточке команды на тихое сохранение через «песочницу»).

Благодарю, все работает)

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

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

Нечто типа:

"Document": {
	"dataValueType": Terrasoft.DataValueType.LOOKUP,
	"defaultValues": {
		"Account": {
			"masterColumn": "Account"
			},
		"Contact": {
			"masterColumn": "Contact"
			}
		}
	}

Таким образом значительно упростится такая разработка (не надо писать message и прочее). И, наконец-то, создавая город из карточки адреса, пользователю не надо будет повторно выбирать страну, уже выбранную в адресе



Навеяно вопросом: https://community.terrasoft.ua/questions/zapolnit-znacheniya-pri-sozdan…

3 комментария

Удобно было бы.

Когда-то реализовывал такую задачу как-то костылями через HistoryState.

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

Всем здравствуйте.

 

Вдруг кому-то будет полезно.

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

Решается добавлением свойства valuePairs в config, который в дальнейшем передаётся в метод openLookup.

Пример:

const accountId = this.get("MasterRecordId");
let valuePairs = [];
valuePairs.push({
	name: "Account",
	value: accountId
});
let config = {
	entitySchemaName: "Contact",
	multiSelect: true,
	columns: ["Name", "Type", "Account"],
	valuePairs: valuePairs
};
this.openLookup(config, this.addCallBack, this);

 

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

Добрый день.

Как мне добавить в элемент лукапа деталь с выбором из справочника?

Прикрепленные файлы

Нравится

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

Пример из нашей базы знаний (стиль сохранён).



Как запилить справочник со страницей редактирования И деталью в нагрузку.

1. Делаем деталь со страницей редактирования через мастер;

2. Создаем Schema of the Edit Page в конфигураторе, вставляем туда разметку, которую должна отображать наша страница редактирования детали:

 

define("UsrCompanyStructureTypePageV2", [],
    function() {
        return {
            entitySchemaName: "UsrCompanyStructureType",
            details: /**SCHEMA_DETAILS*/{
                "CompanyStructureDetail": {
                    "schemaName": "UsrCompanyStructureMemberDetailV2",
                    "filter": {
                        "masterColumn": "Id",
                        "detailColumn": "UsrType"
                    }
                }
            }/**SCHEMA_DETAILS*/,
            attributes: {},
            methods: {},
            rules: {},
            userCode: {},
            diff: /**SCHEMA_DIFF*/[
                {
                    "operation": "insert",
                    "name": "Name",
                    "values": {
                        "layout": {
                            "colSpan": 12,
                            "rowSpan": 1,
                            "column": 0,
                            "row": 0,
                            "layoutName": "Header"
                        },
                        "bindTo": "Name"
                    },
                    "parentName": "Header",
                    "propertyName": "items",
                    "index": 0
                },
                {
                    "operation": "insert",
                    "name": "CompanyStructureDetail",
                    "values": {
                        "itemType": 2
                    },
                    "parentName": "GeneralInfoTab",
                    "propertyName": "items",
                    "index": 1
                }
            ]/**SCHEMA_DIFF*/
        };
    });

3. Регистрируем страницу редактирования в БД через процедуру:

EXEC [dbo].[tsp_RegisterPage]
        @ModuleEntityName = N'UsrCompanyStructureType ',
        @PageName = N'UsrCompanyStructureTypePageV2',
        @TypeColumnUId = NULL,
        @TypeValue = NULL,
        @AddMenuCaptionRus = 'Добавить',
        @AddMenuCaptionEng = 'Add',
        @CardHeaderCaptionRus = NULL,
        @CardHeaderCaptionEng = NULL

Если пропадает кнопка Добавить надо создать в SysModuleEditLcz с текстом что будет отображаться на кнопке:

insert into SysModuleEditLcz (id, CreatedOn, RecordId, ColumnUId, SysCultureId, Value)
select newid(), getdate(), 'D716F900-239E-44F3-98A8-DBBF3517FB9A', 'A19BF4BF-E22B-49B5-B6E0-918FF6290020', 'A5420246-0A8E-E111-84A3-00155D054C03', 'New'

RecordID – ID записи из SysModuleEdit нашей зарегистрированной страницы. Можно найти по CreatedOn (т.к. регистрация страницы по идее есть последняя операция то это будет последняя запись в таблице) или через имя схемы объекта по связи SysModuleEntityId – SysEntitySchemaUId из SysSchema

ColumnID – какая-то внутренняя константа, откуда берется не вникал

SysCultureID – ID языка на которой будет отображаться запись

Value – сам текст на кнопке

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

Пример из нашей базы знаний (стиль сохранён).



Как запилить справочник со страницей редактирования И деталью в нагрузку.

1. Делаем деталь со страницей редактирования через мастер;

2. Создаем Schema of the Edit Page в конфигураторе, вставляем туда разметку, которую должна отображать наша страница редактирования детали:

 

define("UsrCompanyStructureTypePageV2", [],
    function() {
        return {
            entitySchemaName: "UsrCompanyStructureType",
            details: /**SCHEMA_DETAILS*/{
                "CompanyStructureDetail": {
                    "schemaName": "UsrCompanyStructureMemberDetailV2",
                    "filter": {
                        "masterColumn": "Id",
                        "detailColumn": "UsrType"
                    }
                }
            }/**SCHEMA_DETAILS*/,
            attributes: {},
            methods: {},
            rules: {},
            userCode: {},
            diff: /**SCHEMA_DIFF*/[
                {
                    "operation": "insert",
                    "name": "Name",
                    "values": {
                        "layout": {
                            "colSpan": 12,
                            "rowSpan": 1,
                            "column": 0,
                            "row": 0,
                            "layoutName": "Header"
                        },
                        "bindTo": "Name"
                    },
                    "parentName": "Header",
                    "propertyName": "items",
                    "index": 0
                },
                {
                    "operation": "insert",
                    "name": "CompanyStructureDetail",
                    "values": {
                        "itemType": 2
                    },
                    "parentName": "GeneralInfoTab",
                    "propertyName": "items",
                    "index": 1
                }
            ]/**SCHEMA_DIFF*/
        };
    });

3. Регистрируем страницу редактирования в БД через процедуру:

EXEC [dbo].[tsp_RegisterPage]
        @ModuleEntityName = N'UsrCompanyStructureType ',
        @PageName = N'UsrCompanyStructureTypePageV2',
        @TypeColumnUId = NULL,
        @TypeValue = NULL,
        @AddMenuCaptionRus = 'Добавить',
        @AddMenuCaptionEng = 'Add',
        @CardHeaderCaptionRus = NULL,
        @CardHeaderCaptionEng = NULL

Если пропадает кнопка Добавить надо создать в SysModuleEditLcz с текстом что будет отображаться на кнопке:

insert into SysModuleEditLcz (id, CreatedOn, RecordId, ColumnUId, SysCultureId, Value)
select newid(), getdate(), 'D716F900-239E-44F3-98A8-DBBF3517FB9A', 'A19BF4BF-E22B-49B5-B6E0-918FF6290020', 'A5420246-0A8E-E111-84A3-00155D054C03', 'New'

RecordID – ID записи из SysModuleEdit нашей зарегистрированной страницы. Можно найти по CreatedOn (т.к. регистрация страницы по идее есть последняя операция то это будет последняя запись в таблице) или через имя схемы объекта по связи SysModuleEntityId – SysEntitySchemaUId из SysSchema

ColumnID – какая-то внутренняя константа, откуда берется не вникал

SysCultureID – ID языка на которой будет отображаться запись

Value – сам текст на кнопке

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

Владимир Соколов,

Большое спасибо за информацию. Есть один момент. У меня отсутствует хранимка с таким названием. Постарался найти запрос на создание, но те, что удалось откопать, невалидны из-за измененных столбцов в таблице SysModuleEditLcz.

В этой таблице никакие изменения я, конечно, не делал)

Вроде, устанавливали. Вот здесь есть обсуждение про неё 

https://community.terrasoft.ua/questions/sozdanie-detali-s-neskolkimi-tipami-i-vypadausim-spiskom-na-knopke-add-dla-bpm-75

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

Привет.

Есть кастомный раздел со своими карточками, по значению поля Категория.

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

В БД скорей всего всё нормально, потому что при создании/открытии записей из данного раздела всё ок.

Идеи?

7.14.0.597

Нравится

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

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

Ошибка версии 7.14.0. Обратитесь в службу поддержки, они предоставят файлы для исправления такого поведения системы.

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

Добрый день.

Что значит открывается неверная карточка редактирования?

Уточните, для данного раздела несколько карточек редактирования?

Алла Савельева, Есть "Карточка 1" которая открывается если поле "Категория 1" и аналогично есть "Карточка 2" для "Категории 2" .

При открытии/добавлении из раздела открывается правильная карточка(для Категории 1 - Карточка 1, для Категории 2 - Карточка 2). При открытии записи через лукапное поле из раздела/карточки открывается всегда "Карточка 1" независимо от категории. 

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

Ошибка версии 7.14.0. Обратитесь в службу поддержки, они предоставят файлы для исправления такого поведения системы.

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

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

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

Подскажите кто нибудь сталкивался с такой реализацией, в модальном окне есть справочное поле с типом Terrasoft.ContentType.LOOKUP?

Если задаю данный тип то не работает, при нажатии на лупу открывается модуль справочника но в нем пусто: http://prntscr.com/m0klnc http://prntscr.com/m0kmde

если делать через Terrasoft.ContentType.ENUM то все работает.

 

{
					"operation": "insert",
					"name": "Contact",
					"parentName": "WaChangeResponsibleModulePageSelectionEditContainer",
					"propertyName": "items",
					"values": {
						"layout": {
							"colSpan": 23,
							"rowSpan": 1,
							"column": 0,
							"row": 0,
							"layoutName": "WaChangeResponsibleModulePageSelectionEditContainer"
						},
						"bindTo": "Contact",
						"contentType": Terrasoft.ContentType.ENUM,
						"labelConfig": {"visible": false},
						"hasClearIcon": false,
						"enableRightIcon": true,
						"controlConfig": {
							"placeholder": "$Resources.Strings.WaContactPlaceholderText",
							"classes": ["placeholderOpacity"],
						},
						"minSearchCharsCount": 1,
						"searchDelay": 50
					}
				},

 

Нравится

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

Все всплывающие окна реализованы через ModalBox и, грубо говоря, нельзя ими спамить. Активно всегда только 1 окно. Именно поэтому в миникарточках одни ENUM-ы)

Все всплывающие окна реализованы через ModalBox и, грубо говоря, нельзя ими спамить. Активно всегда только 1 окно. Именно поэтому в миникарточках одни ENUM-ы)

Варфоломеев Данила,

понял, благодарю

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

Добрый день!

 

Необходимо для окна справочного поля переопределить логику кнопки Добавить. Для этого я создала замещающий клиентский модуль LookupPageViewModelGenerator и изменила метод defaultModeActionButtonClick. Но возникла проблема в получении Id текущей записи (из которой происходит открытие справочного поля). Как можно получить Id?

Нравится

3 комментария

this.getSelectedRecords();

Id ТЕКУЩЕЙ карточки (из которой был открыт lookup)

С замещением модуля не всё просто.

Возможно, как-то можно получать Id записи из стека прошлых открытых страниц системы, с которым работают при помощи GetHistoryState, ReplaceHistoryState и PushHistoryState.

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

Добрый день!

Столкнулся с проблемой, поле справочника Состояние на детали графика оплат и поставок на вкладке Паспорт в заказе, в справочнике два значения (Выполнер/Не выполнен) и более не предвидится.

Хотелось бы переделать в выпадающий список, но у поля State замещающего объекта SupplyPaymentElement в пакете с моими доработками галка "Cписок" снята и задизейблена.

Как теперь это обойти?

Нравится

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

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

+ MetaData.Schema.D2.["0a3324bb-55c8-4791-b51f-409cfedc6fe2"].E20 true

это добавит признак список к колонке UID которой указан в квадратных скобках

Добавьте нужные Вам значения в справочник 'Состояния элемента графика поставок и оплат'.

Алла Савельева,

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

Борис Леонов,

Вы можете реализовать эту функциональность на уровне карточки редактирования:

                {

                    "operation": "insert",

                    "parentName": "Header",

                    "propertyName": "items",

                    "name": "State",

                    "values": {

                        "bindTo": "State",

                        "contentType": Terrasoft.ContentType.ENUM,

                        "layout": {"column": 12, "row": 3, "colSpan": 12}

                    }

                },

Или же создать не замещающий объект, а унаследованный от SupplyPaymentElement, тогда признак 'Список' у поля 'State' будет доступен.

Алла Савельева,

У вас первый вариант прям получилось осуществить? Я сразу так сделал, только "operation" не "insert", а "merge", не работает на детали, действует только на карточку.

А второй как провернуть, что бы остальную логику не переделывать или обойтись минимальными доработками?

Борис Леонов,

Верно, первый вариант работает только для карточки редактирования - я так и написала.

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

Как добавить унаследованный объект описано в статье, смотрите 'Создание пользовательской схемы объекта' и 'Указание родительского объекта'.

Алла Савельева,

завтра попробую

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

+ MetaData.Schema.D2.["0a3324bb-55c8-4791-b51f-409cfedc6fe2"].E20 true

это добавит признак список к колонке UID которой указан в квадратных скобках

Колодяжный Владислав Эдуардович,

добавление метаданных работает, спасибо!

Интересно, а в методе getCellControlsConfig это можно как то провернуть?

Зверев Александр,

Благодарю!

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

Подскажите,можно ли виртуальное поле типа LOOKUP сделать выпадающим списком?

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

Нравится

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

Обычно хватает добавить в diff "contentType": Terrasoft.ContentType.ENUM

{
	"operation": "insert",
	"name": "AccountType",
	"parentName": "ProfileContainer",
	"propertyName": "items",
	"values": {
		"bindTo": "Type",
		"layout": {
			"column": 0,
			"row": 2,
			"colSpan": 24
		},
		"contentType": Terrasoft.ContentType.ENUM
	}
},

 

А если не менять данные есть?

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

Обычно хватает добавить в diff "contentType": Terrasoft.ContentType.ENUM

{
	"operation": "insert",
	"name": "AccountType",
	"parentName": "ProfileContainer",
	"propertyName": "items",
	"values": {
		"bindTo": "Type",
		"layout": {
			"column": 0,
			"row": 2,
			"colSpan": 24
		},
		"contentType": Terrasoft.ContentType.ENUM
	}
},

 

Спасибо. Все получилось.

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