Добрый день!

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

Вот - один из вариантов кода, который я пытался использовать:

Terrasoft.sdk.Model.addBusinessRule("UsrZakupka", {
    name: "UsrAutoSetUsrDepartByCreatedBy",
    ruleType: Terrasoft.RuleTypes.Custom,
    triggeredByColumns: ["CreatedBy"],
    events: [Terrasoft.BusinessRuleEvents.Load, Terrasoft.BusinessRuleEvents.ValueChanged],
    executeFn: function(record, rule, column, customData, callbackConfig, event) {
        var department = record.get("CreatedBy.Department");
            record.set("UsrDepart", department, true);
        Ext.callback(callbackConfig.success, callbackConfig.scope, [true]);
    }
});

Подскажите,  пожалуйста, каким образом можно получить запись с данными(через esq пытался, тоже ничего)

Нравится

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

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

при загрузке лукапного поля все его поля автоматом не подтягиваются. Только Id и его дисплейное поле (Name). Поэтому, чтобы получить какое-то другое поле, нужно сделать отдельную загрузку по лукапному значению. Как вариант, можно использовать утилитный метод Terrasoft.DataUtils.loadRecordById или Terrasoft.DataUtils.loadRecords:

Terrasoft.DataUtils.loadRecordById({
   recordId: recordId,
   modelName: modelName,
   columns: [],
   expandLookupColumns: false,
   callback: function(loadedRecord) {
      // Здесь получаешь значение департамента, устанавливаешь его в поле UsrDepart и вызываешь success правила.
      Ext.callback(callbackConfig.success, callbackConfig.scope, [true]);
   },
   scope: this
});

Алёна Доля,

Спасибо за пояснение.

Правило вроде отрабатывает, но как-то через раз, и только на одном значении...

Такой код:

Terrasoft.sdk.Model.addBusinessRule("Zakupka", {

    name: "AutoSetDepartByOrder",

    ruleType: Terrasoft.RuleTypes.Custom,

    triggeredByColumns: ["Order"],

    events: [Terrasoft.BusinessRuleEvents.ValueChanged, Terrasoft.BusinessRuleEvents.Load],

    executeFn: function (record, rule, column, customData, callbackConfig, event) {

        var order = record.get("Order");

        var orderId = order ? order.get("Id") : null;

        if (orderId) {

            Terrasoft.DataUtils.loadRecordById({

                recordId: orderId,

                modelName: "Order",

                columns: ["Podrazdel","Account"],

                expandLookupColumns: false,

                callback: function (loadedRecord) {

                    var department = loadedRecord.get("Podrazdel");

                    var departmentId = department ? department.get("Id") : null;

                    record.set("Depart", departmentId, true);

                    var account = loadedRecord.get("Account");

                    var accountId = account ? account.get("Id") : null;

                    record.set("Account", accountId, true);

                    Ext.callback(callbackConfig.success, callbackConfig.scope, [true]);

                },

                scope: this

            });

        }

    }

});

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

Развернул сайт разработки, подключил  SSL Let's encrypt все запросы и интеграции ходят корректно, сертификат принимает. В мастере мобильного приложения зашел во все схемы и сохранил. Получаю ошибку которой не вижу в community,  может кто-то сталкивался?

Model Name: CPH2009 Platform: Android Platform Version: 11 Resolution: 360x756 IsHybridMode: true RootAppDirectory: creatio ApplicationVersion: 7.18.6 ApplicationMajorVersion: 7.18 UseNativeSynchronization: true UseNativeImport: true UseNativeExport: true UseNativeLogout: true UseNativeMetadataSync: false UseNativeFullSynchronization: false UseDataService: true IsDevMode: false CurrentDateTime: 2022-01-20T19:09:15.553Z ServerUrl: https://suncrm.space/ ContactId: null CultureName: null ApplicationRevision: null WorkplaceCode: null ProductInfo: {"ProductName":"Creatio","ProductEdition":"enterprise","CustomerId":"","Version":{"Major":7,"Minor":18,"Build":5,"Revision":1501,"MajorRevision":0,"MinorRevision":1501}} Type: Terrasoft.SyncException Message: В процессе синхронизации произошла ошибка Stack trace: Function.handleException(terrasoft-all-combined.js:26896:37) Object.callback(sencha-touch-all-debug.js:10397:26) Class.callUserErrorHandler(terrasoft-all-combined.js:21844:9) Object.callback(sencha-touch-all-debug.js:10397:26) Class.callFailure(terrasoft-all-combined.js:21503:11) Object.callback(sencha-touch-all-debug.js:10397:26) Function.failure(terrasoft-all-combined.js:36406:17) Object.callback(sencha-touch-all-debug.js:10397:26) Object.requestItemFailure(terrasoft-all-combined.js:34794:17) Class.onRequestFailure(terrasoft-all-combined.js:34602:16) Object.callback(sencha-touch-all-debug.js:10397:26) terrasoft-all-combined.js:34798:13 Object.callback(sencha-touch-all-debug.js:10397:26) Class.finish(terrasoft-all-combined.js:35206:11) Class.finishCancellableOperation(terrasoft-all-combined.js:1576:43) Class.(terrasoft-all-combined.js:34783:12) Object.callback(sencha-touch-all-debug.js:10397:26) terrasoft-all-combined.js:34961:11 Object.callback(sencha-touch-all-debug.js:10397:26) Class.finish(terrasoft-all-combined.js:35206:11) Class.finishCancellableOperation(terrasoft-all-combined.js:1576:43) Class.executeCallbackIfNotCanceled(terrasoft-all-combined.js:34960:10) Class.failureHandler(terrasoft-all-combined.js:34977:10) Object.callback(sencha-touch-all-debug.js:10397:26) Class.onComplete(sencha-touch-all-debug.js:36405:17) Class.onStateChange(sencha-touch-all-debug.js:36341:18) XMLHttpRequest.(sencha-touch-all-debug.js:3233:27) Type: Terrasoft.ServerException Message: Запрос на сервер вернул ошибку AdditionalInfo: { "requestId": 11, "status": 500 }

Нравится

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

Добрый день. Подскажите, пожалуйста, как для мобильного приложения заместить в классе Terrasoft.Schedule метод getTimeColumn хочу изменить отображение времени в расписании сейчас с 0 до 24 хочу поставить рабочее время с 9 до 18.

Нравится

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

Андрей, здраствуйте!

Функциональность на этапе разработки в продукте и войдёт в одну из следующих релизных версий.

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

Добрый день, Коллеги!
В моб приложение приходит виза по обращениям, там написан номер обращения, как бы его нажимать, чтобы переходило в обращение (все в том же мобе). Сейчас это текст просто.

Или может как-то вынести поле с обращением, чтобы нажать и перейти.

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

Версия 7.18

Нравится

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

Добрый день!

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

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

Добрый день!

Необходимо заблокировать возможность изменение поля Состояние (Status) на странице просмотра конкретного обращения. Когда я применяю фильтрацию, запрет поля происходит сразу на двух страницах (на CasePreviewPage - странице предпросмотра обращения и на CaseEditPage - страницы изменения обращения)

Можно ли каким то образом применить запрет на изменения поля только на странице CasePreviewPage?

Terrasoft.sdk.Model.addBusinessRule("Case", {
	name: "CaseStatusCustomRule",
	ruleType: Terrasoft.RuleTypes.Custom,
	triggeredByColumns: ["Status"],
	events: [
		Terrasoft.BusinessRuleEvents.Load,
		Terrasoft.BusinessRuleEvents.ValueChanged
		],
	executeFn: function(record, rule, column, customData, callbackConfig) {
		let vStatusId = record.get("Status.Id");
		let vSfld = "Status";
		record.changeProperty(vSfld, {
			disabled: true
		});
 
		let vFilter = Ext.create("Terrasoft.Filter", {
			name: "CaseStatus_NextStatus_Filtration",
			modelName: "CaseNextStatus",
			property: "Status",
			assocProperty: "NextStatus",
			operation: Terrasoft.FilterOperations.Any,
			value: vStatusId
		});
		record.changeProperty("Status", {addFilter: vFilter});
 
		Ext.callback(callbackConfig.success, callbackConfig.scope, [true]);
	}
});

 

Нравится

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

Сергей, добрый день!

 

Такого признака, на какой из страниц выполняется правило, в системе нет.

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

 

Для этого в соответствующей схеме настроек раздела необходимо добавить следующий код:

Terrasoft.sdk.Module.setChangeModes("[Объект_раздела]", [Terrasoft.ChangeModes.Read]);

 

Схему настроек раздела можно найти по маске %Mobile[Объект_раздела]ModuleConfig

 

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

Но при этом в карточке не будет кнопки редактирования. Для добавления кнопки редактирования записи нужно переопределить карточку просмотра и в ней реализовать свой метод initNavigationButtons(). Для этого (на примере раздела для объекта SNLWARSECTION) нужно создать схему-модуль MobileSNLWARSECTIONPreviewPage и в ней добавить такой код:

 

Terrasoft.LastLoadedPageData = {
                controllerName: "Terrasoft.configuration.SNLWARSECTIONPreviewPageController",
                viewXClass: "Terrasoft.configuration.SNLWARSECTIONPreviewPageView"
};

Ext.define("Terrasoft.configuration.view.SNLWARSECTIONPreviewPage", {
                extend: "Terrasoft.view.BasePreviewPage",
                alternateClassName: "Terrasoft.configuration.SNLWARSECTIONPreviewPageView",
                config: {
                                id: "SNLWARSECTIONPreviewPage"
                }
});

Ext.define("Terrasoft.configuration.controller.SNLWARSECTIONPreviewPage", {
                extend: "Terrasoft.controller.BasePreviewPage",
                alternateClassName: "Terrasoft.configuration.SNLWARSECTIONPreviewPageController",
                statics: {
                                Model: SNLWARSECTION
                },
                config: {
                                refs: {
                                                view: "#SNLWARSECTIONPreviewPage"
                                }
                },

                /**
                * @protected
                * @overridden
                */
                initNavigationButtons: function() {
                                this.callParent(arguments);
                                var view = this.getView();
                                var editButton = view.showEditButton(true);
                                editButton.on("tap", this.onEditButtonTap, this);
                }

});

Ключевое - это view.showEditButton(true), добавляющий кнопку редактирования в навигационную панель.
 

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

Привет!
 

При синхронизации в оффлайн режиме не импортируются значения колонок одного из объектов. При чем данная проблема воспроизводится только при синхронизации непосредственно из самого мобильного устройства (версия приложения на устройстве 7.17.3). 
При синхронизации с эмулятора все работает корректно.

Колонки объекта и их настройка синхронизации в манифесте:

Ловлю запрос в профайлере при синхронизации с эмулятора:

Ловлю запрос при синхронизации с приложения на мобильном устройстве:

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

Нравится

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

Привет!

 

Мы сталкивались с подобным кейсом. Проблема была в том, что был задублированный в одном из манифестов  объект импорта. В итоге, при слиянии манифестов в результирующем конфиге присутствовали две настройки импорта для одного объекта. Один с дополнительными колонками, второй - нет. Брался второй конфиг при формировании запроса к серверу.

 

Привет!

 

Мы сталкивались с подобным кейсом. Проблема была в том, что был задублированный в одном из манифестов  объект импорта. В итоге, при слиянии манифестов в результирующем конфиге присутствовали две настройки импорта для одного объекта. Один с дополнительными колонками, второй - нет. Брался второй конфиг при формировании запроса к серверу.

 

Зезюков Сергей Aлександрович,

Спасибо, действительно в одном из пакетов в манифесте был дубль объекта SupplyPaymentTemplate

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

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

Добавил бизнес-правило проверки вводимого значения. Оно то работает, то нет. Иногда появляется сообщение, что значение некорректно, но, если кликнуть на другое поле, то сообщение исчезает и система позволяет сохранить объект с некорректным значением. Прошу помочь разобраться.

Нравится

12 комментариев
Terrasoft.sdk.Model.addBusinessRule("ScpObject", {
    name: "ScpObjectAreaValidatorRule",
    ruleType: Terrasoft.RuleTypes.Custom,
    triggeredByColumns: ["ScpObjectArea"],
    events: [Terrasoft.BusinessRuleEvents.Save, Terrasoft.BusinessRuleEvents.ValueChanged],
    executeFn: function (record, rule, column, customData, callbackConfig) {
       	var isValid = false;
		var ssArea=0;
		var curArea = record.get("ScpObjectArea");
 
		if(Terrasoft.SysSettings.MinScpObjectArea !== undefined)
		{
			ssArea=Terrasoft.SysSettings.MinScpObjectArea;
		}
		isValid = curArea>=ssArea;
 
        record.changeProperty("ScpObjectArea", {
            // Установка признака корректности колонки.
            isValid: {
                value: isValid,
                message: Terrasoft.LocalizableStrings.InvalidScpArea + ssArea
            }
        });
        // Асинхронный возврат значений. 
        Ext.callback(callbackConfig.success, callbackConfig.scope);
    }
});

 

Сергей, а Вы не проверяли, как будет работать, если заменить проверку системной настройки на константу с таким же значением? Может, в некоторых случаях оно не считывалось, из-за чего валидация работала неправильно?

Добрый день, Александр!

Как хорошо, что Вы ответили. Я уже начал отчаиваться. Итак, прописал жестко цифру - и результат тот же. Кроме того, еще явно пробовал указать в коллбэк функции результат: Ext.callback(callbackConfig.success, callbackConfig.scope, [isValid]);, но это тоже не помогло. В отладчике видно, что isValid=false, однако, сообщение о некорректно заполненном поле и отмены сохранения не происходит.

Сергей, так пока не нашли причину, не особо хорошо.

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

Александр, чувство локтя незаменимо. В любом случае, если бы локализация влияла и значение не подтягивалось, то в сообщении, как минимум, осталось бы значение переменной  ssArea. Я и брал за основу пример из академии. 

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

Доброе утро. Добавлять для активностей один-в-один или опять же модифицировать под свой объект?

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

Если и там неправильное поведение повторится, то будет понимание, что дело либо в Вашей системе (например, бинарных файлах), либо в примере.

Добрый день, Александр!

Вставил код, но он перекрывается кодом, который был реализован внедренцем. Сходу не удалось его заместить, однако, какая-то логика в активностях при помощи бизнес-правил работает. И без ошибок.

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

Добрый вечер, Александр!

И я пропал в отпуске :). Спасибо за помощь, завтра попробую разобраться с поддержкой.

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

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

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

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

{
	"SyncExtensions": [
		"ScpMobileSyncExtensions"
	],
	"SyncOptions": {
//Настройки синхронизации
  }
}

Однако этот модуль не загружается вообще при синхронизации с реального устройства (в моём случае под Android). Пробовал отдельно просто выводить окошко с сообщение Terrasoft.MessageBox.showMessage("Тест"); При синхронизации с эмулятора окно с сообщением выводится как и положено, но при синхронизации с телефона ничего не происходит.

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

Нравится

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

SyncExtensions стал deprecated c версии 7.16.0 так как перешли на «нативную» синхронизацию написаную на Java.
Соответсвенно, пользовательский javascript подключить туда нельзя.
Есть обходное решение — отключить нативную синхронизацию.
Но делать это настоятельно не рекомендуем, т.к. все новые «фишки» у Вас перестанут работать.
Опишите свою проблему, может, её «в коробке» исправят в новых версиях.

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

Добрый день. 

Столкнулись с такой проблемой, что на больших объёмах данных (несколько миллионов записей) в таблице продуктов в заказе. Настройка синхронизации объекта стандартная, в которой в SyncOptions установлен параметр "SyncByParentColumnWithRights": "Order"

Проверили запрос непосредственно в базе. Он выполняется несколько минут. В результате всего одна строка. Основное время исполнения уходит на проверку прав. 

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

Нравится

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

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

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

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

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

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

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

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

В мобильном приложении на странице Обращения есть справочная колонка Группа (FK на SysUserInRole(SysRoleId) и через FK на SysAdminUnit(Id) -> ContactId).

Если жмакнуть по пункту - откроется отфильтрованный список сотрудников в группе:

И все-бы хорошо, но на эту страницу нужном прикрутить действия Добавить и Удалить... документацию как это сделать я вроде нашел
https://community.terrasoft.ru/questions/dobavlenie-aktivnostei
https://community.terrasoft.ru/questions/deistvia-nad-zapisami-detali-v…
https://community.terrasoft.ru/questions/nastroika-polzovatelskogo-rabo…

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

Как быть?

Нравится

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

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

 

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

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