Приветствую всех.

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

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

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

Но после первого сохранения записи выходит так, что при смене значения поля справочника, видно небольшое уведомление, мол имеется более подходящий кейс под новое значение справочника и его можно сменить https://prnt.sc/hTUiaTTn2qRe . Да, кейс поменяется, но страница при этом не меняется. Ну и менеджер банально может не нажать на кнопку смены кейса. А желательно бы, чтобы менеджер не мог работать с записью, пока не сменит кейс на соответствующий.

Интерфейс (страницу https://prnt.sc/oi79vQWQ-KMk ) удается сменить лишь проделав определенные манипуляции: меняем значение поля справочника, сохраняем, перезаходим в запись. Нужно именно перезайти в запись (закрыть и заново открыть), простое обновление страницы записи не помогает.

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

Заранее благодарен всем отозвавшимся.

Нравится

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

Добрый день!

Мне здесь отвечали на подобный вопрос: https://community.terrasoft.ua/questions/massovo-smenit-keys-dcm

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

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

 

Добавил действие в меню в страницу редактирования - скрин ошибок в комментарии:

 

            onMyButtonClick: function() {
                var Id =  this.get("Id");
                //console.log(Id);
                var args = {
                    sysProcessName: "ZbsAddTreatSessions",
                    parameters: {
                        TreatmentProgramId: Id
                    }
                };
                processModuleUtilities.executeProcess(args);    

            },
            getActions: function() {
                   var actionMenuItems = this.callParent(arguments);
                console.log(11);
                // Добавление линии-разделителя.
                actionMenuItems.addItem(this.getButtonMenuItem({
                    Type: "Terrasoft.MenuSeparator",
                    Caption: ""
                }));
                console.log(22);
                // Добавление пункта меню в список действий раздела.
                actionMenuItems.addItem(this.getButtonMenuItem({
                    // Привязка заголовка пункта меню к локализуемой строке
                    // схемы.
                      Caption: {bindTo: "Resources.Strings.CreateTreatSessionsCaption"},
                    // Привязка метода-обработчика действия.
                    Click: {bindTo: "onMyButtonClick"}
                }));
                console.log(33);
                 // Возврат дополненной коллекции действий раздела.
                return actionMenuItems;
            },                        
 

Нравится

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

Вот текст ошибки:

user: Supervisor/7f3b869f-34f3-4f20-ab4d-7480a5fdf647
 file: http://localhost:83/0/core/hash/ng-core/src/polyfills-es5.js?hash=b2d23…
 line: 1
 column: 16702
 message: Uncaught TypeError: Cannot read properties of undefined (reading 'apply') 
 date: Fri Aug 12 2022 00:19:01 GMT+0600 (East Kazakhstan Time)
 stack: TypeError: Cannot read properties of undefined (reading 'apply')
    at constructor.callModelMethod (http://localhost:83/0/core/hash/Terrasoft/controls/mixins/bindable.js?h…)
    at constructor.<anonymous> (http://localhost:83/0/core/hash/Terrasoft/controls/mixins/bindable.js?h…)
    at constructor.fire (http://localhost:83/core/7b05a4f154493931757b1cca921fc8a9/ExtJs/extjs-b…)
    at constructor.continueFireEvent (http://localhost:83/core/7b05a4f154493931757b1cca921fc8a9/ExtJs/extjs-b…)
    at constructor.fireEventArgs (http://localhost:83/core/7b05a4f154493931757b1cca921fc8a9/ExtJs/extjs-b…)
    at constructor.fireEvent (http://localhost:83/core/7b05a4f154493931757b1cca921fc8a9/ExtJs/extjs-b…)
    at constructor.onClick (http://localhost:83/0/core/hash/Terrasoft/controls/menu/basemenuitem.js…)
    at HTMLLIElement.eval (eval at cacheableFunctionFactory (http://localhost:83/core/7b05a4f154493931757b1cca921fc8a9/ExtJs/extjs-b…), <anonymous>:6:13)
    at HTMLLIElement.wrap (http://localhost:83/core/7b05a4f154493931757b1cca921fc8a9/ExtJs/extjs-b…)
    at t.value (http://localhost:83/0/core/hash/ng-core/src/polyfills-es5.js?hash=b2d23…)

Добрый день,

 

Это означает, что не тригерится метод-обработчик нажатия на кнопку. Поскольку это совмещенный режим, попробуйте метод-обработчик клика на кнопку добавить и на схему раздела и на схему страницы редактирования (после изменений в схемах обновите страницу с приложением). Ошибка должна уйти.

Oleg Drobina, 

огромное спасибо, у меня получилось благодаря Вашей подсказке!

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

Приветствую. Может ли у детали быть 2 страницы редактирования? 
На разделе "продажи" в странице редактирования используется деталь "А", которая имеет настроенную карточку редактирования. Деталь "А" построена на объекте "Object".  Моей задачей является создание нового раздела -> странице редактирования и размещение этой детали в ней. Суть в том, что при использовании новой детали , из-за связей обьекта и страницы, я перехожу на уже существующую страницу редактирования детали. Решить проблему через visible не удалось, так как рендерится только одно из полей в зависимости от порядка в диффе (старое либо новое). С рассположением полей не знаю как поиграть. Прошу подсказать решение. Буду благодарен за возможные предположения реализации. 

Визуализирую проблему:
Проваливаемся с продажи. В diff поле стоит первым в очереди.

Проваливаемся с Сетевой задачи:
Поле в diff стоит после продажи, продажа отрендерилась уже по такому рассположению. Opportunity.visible = false; NetworkTask.visible = true

Показываю на примере поля "Продажа" -> необходимо заменить на "Сетевая задача" в зависимости от автозаполненного значения одного из полей. Если проваливаемся с продажи - this.Opportunity != undefined. Если Сетевая задача : 
this.NetworkTask !=undefined
 

Нравится

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

Вот 2 поля, на которых я привел пример.
Может можно как-то опеределить 2 diff блока? Мне по сути нужны чуть ли не 2 разные вьюхи, но на одном объекте....

{
                    operation: "insert",
                    name: "TsOpportunity",
                    parentName: "Header",
                    propertyName: "items",
                    values: {
                        visible: { bindTo: "IsOpportunity" },
                        enabled: false,
                        layout: {
                            column: 0,
                            row: 0,
                            colSpan: 12
                        }
                    }
                },
                {
                    operation: "insert",
                    name: "NetworkTask",
                    parentName: "Header",
                    propertyName: "items",
                    values: {
                        visible: { bindTo: "IsNetworkTask" },
                        enabled: false,
                        layout: {
                            column: 0,
                            row: 0,
                            colSpan: 12
                        }
                    }
                },

Добрый день!

Отобразить два поля в одном и том же месте не представляется возможным в виду особенностей построения страницы.
В данном случае следует настроить типизацию.
На данный момент, в системе не предусмотрена полноценная типизация деталей, однако, существует одна хитрость.
Можно создать раздел на основании объекта детали и уже в нём настроить типизацию. Для колонки настройки рекомендую создать отдельный справочник с двумя значениями, продажа и сетевая задача.
После создания раздела его необходимо скрыть (просто убрав его со всех рабочих мест).
В результате мы получим типизированную деталь, с которой можно работать как вам необходимо.

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

Приветствую, коллеги!
В процессе выполнения одного кейса столкулся с непониманием как это реализовать.
Кейс таков: 
Необходимо создать форму такого вида:

Мне нужна кастомная вьюха со стилями и сеткой creatio, без привязки к разделу.
Создал объект , который наследует BaseEntity, добавил необходимые поля со скрина, но с реализацией пейджи как поступить не знаю.
Подскажите в каком направлении двигаться.

 

Нравится

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

Владислав, добрый день!

Пример подобной страницы. В разделе Документы добавлена кнопка открытия страницы:

define("DocumentSectionV2", [], function() {
	return {
		entitySchemaName: "Document",
		details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
		diff: /**SCHEMA_DIFF*/[
			{
					"operation": "insert",
					"name": "OpenCustomPageButton",
					"values": {
						"style": "red",
						"itemType": 5,
						"caption": {
							"bindTo": "Resources.Strings.OpenCustomPageButtonCaption"
						},
						"click": {
							"bindTo": "onOpenCustomPageButtonClick"
						}
					},
				"parentName": "CombinedModeActionButtonsCardLeftContainer",
				"propertyName": "items",
				"index": 9
			}
		]/**SCHEMA_DIFF*/,
		methods: {
			onOpenCustomPageButtonClick: function() {
				var config = {
					moduleId: "SectionModuleV2_DocumentSectionV2_CardModuleV2_chain",
					moduleName: "CardModuleV2",
					operation: "add",
					schemaName: "UsrObjectWithoutSectionPage"
				};
				this.openCardInChain(config);
			},
		}
	};
});

Сама страница объекта без раздела:

define("UsrObjectWithoutSectionPage", [], function() {
  return {
    entitySchemaName: "UsrObjectWithoutSection",
    details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
    diff: /**SCHEMA_DIFF*/[
		{
				"operation": "insert",
				"name": "Namec84346b3-955b-4b9e-b061-af463ee8d8da",
				"values": {
					"layout": {
						"colSpan": 24,
						"rowSpan": 1,
						"column": 0,
						"row": 0,
						"layoutName": "ProfileContainer"
					},
					"bindTo": "UsrName"
				},
				"parentName": "ProfileContainer",
				"propertyName": "items",
				"index": 0
			}
	]/**SCHEMA_DIFF*/,
    methods: {}
    };
});

 

Владислав, добрый день!

Пример подобной страницы. В разделе Документы добавлена кнопка открытия страницы:

define("DocumentSectionV2", [], function() {
	return {
		entitySchemaName: "Document",
		details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
		diff: /**SCHEMA_DIFF*/[
			{
					"operation": "insert",
					"name": "OpenCustomPageButton",
					"values": {
						"style": "red",
						"itemType": 5,
						"caption": {
							"bindTo": "Resources.Strings.OpenCustomPageButtonCaption"
						},
						"click": {
							"bindTo": "onOpenCustomPageButtonClick"
						}
					},
				"parentName": "CombinedModeActionButtonsCardLeftContainer",
				"propertyName": "items",
				"index": 9
			}
		]/**SCHEMA_DIFF*/,
		methods: {
			onOpenCustomPageButtonClick: function() {
				var config = {
					moduleId: "SectionModuleV2_DocumentSectionV2_CardModuleV2_chain",
					moduleName: "CardModuleV2",
					operation: "add",
					schemaName: "UsrObjectWithoutSectionPage"
				};
				this.openCardInChain(config);
			},
		}
	};
});

Сама страница объекта без раздела:

define("UsrObjectWithoutSectionPage", [], function() {
  return {
    entitySchemaName: "UsrObjectWithoutSection",
    details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
    diff: /**SCHEMA_DIFF*/[
		{
				"operation": "insert",
				"name": "Namec84346b3-955b-4b9e-b061-af463ee8d8da",
				"values": {
					"layout": {
						"colSpan": 24,
						"rowSpan": 1,
						"column": 0,
						"row": 0,
						"layoutName": "ProfileContainer"
					},
					"bindTo": "UsrName"
				},
				"parentName": "ProfileContainer",
				"propertyName": "items",
				"index": 0
			}
	]/**SCHEMA_DIFF*/,
    methods: {}
    };
});

 

Дима Вовченко,

Благодарю Вас за ответ, Дмитрий!

 

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

Доброго дня,

Creatio має вбудований функціонал, який розрізняє основні проекти і під-проекти (робота) і відкриває для них різні сторінки редагування з різними схемами, як сказано тут:

Питання, чи можна зробити так, щоб і для робота і проект використовували однакову схему.

Нравится

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

Делал такое через обновление данных в напрямую в БД. Таблица SysModuleEdit

Делал такое через обновление данных в напрямую в БД. Таблица SysModuleEdit

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

Исходные данные:
1. Страница редактирования продукта ( ProductBase )
2. Схема страницы "Продукты" (Пакет 1)
3. Схема страницы "Продукты" (Пакет 2)
"Пакет 2" зависит от "Пакет 1".
Вопросы:
1. Как правильно создать "3. Схема страницы "Продукты" (Пакет 2)", чтобы видеть все изменения из "2. Схема страницы "Продукты" (Пакет 1)" и из "1. Страница редактирования продукта ( ProductBase )"?
2. Как корректно изменить родителя в "3. Схема страницы "Продукты" (Пакет 2)"?
Изменение поля "Parent.UId" файла "ProductPageV2\descriptor.json" не дало нужный результат.

Нравится

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

Если у Вас зависимости " 1. Страница редактирования продукта ( ProductBase ) " -> " 2. Схема страницы "Продукты" (Пакет 1) " -> " 3. Схема страницы "Продукты" (Пакет 2) ", тогда в " 3. Схема страницы "Продукты" (Пакет 2) " будете видеть все изменения пакетов выше.

2. Изменить родителя лучше через графический интерфейс конфигуратотра, зайдите в модуль и там измените родительский модуль.

Если у Вас зависимости " 1. Страница редактирования продукта ( ProductBase ) " -> " 2. Схема страницы "Продукты" (Пакет 1) " -> " 3. Схема страницы "Продукты" (Пакет 2) ", тогда в " 3. Схема страницы "Продукты" (Пакет 2) " будете видеть все изменения пакетов выше.

2. Изменить родителя лучше через графический интерфейс конфигуратотра, зайдите в модуль и там измените родительский модуль.

Александр Тыра,

Нет доступа к редактированию поля "Родительский объект".

Вы можете создать заново с нужным родителем и скопировать текст кода схемы. 

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

Возможно кто-то сталкивался с таким кейсом - в бизнеспроцессе открывается страница редактирования, в ней кнопка "Сохранить" при нажатии сразу закрывает страну. Про не закрывание страницы при добавлении на делать даных есть описание кейса на странице академии https://academy.terrasoft.ru/documents/technic-sdk/7-16/kak-sohranyat-ne-zakryvaya-otkrytuyu-biznes-processom-stranicu-redaktirovaniya , но ножно ли сделать что бы поля на странице можно быть сохранить не закрывая страницу? Другими словами при нажатии "Сохранить" страница не закрывалась а кнопка заменялась на "Закрыть"?

Нравится

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

Александр, в статье по той ссылке в начале предлагается, как такое сделать:

Если необходимо сохранить запись несколько раз, не закрывая страницу редактирования, то необходимо методу this.save() в качестве аргумента передавать конфигурационный объект со свойством isSilent равным true. Например:

this.save({isSilent : true});

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

Александр, в статье по той ссылке в начале предлагается, как такое сделать:

Если необходимо сохранить запись несколько раз, не закрывая страницу редактирования, то необходимо методу this.save() в качестве аргумента передавать конфигурационный объект со свойством isSilent равным true. Например:

this.save({isSilent : true});

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

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

Коллеги добрый день!

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

Суть в том что кнопка нужна только на одной из страниц.

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

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

Как можно красиво побороть?

Спасибо.

Нравится

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

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

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

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

Александр, речь о кастомной кнопке внутри записи, справа от кнопки действий. Ну или внутри действий (так же только внутри записи).

Ваши ссылки изучу. Спасибо)

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

Добрый день!

В моём пакете, который указан в качестве текущего, лежит страница редактирования обращения, в БД она привязана к этому пакету.

Но если отредактировать страницу редактирования через мастер раздела и сохранить, то в пакете Custom создаётся замещающая страница страницы редактирования. То есть моя основная страница при этом не меняется! С чем это может быть связано?

Нравится

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

Натали Вишня,

Попробуйте указать Ваш пакет ещё в системной настройке CustomPackageId.

После изменения системной настройки перезайдите в срм.

Добрый день.

Вам нужно изменить системную настройку [Текущий пакет] (CurrentPackageId).

[Текущий пакет] (CurrentPackageId) — пакет, в котором сохраняются все изменения, внесенные в структуру разделов системы при помощи мастера разделов. Это могут быть, например, изменения, связанные с добавлением колонок в объект раздела либо добавление нового раздела в систему. Тип: справочник. По умолчанию в данной системной настройке установлен пакет [Custom]. Если доработки, выполненные в мастере разделов, нужно перенести в другое приложение, текущий пакет необходимо изменить. Для этого в поле [Значение по умолчанию] выберите из справочника тот пакет, который вы планируете переносить.

Алла, спасибо за ответ, но в этой системной настройке и так стоит мой пакет, а не Custom...

А страница в Вашем пакете тоже замещающая? Или это Вами разработанная страница? А руками (не мастером) в своем пакете эту страницу править можете?

Есть подозрение, что у Вас издатели разные

Лопатин Константин Николаевич пишет:

А страница в Вашем пакете тоже замещающая? Или это Вами разработанная страница? А руками (не мастером) в своем пакете эту страницу править можете?

Есть подозрение, что у Вас издатели разные

Лопатин Константин Николаевич, 

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

Натали Вишня,

Попробуйте указать Ваш пакет ещё в системной настройке CustomPackageId.

После изменения системной настройки перезайдите в срм.

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

Раздел создан сторонним пользователем

ошибка вылетает в методе, когда он пытается обратиться к элементу name контейнера в файле all-combined.js

needFlatten: function(e, t) {
        var a = t || !1;
        return (a = !Ext.isEmpty(e.name)) || (Ext.isArray(e) &amp;&amp; e.length &gt; 0 ? a = !Ext.isEmpty(e[0].name) : Ext.isObject(e) &amp;&amp; Terrasoft.each(e, function(e) {
            a = this.needFlatten(e, a)
        }, this)),
        a
    },

трэйс начинается условно от ViewModelSchemaValidationMixin.js в методе getSchemaDuplicates 

здесь соотвественно всё останавливается на методе Terrasoft.JsonDiffer.getFlatObject

getSchemaDuplicates: function(schema) {
				const viewConfig = schema.viewConfig;
				const messageConfig = {};
				const result = [];
				const pathDelimiter = Terrasoft.JsonDiffer.pathDelimiter;
				const flatViewConfig = Terrasoft.JsonDiffer.getFlatObject(viewConfig, {identifyItemByPath: true});
				Object.keys(flatViewConfig).forEach(function(path) {
					const name = path.split(pathDelimiter).pop();
					const formattedPath = path.split(pathDelimiter).join(".");
					const diffObject = flatViewConfig[path];
					const caption = diffObject.caption ||
						(diffObject.labelConfig &amp;&amp; diffObject.labelConfig.caption) ||
						"";
					messageConfig[name] = messageConfig[name] || [];
					messageConfig[name].push({
						path: formattedPath,
						caption: caption
					});
				});
				Object.keys(messageConfig).forEach(function(name) {
					if (messageConfig[name].length &gt; 1) {
						result.push({
							name: name,
							items: messageConfig[name]
						});
					}
				});
				return result;
			},

В чем может быть причина? И буду рад советами по отладке такого клиентского кода, когда я пытался в all-combined.js ставить брэйкпоинты, у меня словно всё зависало просто

Нравится

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

Посмотрите тут и тут

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

ни та ни та причина. причина оказалась в свойстве

"contentType": Terrasoft.ContentType.DROPDOWN

после того, как закомментировал его, всё заработало. Только теперь я не могу найти что это за свойство и какие значения оно может принимать помимо DROPDOWN и есть ли вообще у него такое значение?

{
	"operation": "insert",
	"name": "ITExecutor",
	"values": {
		"enabled": false,
		"layout": {
			"contentType": Terrasoft.ContentType.DROPDOWN,
			"colSpan": 12,
			"rowSpan": 1,
			"column": 12,
			"row": 0,
			"layoutName": "Header"
				  },
		"bindTo": "ITExecutor"
				},
	"parentName": "Header",
	"propertyName": "items",
	"index": 1
}

 

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

разобрался. свойство "contentType" должно находится внутри "values", а не "layout"

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