Добрый день!

Необходимо заблокировать возможность изменение поля Состояние (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 комментарий

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

 

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

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

На странице просмотра наряда есть справочное поле Ответственный

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

 

Если по нему кликнуть, откроется страница редактирования:

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

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

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



На странице редактирования наряда это-же поле выглядит уже по другому:

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

 

И при клике разворачивается в список выбора (через кастомное правило фильтрации):

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

 

 

Идеальным решением для нас был-бы показ из страницы просмотра списка выбора ответственного (как на странице редактирования), но как это сделать мне не понятно.



Как вариант не показывать окно редактирования контакта вообще (в принципе техники друг-друга знают и эти данные им особо не нужны).

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



Еще вариант страницу показывать, но делать все поля рид-онли....



Как-то я в растерянности. Какие есть варианты решения такой задачи?

Нравится

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

А запретите им менять записи с ответственными правами доступа

Решили дописыванием в манифест для Contact:

PreviewPage = ""



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

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

Странная конечно задача, но нашим техникам такое надо.

На странице Наряд есть поле НомерНаряда оно установлено как не редактируемое правилом:

        let vDisabled = !!record.get("Number");//если строка не пустая - блокируем поле

        record.changeProperty("Number", {disabled: vDisabled});



Однако, есть необходимость каким-то образом скопировать номер в буфер обмена.

Возможно нужна дополнительная кнопка рядом с номером "Скопировать",

может сделать что-то типа:

Terrasoft.sdk.RecordPage.configureColumn("Case", "PrimaryColumnSet", "Number", {

    viewType: Terrasoft.ViewTypes.Url

});



и делать какую-то специальную обработку по клику на поле....



Какие есть наиболее простые варианты?

Нравится

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

По этой доке:

https://academy.terrasoft.ru/documents/technic-sdkmob/7-16/dobavlenie-elementov-upravleniya-na-stranicu-razdela



добавил пимпочку с потенциалом делать копи-паст номера или что-то еще.

Сначала эмулятор выдавал какую-то странную ошибку.

После перекомпиляции ошибка пропала, сам модуль с кнопкой загрузился, самой кнопки на экране нет, ошибок то-ж нет ?

Думаю куда рулить дальше.



Этот файл грузится под именем "ButtonCopyNumber" и я его вижу в эмуляторе.

Ext.define("Terrasoft.controls.CustomRecordPanelItem", {

    extend: "Terrasoft.RecordPanelItem",

    xtype: "cfButtonCopyNumber",

    // Конфигурационный объект создаваемого элемента.

    config: {

        items: [

            {

                xtype: "container",

                layout: "hbox",

                items: [

                    {

                        xtype: "button",

                        id: "ButtonCopyNumber",

                        text: "Number to ClipBrd",

                        flex: 1

                    }

                ]

            }

        ]

    },

    // Метод инициализирует созданный элемент и добавляет метод-обработчик нажатия кнопки.

    initialize: function() {

        var clickMeButton = Ext.getCmp("ButtonCopyNumber");

        clickMeButton.element.on("tap", this.onClickMeButtonClick, this);

    },

    // Метод-обработчик нажатия кнопки.

    onButtonCopyNumberClick: function() {

        var record = this.getRecord();

        Terrasoft.MessageBox.showMessage(record.getPrimaryDisplayColumnValue());

    }

});



Манифест:

{

    "CustomSchemas": [

        "ButtonCopyNumber"

    ],

......

        "Case": {

            "RequiredModels": [...

            ],

            "ModelExtensions": [...

            ],

            "PagesExtensions": [

                "ButtonCopyNumber",

               ....

            ]

        }



Если смотреть исходник страницы обращения, то в самом начале светится строка:

<script type="text/javascript" src="filesystem:file:///persistent/BPMonline700/AppStructure/rev_2/src/ButtonCopyNumber.js?hash=f7bebef3-15d6-4cee-8d89-17f460b123dd"></script>



Те... вроде кнопка должна быть - но нет.

Где я накосячил?

Виктор, может, лучше сделать поле не disabled, а read only? Тогда из него можно будет копировать, как из обычного. А disabled заблокировано для копирования не только в мобильной, а и в браузерной версии.

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

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

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



Но с кнопкой-то вопрос остался (она мне еще под другую задачу нужна будет).

Есть мысли что не так и куда смотреть?

По кнопке есть статья тут.

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

Добавляю фильтр в правиле поля:

        let vFilter = Ext.create("Terrasoft.Filter", {

            name: "CaseOwnerByGroupFiltration",

            modelName: "SysAdminUnit",//фильтрующая таблица

            property: "Id",//по какой колонке фильтруем

            assocProperty: "ContactId",//результат фильтрации

            funcType: Terrasoft.FilterFunctions.In,

            funcArgs: ["87ca4908-f689-4b6b-b87b-934b4bf1c148",

                    "ae82c2be-09a2-4e7e-be52-b38a24a45037",

                    "fbf4d7aa-a7af-43e6-9d45-ca0a100576cf",

                    "9e58f420-47d7-4d5e-a4e2-dd11c27fce86",

                    "5181364d-ce77-472e-aadc-eaf0d6d97f18"

            ]

        });

        record.changeProperty("Owner", {addFilter: vFilter});



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



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

        let vGroupId = record.get("Group.Id");

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

            rootSchemaName: "SysUserInRole"

        });

        esq.addColumn("Id");

        esq.getEntityCollection(function(result) {

            var items = result.collection.getItems();

            var exists = result.success && (items.length > 0);

            //Ext.callback(callback, this, [exists]);

        }, this);



Получаю ошибку: "getEntityCollection не существует" эм.... и как сформировать хотя-бы примитивный запрос на сервер из мобильной версии?

Нравится

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

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

См., например, схему MobileActivityGridPageControllerV2, там в функции getContactRecord используют Terrasoft.DataUtils.loadRecords, перед этим наложив фильтр по Id.

 getContactRecord: function(recordId) {
  return new Promise(function(resolve) {
   var filter = Ext.create("Terrasoft.Filter", {
    property: "Id",
    value: recordId
   });
   Terrasoft.DataUtils.loadRecords({
    proxyType: Terrasoft.ProxyType.Online,
    modelName: "Contact",
    columns: ["Name", "Account", "Photo.Id"],
    filters: filter,
    success: function(loadedContactRecords) {
     if (loadedContactRecords.length === 0) {
      resolve();
      return;
     }
     resolve(loadedContactRecords[0]);
    },
    failure: function() {
     resolve();
    },
    scope: this
   });
  });
 },

И ниже её использование:

this.getContactRecord(ownerId).then(function(contactRecord) {

 

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

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



Message: Запрос на сервер вернул ошибку

AdditionalInfo: {

    "requestId": 24,

    "responseText": "Terrasoft.Common.ItemNotFoundException: Item with name \"MobileApplicationManifestATest1\" not found\r\n   at Terrasoft.Core.ManagerItemCollection`1.GetByName(String name)\r\n   at 



Ну да РМ ATest1 уже не существует и нафиг никому не интересно....

Какого оно лезет туда где уже давно никого нет?

И шо мне с этим делать если я не могу  включить нормальное РМ техника и посмотреть что с ним происходит?

Нравится

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

Здравствуйте, Виктор!

 

У Вас закешилось старое рабочее место. Решения всего два:

  1. Почистить кеш самого хрома и пересинхронизироваться. Обычно этот кеш представлен в виде папки chrome_profile.
  2. Создать рабочее место с таким же кодом, просинхрониться, переключиться на правильное рабочее место и удалить это неиспользующееся рабочее место.
Показать все комментарии