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

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

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

Версия 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 комментарий

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

 

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

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

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

 

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

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

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

 

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

 

 

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

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

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

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

Нравится

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) {

 

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