Требуется переопределить базовую схему FileImportStartPage. Что бы при вызове стандартного импорта вида ViewModule.aspx?vm=FileImportWizard#FileImportModule/FileImportStartPage/b8482840-b481-47ba-8d10-ce16561429f1/Contact
Выдавалась моя страница с частично изменённой логикой. Но при переопределении схем FileImportStartPage, FileImportModule, FileImportWizard
Падает с ошибками

Нравится

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

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

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

Добрый день!

Развернул creatio on-site, но при попытке проверки авторизации с помощью Postman мне возвращается 401Unauthorized

{
    "Message": "There was an error processing the request.",
    "StackTrace": "",
    "ExceptionType": ""
}

Сам запрос с корректными данными в Body c которым я захожу на сайт

POST /0/ServiceModel/AuthService.svc/Login HTTP/1.1
Host: my-host
Content-Type: application/json
Cookie: UserName=103|113|100|106|103|106|112|114|113|102|111
Content-Length: 76
 
{    
    "UserName":"UserName",
    "UserPassword":"UserPassword"
}

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

 

Нравится

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

host/0/SERVICEMODEL/AUTHSERVICE.SVC/LOGIN 401 UNAUTORIZED
host/SERVICEMODEL/AUTHSERVICE.SVC/LOGIN 200 OK 

Добрый день.

Похоже на то, что вы используете .net Core сборку приложения.
В .net Core приложении нет "0", именно по этому вы не можете авторизоваться.
Корректный путь "/ServiceModel/AuthService.svc/Login HTTP/1.1".

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

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

Мне надо повесить проверку для фильтра "Заголовок".
Если с обычным фильтром можно как-то решить вопрос через getFilter, то как стучать в расширенные?
 

Нравится

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

Здравствуйте Владислав,

 

С расширенными фильтрами так же само, как и с обычными: как только нажимается кнопка "Применить", чтобы применить расширенный фильтр, вызывается тот же метод getFilters из BaseDataView. То есть нужно смотреть как можно заменить логику этого метода.

 

С уважением,
Олег

Удалось достать значения фильтров, но понял что используя getFilter мою задачу реализовать не выйдет. Во-первых я никак не могу переопределить кнопку "применить" из схемы которая рисует и собирает конфиг расширенного фильтра - ExtendedFilterEditModelV2.
Во-вторых, как я понял, в коробке при инициализации раздела по дефолту применяется фильтрация из профайла текущего пользователя и метод getFilter при открытии раздела отрабатывает несколько раз.

Прикрепляю код переопределенной схемы раздела.
 

define("ActivitySectionV2", ["ExtendedFilterEditModelV2"], function(ExtendedFilterEditModelV2) {
	return {
		entitySchemaName: "Activity",
		details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
		diff: /**SCHEMA_DIFF*/[]/**SCHEMA_DIFF*/,
		methods: {
 
            getFilters: function () {
                var filters = this.callParent(arguments);
                var customFilters = filters.contains("CustomFilters") ? filters.get("CustomFilters") : null;
                //debugger;
                var count = 0;
                for(var i in customFilters.collection.keys) { 
                    if(customFilters.collection.items[i].isEnabled && customFilters.collection.items[i].leftExpressionCaption == "Заголовок"){ 
                        var headerCaption = customFilters.collection.items[i].rightExpression.parameter.value; //rightExpression.parameter.value
                        if(headerCaption == null || headerCaption.length < 3) { 
                            this.showInformationDialog("WORKING");
                            //this.applyFilters();
                            return filters;
                        }
                    }
                }
                return filters;
            },
 
            applyButton: function() {
                this.showInformationDialog("btn handler works");
            },
        }
 
	};
});

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

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

Добрый день. 

Когда БП запускаешь из серверного кода при помощи конструкции:

var schema = UserConnection.ProcessSchemaManager.GetInstanceByName(@"Process1");

То будет в дальнейшем вызвана актуальная версия БП или та, чьё имя полностью совпадает с написанным в поиске схему, независимо от того, является она актуальной или нет?

Нравится

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

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

 

Спасибо за обращение.

 

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

 

С уважением,

Анастасия 

Спасибо за ответ!

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

https://academy.terrasoft.ua/api/netcoreapi/7.18.0/api/Terrasoft.Core.P…

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

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

Всем привет! 
При вызове метода onButtonClick необходимо проверять права у текущего юзера. Столкнулся с проблемой чтения прав. Похожая проблема обсуждалась тут, но линк неактивен.
https://community.terrasoft.ua/questions/kak-poluchit-dostup-do-sysadmi…

Есть такой код: 

initData: function() {
					this.initializeActionButtons();
					this.callParent(arguments);
					this.isUserInRole(JSConst.SYS_ADMIN_UNIT_ROLE.ROLE.SALES_MANAGER);
					this.isUserInRole(JSConst.SYS_ADMIN_UNIT_ROLE.ROLE.SALES_DEPARTMENT_MANAGER);
					this.isUserInRole(JSConst.SYS_ADMIN_UNIT_ROLE.ROLE.SYS_ADMIN);
				},
 
 
isUserInRole: function(roleId) {
					var currentUserId = Terrasoft.core.enums.SysValue.CURRENT_USER;
 
					var esqCheckUserPossibility = Ext.create("Terrasoft.EntitySchemaQuery", {
						rootSchemaName: "SysAdminUnitInRole"
					});
					esqCheckUserPossibility.addColumn("id");
                    esqCheckUserPossibility.filters.logicalOperation = this.Terrasoft.LogicalOperatorType.AND;
                    var currentUserInRole = esqCheckUserPossibility.createColumnFilterWithParameter(
						Terrasoft.ComparisonType.EQUAL, 
						"SysAdminUnit",
						currentUserId);
                    var isBelongToRoleFilter = esqCheckUserPossibility.createColumnFilterWithParameter(
						Terrasoft.ComparisonType.EQUAL, 
						"SysAdminUnitRoleId", 
						roleId);	
 
					esqCheckUserPossibility.filters.add("UserFilter", currentUserInRole);
					esqCheckUserPossibility.filters.add("isBelongToRoleFilter", isBelongToRoleFilter);
 
                    esqCheckUserPossibility.getEntityCollection(function (response) {
                        if (!response && !response.success) {
		             		return;
	        	    	}
						if(!response.collection.isEmpty()) {
							if(roleId == JSConst.SYS_ADMIN_UNIT_ROLE.ROLE.SALES_MANAGER) {
								this.$IsUserHasSalesManagerRole = true;
							}
							else if(roleId == JSConst.SYS_ADMIN_UNIT_ROLE.ROLE.SALES_DEPARTMENT_MANAGER) {
								this.$IsUserHasSalesDepartmentManagerRole = true;
							}
							else if(roleId == JSConst.SYS_ADMIN_UNIT_ROLE.ROLE.SYS_ADMIN) {
								this.$IsUserHasSysAdminRole = true;
							}
							return;
                    	}
						/*
                        if (callback) {
                            callback.call(scope || this);
                        }
						*/
                    },this);
				},
 
onUpdateServiceProvisionClick: function() {
					if(this.$IsUserHasSalesManagerRole || this.$IsUserHasSalesDepartmentManagerRole) {
						if(this.$IsUserHasSysAdminRole) {
							this.callServiceProvisionService(this.$MasterRecordId, this.onCallServiceProvisionServiceCallback, this);
						}
						else { 
                          	var message = this.get("Resources.Strings.MessageDependsOnUserRoleCaption");
							this.showInformationDialog(message);
						}
                    }
					else { 
						this.callServiceProvisionService(this.$MasterRecordId, this.onCallServiceProvisionServiceCallback, this);
					}
                },

в методе isUserInRole(roleId) беру id текущего юзера 
var currentUserId = Terrasoft.core.enums.SysValue.CURRENT_USER;
При подстановке тестовых айдишников в переменную currentUserId все ок, логика отрабатывает как надо потому что я под своей учеткой. Если зайти под учеткой менеджера при первом вызове метода ловлю в консоли ошибку "Недостаточно прав на чтение из таблицы SysAdminUnitInRole"

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

Нравится

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

Владислав, добрый день!
Доступ к объекту SysAdminUnitInRole происходит через веб-сервисы. Это связано с безопасностью – по этой причине через ESQ получить данные не получится. Для решения Вашей задачи рекомендую обратить внимание на схему детали SysFuncRoleInUserDetailV2. Выборка данных происходит по объекту SysUserInRole, а не по объекту SysAdminUnitInRole. Попробуйте работать с другим объектом.

Владислав, добрый день!
Доступ к объекту SysAdminUnitInRole происходит через веб-сервисы. Это связано с безопасностью – по этой причине через ESQ получить данные не получится. Для решения Вашей задачи рекомендую обратить внимание на схему детали SysFuncRoleInUserDetailV2. Выборка данных происходит по объекту SysUserInRole, а не по объекту SysAdminUnitInRole. Попробуйте работать с другим объектом.

Дима Вовченко,
Спасибо! 

или же написать вызов сервиса на c# и там все решить и вернуть ответ

Стас Гаврилюк,

Посчитал корректным писать это на клиенте и при инициализации сразу же раздавать права и манипулировать доступностью объектов в зависимости от роли пользователя. 

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

Всех приветствую!
Подскажите, пожалуйста, как изменить статично значение заголовка на странице редактирования?


Страница унаследована от BaseModulePageV2, версия 7.17.2
 

getHeader: function() {
            	return this.get("Resources.Strings.PageSettingsCaption");
            },
 
            initHeaderCaption: Ext.emptyFn,
 
			init: function() {
				this.getHeader();
				this.callParent(arguments);
			},

 

Нравится

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

Здравствуйте Владислав,

 

Если необходимо изменить значение "Новая запись" на какое-либо другое, то необходимо изменить значение локал.строке "DefaultPageHeaderCaption". Само проставление значения происходит в subscribeSandboxEvents методе MainHeaderSchema здесь:

this.sandbox.subscribe("UpdatePageHeaderCaption", function(args) {
					if (args.hasOwnProperty("pageHeaderCaption")) {
						this.set("PageHeaderCaption", args.pageHeaderCaption ||
							this.get("Resources.Strings.DefaultPageHeaderCaption"));
					}
				}, this);

Это подписка на сообщение, которое отправляется из метода updatePageHeaderCaption модуля BasePageV2:

updatePageHeaderCaption: function(changedColumnName) {
				if (this.getIsFeatureDisabled("OldUI")) {
					if (!changedColumnName || this.get("PageHeaderColumnNames").indexOf(changedColumnName) > -1) {
						if (this.get("IsEntityInitialized")) {
							var caption = this.getPageHeaderCaption();
							this.sandbox.publish("UpdatePageHeaderCaption", {
								pageHeaderCaption: caption
							});
						}
					}
				}
			},

Если же Вам необходимо изменить заголовок только одной странице, то необходимо в методах модуля этой страницы заместить метод updatePageHeaderCaption. Например вот так (это я в разделе контактов отключил миникарточку и добавил этот метод в ContactPageV2):

updatePageHeaderCaption: function() {
        this.callParent(arguments);
        this.sandbox.publish("UpdatePageHeaderCaption", {
								pageHeaderCaption: "For contacts"
							});
      }
 

В результате, при создании новой записи, получаем:

И последнее: как правило в заголовке отображается значение в колонке, которая выбрана как Displayed value в настройках объекта, которую страница отображает:

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

 

С уважением,

Олег

Здравствуйте Владислав,

 

Если необходимо изменить значение "Новая запись" на какое-либо другое, то необходимо изменить значение локал.строке "DefaultPageHeaderCaption". Само проставление значения происходит в subscribeSandboxEvents методе MainHeaderSchema здесь:

this.sandbox.subscribe("UpdatePageHeaderCaption", function(args) {
					if (args.hasOwnProperty("pageHeaderCaption")) {
						this.set("PageHeaderCaption", args.pageHeaderCaption ||
							this.get("Resources.Strings.DefaultPageHeaderCaption"));
					}
				}, this);

Это подписка на сообщение, которое отправляется из метода updatePageHeaderCaption модуля BasePageV2:

updatePageHeaderCaption: function(changedColumnName) {
				if (this.getIsFeatureDisabled("OldUI")) {
					if (!changedColumnName || this.get("PageHeaderColumnNames").indexOf(changedColumnName) > -1) {
						if (this.get("IsEntityInitialized")) {
							var caption = this.getPageHeaderCaption();
							this.sandbox.publish("UpdatePageHeaderCaption", {
								pageHeaderCaption: caption
							});
						}
					}
				}
			},

Если же Вам необходимо изменить заголовок только одной странице, то необходимо в методах модуля этой страницы заместить метод updatePageHeaderCaption. Например вот так (это я в разделе контактов отключил миникарточку и добавил этот метод в ContactPageV2):

updatePageHeaderCaption: function() {
        this.callParent(arguments);
        this.sandbox.publish("UpdatePageHeaderCaption", {
								pageHeaderCaption: "For contacts"
							});
      }
 

В результате, при создании новой записи, получаем:

И последнее: как правило в заголовке отображается значение в колонке, которая выбрана как Displayed value в настройках объекта, которую страница отображает:

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

 

С уважением,

Олег

Oleg Drobina,

Спасибо большое за помощь! 

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

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

Мне нужна кастомная вьюха со стилями и сеткой 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: {}
    };
});

 

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

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

 

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

Добрый день. Мне необходимо при нажатии кнопки сохранять данные в формате excel и скачивать этот файл. Данные получаю из веб сервиса в формате JSON.

Есть ли такая возможность?

Нравится

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

Добрый день!

Есть схема Estimation
с колонками ImplantationCaseId

И вторая схема VwCase2Case
с колонками Case1Id

При составлении фильтра выдает ошибку 'ItemNotFoundException', message: 'Элемент коллекции с именем [VwCase2Case:Case1:ImplantationCase].Case1Id не найден

Построили следующий фильтр :
 

// [Имя_присоединяемой_схемы:Имя_колонки_для_связи_присоединяемой_схемы:Имя_колонки_для_связи_текущей_схемы]
 var esqEstimationFilter = esqEstimation.createColumnFilterWithParameter(
    Terrasoft.ComparisonType.EQUAL, 
    "[VwCase2Case:Case1:ImplantationCase].Case1Id", "ImplantationCase" );
esqEstimation.filters.add(esqEstimationFilter);

 

Нравится

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

Сергей, уточните как связан Estimation с VwCase2Case.
Правильно ли я понимаю взаимосвязь следующая Estimation.ImplantationCaseId= VwCase2Case.Case1Id?

Алёна Доля,

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

Select c.Case2Id From Estimation e
left join [VwCase2Case] c ON c.Case1id = e.ImplantationCaseId
where e.Id= 'c47561a2-53c9-457f-aad9-25ca1cd9b3c7'

 

Мы хотим чтобы фильтр возвращал коллекцию Case2id по условию текущего Estimation.Id (where e.Id= 'current')

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

Добрый день.

В карточке обращения есть поля группа объекта и филиал и контрагент (объект)

В разделе контрагенты (объект) так же выведены эти поля.

Необходимо в уже ранее созданных обращениях заполнить  поле филиал и группа объекта по данным контрагента.

Дополнительно я создал логическое поле в карточке обращения.

Посмотрел ролик академии по работе с большим кол-вом записей.

Tech Hour: Как обрабатывать множество записей в Creatio. Все способы - YouTube

Решил попробовать сделать по самому первому кейсу.

Мой процесс выглядит так :

По шагам:

читаем кол-во  записей, фильтрую их там где поле филиал, группа объектов = пусто, контрагент = заполнен. Логическое поле с значением = нет.

Далее идет условный поток, кол-во записей не равно 0.

Читаем первую запись из нашего кол-ва записей, фильтра аналогичен как  и  в первом шаге.

Читать данные контрагента(объекта)

Тут фильтр id = объекту в шаге читать первую запись из обращения.

Изменить данные

Тут id  обращения = читать первую запись из обращения.Первый элемент результирующей коллекции.Id

Поле объект = читать данные объекта.Первый элемент результирующей коллекции.Id

Поле филиал  и группа объектов пусто . Логическое поле = нет.

Какие поля изменить 

Филиал = #читать данные объекта.Первый элемент результирующей коллекции.Филиал#]

#читать данные объекта.Первый элемент результирующей коллекции.Группа#]

Логическое поле = #Логическое значение.Да#]

Далее идем в первый шаг  и из него если  равно 0 то на выход.

Процесс запускаю , все работает , но стоит обработать только 100 записей, как больше они  не обрабатываются. Но процесс выполняется.

В чем может быть дело?

Может есть альтернатива как выполнить  задачи в БП ? без программирования?

 

Нравится

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

попробуйте увеличить "максимальное число повторений" https://academy.terrasoft.ru/docs/user/biznes_processy/nastrojka_proces…

попробуйте увеличить "максимальное число повторений" https://academy.terrasoft.ru/docs/user/biznes_processy/nastrojka_proces…

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

 

Добрый день.

Действительно, поменял лимит на 250 и процесс обработал 250. Спасибо за совет, я и забыл что есть ограничение)

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