Вопрос

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

Существует ли инструмент, с помощью которого в мобильном приложении можно изменить тип поиска с "Начинается с" на "Содержит"?

У меня такой же вопрос

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

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

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

Мы передали аналитикам продукта Ваше пожелание, они рассмотрят возможность реализации данного функционала в последующих релизах продукта.

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

Для мобильной же версии необходимо реализовывать на уровне код.
Вам необходимо:
- если не создан, то создать пользовательский манифест мобильного приложения (информация есть на SDK - https://academy.terrasoft.ru/documents/technic-sdk/7-11/manifest-mobilnogo-prilozheniya, просьба ознакомиться). Проще всего будет его создать если зайти в мастер мобильного приложения и сохранить текущие настройки;
- прописать в корне манифеста, в отдельную секцию - http://prntscr.com/hfwdpf:
 
"PreferedFilterFuncType": 'Terrasoft.FilterFunctions.SubStringOf',
 
- сохранить изменения;
- очистить кэш и провести первичную синхронизацию;
- в результате должно работать согласно бизнес-задаче - http://prntscr.com/hgci19.
 
По умолчанию название манифеста MobileApplicationManifestDefaultWorkspace, но если это пользовательское рабочее место, то приблизительное имя в конфигурации будет MobileApplicationManifest[название рабочего места].
Примечание. Заметьте, какое рабочее место Вы используете в мобильном устройстве и в какой манифест Вы добавляете код. Убедитесь, что Вы просинхронизированы с тем рабочим местом.

Также об этом параметре ("Terrasoft.FilterFunctions.SubStringOf") было описано на Академии -https://academy.terrasoft.ru/documents/technic-sdkmob/7-12/manifest-svoystva-dannyh-i-biznes-logiki.

Дмитрий, огромное спасибо!

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

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

В web-клиенте реализован бизнес-процесс. Как обеспечить запуск данного процесса в мобильном клиенте?

У меня такой же вопрос

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

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

Бизнес процессы запускаются и выполняются на сервере, а не на клиенте. А запустить БП из мобилки можно попробовать при помощи ProcessEngineService.svc - это сервис, который позволяет запускать БП сторонним приложениям. По ссылке статья в Академии по этому сервису.

https://academy.terrasoft.ru/documents/technic-sdk/7-12/web-servis-proc…

Вызвать сервис из мобильного приложения можно так вызвать:

Terrasoft.AuthService.login({
    name: Terrasoft.CurrentUserInfo.login,
    password: Terrasoft.CurrentUserInfo.password,
    success: function () {
 
        Ext.Ajax.request({
            method: "POST",
            url: Terrasoft.CurrentUserInfo.serverUrl + '/0/rest/ServiceName/MethodName',
            scope: this,
            jsonData: { 
                // Параметры. Названия такие же, как и названия параметров в методе сервиса.
            },
            success: this.onRequestSuccess,
            failure: this.onRequestFailure
        });
    },
    failure: function (e) {
        Terrasoft.Mask.hide();
        Terrasoft.MessageBox.showMessage("Не удалось выполнить авторизацию.");
    },
    scope: this
});

 

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

Добрый час суток! Имеется деталь,в таблице есть 1 запись при загрузке детали - все ок отображается. Когда добавляется новая запись в таблицу,нужно,чтобы это (вторая) запись тоже появилась(первая остается). Подскажите как это можно сделать? пока привязался к 

    this.getView().fireEvent("startrefresh", this); Но работает оно не совсем так,как нужно(не затрагивается все методы,при просто заходе на детали и много чего теряется). Переопределять все это дело довольно таки долго. Подскажите пожалуйста,какая альтернатива этому? Деталь своя. Пока пробую искать подобный функционал на стандартной детали,но пока не нахожу события,которое необходимо.(динамически добавлять запись ). Спасибо!

У меня такой же вопрос

6 комментариев

me.fireAction('refresh', [me], 'doRefresh'); вот это тоже не совсем помогло... оно добавило новую запись(которая появилась в базе),но предыдущая информация введенная(на старой,самой первой записи) не подтягивается,генерируется просто новая такая запись по шаблону и добавляется та,которая добавилась в базу. они оба "чистые"(при том что в базе информация хранится).

Никита, здравствуйте!

А чем Вам не нравится свайп вниз? Я правильно понял, что Вы хотите автообновление детали при добавлении новой записи?

Вильшанский Дмитрий пишет:

Никита, здравствуйте!

А чем Вам не нравится свайп вниз? Я правильно понял, что Вы хотите автообновление детали при добавлении новой записи?

 Добрый! Дело в том,что мне нужно чтобы при нажатии на клавишу добавлялась запись в бд,и сразу же появлялась на странице,добавлять то она добавляется но свайпить вниз не хочется,я попробовал "взять" функционал оттуда,но он не емулируется.. А вообще да,автообновление детали при добавлении новой записи. Деталь кодом добавлял свою,не стандартная(+GridPage+ PreviewPage так же

)

Вильшанский Дмитрий,А есть другая альтернатива ?

Никита Гальченко,

В базовой версии уже реализовано обновление записи при базовых действиях (например, сохранение или удаление).

Для примера можете посмотреть как реализовано при сохранении (нужный "кусок" кода выделил): 

 

completeDataSaving: function(operation) {
  
this.callParent(arguments);
  
var pageHistoryItem = this.getPageHistoryItem();
  
var pageConfig = pageHistoryItem.getRawConfig();
  
var record = this.record;
  
var operationConfig = this.createPageOperationConfig(operation);
  
var useOptimisticEditing = this.useOptimisticEditing();
   if (useOptimisticEditing) {
      Terrasoft.PageNavigator.refreshPreviousPages(operationConfig, pageHistoryItem);
   } else {
      Terrasoft.PageNavigator.markPreviousPagesAsDirty(operationConfig);
   }

   var shouldOpenPreviewPageOnSave = this.shouldOpenPreviewPageOnSave();
  
if (shouldOpenPreviewPageOnSave) {
     
Terrasoft.util.openPreviewPage(this.self.Model, {recordId: record.getId(), isStartRecord: true,
        
direction: "right", operationConfig: operationConfig});
   }
else {
     
Terrasoft.Router.back();
   }
  
if (pageConfig) {
     
Ext.callback(pageConfig.onDataSaved, this, [record]);
   }
},

Вильшанский Дмитрий,

Спасибо большое! Буду разбираться!

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

В мобильной версии приложение в пакете “Mobile”, в схеме MobileActivityModelConfig yстанавливаются значения по умолчанию:

Terrasoft.sdk.Model.setDefaultValuesFunc("Activity", function(config) {

   var coeff = 1000 * 60 * 5;

   var currentDate = new Date();

   var startDate = new Date(Math.round(currentDate.getTime() / coeff) * coeff);

   var dueDate = new Date(startDate.getTime() + 30 * 60000);

   config.record.set("StartDate", startDate);

   config.record.set("DueDate", dueDate);

   config.record.set("ShowInScheduler", true);

   Ext.callback(config.success, config.scope);

});

 

Моя задача дополнить данный код своими данными. Но когда я, в своем пакете, создал схему и добавил в нее код:

Terrasoft.sdk.Model.setDefaultValuesFunc('Activity', function(config) {

    var record = config.record;

    record.set('AnIsMobileSKU', true);

    Ext.callback(config.success, config.scope);

});

 

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

У меня такой же вопрос

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

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

Попробуйте в начало Вашей функции добавить строчку типа:

this.callParent(config)

Ответ службы поддержки:

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

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

Пировских Дмитрий,

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

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

Добрый день,подскажите пожалуйста,а в мобильном приложении есть функция автозаполнения поля ? Если да,то как это можно организовать ? Чтобы при создании новой записи в разделе,поле автоматически заполнялось значением,что то вроде счетчика записей. Например у меня в разделе есть 10 записей - запись 1,запись 2,запись 3 ... 10. При создании новой чтобы поле Название сразу заполнялось как запись 11. Подскажите примерный ход действий(на данный момент беру запросом с базы,сортируя и беру следующее число,но такой подход не очень хороший). Может быть есть более правильный вариант ? Спасибо!

У меня такой же вопрос

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

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

Что касается автоматической установки значений, то есть несколько вариантов. Можно сделать, например, на уровне событий объекта мобильного приложения:

Terrasoft.sdk.Model.setModelEventHandler("ActivitySKU", 
    Terrasoft.ModelEvents[Terrasoft.ModelEventKinds.Before].update,
    function(config) {
        var record = config.scope.eventConfig.records[0];
        record.set("UsrIsChecked", true);
        Ext.callback(config.success, config.scope);
});

Или с помощью Custom бизнес правила:

Terrasoft.sdk.Model.addBusinessRule("ModelName", {
    name: "RuleName",
    ruleType: Terrasoft.RuleTypes.Custom,
    events: [Terrasoft.BusinessRuleEvents.Load, Terrasoft.BusinessRuleEvents.ValueChanged],
    executeFn: function(record, rule, column, customData, callbackConfig) {
        record.set("UsrColumn", "some value");
        Ext.callback(callbackConfig.success, callbackConfig.scope);
    }
})

Третий вариант - в кастомной странице повесить на загруженную запись дополнительный обработчик на изменение записи:

onLoadRecord: function(loadedRecord) {
    this.callParent(arguments);
    loadedRecord.on("columnchanged", this.onRecordColumnChanged, this);
},

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

var control = Ext.getCmp("control_id");
control.setValue("some value");

 

Такое есть смысл на стороне сервера. Есть специальное действие в БП для получения номера по порядку.

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

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

Что касается автоматической установки значений, то есть несколько вариантов. Можно сделать, например, на уровне событий объекта мобильного приложения:

Terrasoft.sdk.Model.setModelEventHandler("ActivitySKU", 
    Terrasoft.ModelEvents[Terrasoft.ModelEventKinds.Before].update,
    function(config) {
        var record = config.scope.eventConfig.records[0];
        record.set("UsrIsChecked", true);
        Ext.callback(config.success, config.scope);
});

Или с помощью Custom бизнес правила:

Terrasoft.sdk.Model.addBusinessRule("ModelName", {
    name: "RuleName",
    ruleType: Terrasoft.RuleTypes.Custom,
    events: [Terrasoft.BusinessRuleEvents.Load, Terrasoft.BusinessRuleEvents.ValueChanged],
    executeFn: function(record, rule, column, customData, callbackConfig) {
        record.set("UsrColumn", "some value");
        Ext.callback(callbackConfig.success, callbackConfig.scope);
    }
})

Третий вариант - в кастомной странице повесить на загруженную запись дополнительный обработчик на изменение записи:

onLoadRecord: function(loadedRecord) {
    this.callParent(arguments);
    loadedRecord.on("columnchanged", this.onRecordColumnChanged, this);
},

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

var control = Ext.getCmp("control_id");
control.setValue("some value");

 

Спасибо!

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

Добрый час суток! Хочется узнать как можно добавить RadioButton в мобильное приложение на страницу ? 

Сам контрол я нашел https://academy.terrasoft.ua/jscoresdk/source/radiobutton.html вот тут. Как его использовать,чтобы оно работало с данными ( как отрендерить правильно ) ? К примеру у меня нужно чтобы можно было выбирать ответ с помощью radiobutton'ов,но сложность в том,что я пока не особо понимаю как это сделать. Спасибо заранее.

У меня такой же вопрос

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

Никита, здравствуйте!

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

Также ссылка https://academy.terrasoft.ua/jscoresdk/source/radiobutton.html предназначена для доработка в веб-версии приложения.

Мы зафиксировали пожелание в департамент разработки.

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

 

подскажите пожалуйста,а checkBox я так понимаю тоже не поддерживается тогда?

Никита, 

Check-box в связке с источником данных в виде справочного поля как элемент страницы  - обработка не реализована. 

В приложении check-box используется в реестре для решения задачи мультивыбора. Пример реализации можно посмотреть в блоке быстрой фильтрации для типа колонки "Справочник". 

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

Мне нужно, чтобы при выборе колонки в справочнике подгружались и ещё дополнительные значения по этой колонке. В основной версии я это могу сделать, перечислив нужные мне колонки в columns в lookupListConfig в настройке соответствующей справочной колонки в attributes. Как мне сделать аналогичное в мобильном приложении? Скажем, мне нужно в активности получить колонку Account.UsrParentAccount.UsrCode или что-то подобное.

У меня такой же вопрос

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

Добрый день!

Если необходимо отобразить дополнительную колонку в реестре, это можно сделать с помощью SDK реестра - https://academy.terrasoft.ru/documents/technic-sdkmob/7-12/sdk-reestra. Если задача другая, опишите, пожалуйста, ее подробнее, а также с какой целью необходимо ее реализовать.

Одеяненко Юлия,

Нет, это совсем не то.

Впрочем, сам уже разобрался. Делается это через sdk страницы, например так:

Terrasoft.sdk.RecordPage.addColumn("Activity", {
    name: "Account.UsrCode",
    hidden: true
}, "primaryColumnSet");

Тогда и нужная колонка будет подгружаться. Только если это доп. поле нужно на странице детали и зависит от родительской колонки, например, Activity.Account.UsrCode, то нужно добавлять колонку к родительскому объекту, чтобы получить доступ к нужной колонке при создании записи.

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

Добрый час суток! Сделал когда нажимаю на запись в реестре  в разделе то переходит на пустую белую страницу и в консоле такое вот предупреждение,а надо на мою Preview. Подскажите пожалуйста как исправить или где искать решение проблемы ? Раздел - SuInterview

при этом конфиг выглядит так: 

Terrasoft.sdk.RecordPage.addColumnSet("SuInterview", {
    name: "primaryColumnSet",
    isPrimary: true,
    position: 0
});

Terrasoft.sdk.RecordPage.addColumn("SuInterview", {
    name: "SuAccount",
    position: 0,
    isInPlaceEditingMode: false,
    readOnly: true
}, "primaryColumnSet");

Terrasoft.sdk.RecordPage.addColumn("SuInterview", {
    name: "SuContact",
    position: 1,
    isInPlaceEditingMode: false,
    readOnly: true
}, "primaryColumnSet");

Terrasoft.sdk.RecordPage.addColumn("SuInterview", {
    name: "SuResponsible",
    position: 2,
    isInPlaceEditingMode: false,
    readOnly: true
}, "primaryColumnSet");

Terrasoft.sdk.GridPage.setPrimaryColumn("SuInterview", "SuName");
Terrasoft.sdk.GridPage.setSecondaryColumn("SuInterview", "CreatedOn");

Сам манифест: 

{
    "SyncOptions": {
        "SysSettingsImportConfig": [],
        "ModelDataImportConfig": [
            {
                "Name": "SuInterview",
                "SyncColumns": [
                    "SuName",
                    "SuResponsible",
                    "SuQuestionary",
                    "SuKind"
                ]
            },
            {
                "Name": "Contact",
                "SyncColumns": []
            },
            {
                "Name": "SuQuestionary",
                "SyncColumns": []
            },
            {
                "Name": "SuInterviewKind",
                "SyncColumns": []
            },
            {
                "Name": "SocialMessage",
                "SyncColumns": [
                    "EntityId"
                ]
            },
            {
                "Name": "SuInterviewQuestion",
                "SyncColumns": [
                    "Id",
                    "SuInterview"
                ]
            }
        ],
        "SysLookupsImportConfig": [
            "SuAnswersType",
            "SysUserInRole"
            ]
    },
    "Modules": {
        "SuInterview": {
            "Group": "main",
            "Model": "SuInterview",
            "Position": 4,
            "isStartPage": false,
            "Title": "SuInterviewSectionTitle",
            "Hidden": false
        }
    },
    "Models": {
        "SuAnswersType": {
            "RequiredModels": [
            ]
        },
        "Account": {
            "RequiredModels": [
            ]
        },
        "SuInterview": {
            "Preview": "SuInterviewPreviewPage",
            "RequiredModels": [
                "SuInterview",
                "Contact",
                "SuQuestionary",
                "SuInterviewKind",
                "SocialMessage",
                "SuInterviewQuestion",
                "SuAnswersType",
                "SuInterviewType",
                "ContactAddress",
                "Account"
            ],
            "ModelExtensions": [],
            "PagesExtensions": [
                "SuInterviewPreviewPage",
                "SuMobileInterviewModuleConfig"
            ]
        },
        "SocialMessage": {
            "RequiredModels": [],
            "ModelExtensions": [],
            "PagesExtensions": []
        },
        "SuInterviewQuestion": {
            "RequiredModels": [
                "SuInterviewQuestion",
                "SocialMessage"
            ],
            "ModelExtensions": [],
            "PagesExtensions": []
            
        }
    }
}

и моя PreviewPage 

/* globals SuInterview: false */
Terrasoft.LastLoadedPageData = {
    controllerName: "SuMobileSuInterviewPreviewPage.Controller",
    viewXType: "sumobilesuinterviewpreviewpageview"
};

Ext.define("SuMobileSuInterviewPreviewPage.View", {
    extend: "Terrasoft.view.BasePreviewPage",
    xtype: "sumobilesuinterviewpreviewpageview",
    config: {
        id: "SuMobileSuInterviewPreviewPage"
    }
});

Ext.define("SuMobileSuInterviewPreviewPage.Controller", {
    extend: "Terrasoft.controller.BasePreviewPage",

    statics: {
        Model: SuInterview
    },

    config: {
        refs: {
            view: "#SuMobileSuInterviewPreviewPage"
        }
    }

});

У меня такой же вопрос

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

Добрый день, Никита!

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

 

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

Добрый день! Сделал PreviewPage при нажатии на запись в разделе должна открываться страничка:она не открывается вместо этого ошибка в консоле:

Cannot read property 'columnType' of undefined

 посмотрев по колстеку в методе resolveColumnCollectionModelDependencies передается вот такое:

column = {name: "Account", columnConfig: {…}, position: 0, model: "Interview"}:как я понимаю в моем разделе Interview должна быть колонка Account:но в манифесте она нигде у меня не фигурирует. Подскажите пожалуйста как решить проблему. Код манифеста:

{
    "SyncOptions": {
        "SysSettingsImportConfig": [],
        "ModelDataImportConfig": [
            {
                "Name": "Interview",
                "SyncColumns": [
                    "Name",
                    "Responsible",
                    "Questionary",
                    "Kind"
                ]
            },
            {
                "Name": "Contact",
                "SyncColumns": []
            },
            {
                "Name": "Questionary",
                "SyncColumns": []
            },
            {
                "Name": "InterviewKind",
                "SyncColumns": []
            },
            {
                "Name": "SocialMessage",
                "SyncColumns": [
                    "EntityId"
                ]
            },
            {
                "Name": "InterviewQuestion",
                "SyncColumns": [
                    "Id",
                    "Interview"
                ]
            }
            
        ],
        "SysLookupsImportConfig": [
            "SuAnswersType",
            "SysUserInRole"
            ]
    },
    "Modules": {
        "SuInterview": {
            "Group": "main",
            "Model": "Interview",
            "Position": 4,
            "isStartPage": false,
            "Title": "InterviewSectionTitle",
            "Hidden": false
        }
    },
    "Models": {
        "SuAnswersType": {
            "RequiredModels": [
            ]
        },
        "SuInterview": {
            "Preview": "SuInterviewPreviewPage",
            "RequiredModels": [
                "Interview",
                "Contact",
                "Questionary",
                "InterviewKind",
                "SocialMessage",
                "InterviewQuestion",
                "AnswersType",
                "InterviewType",
                "ContactAddress",
                "Account"
                
            ],
            "ModelExtensions": [],
            "PagesExtensions": [
                "InterviewPreviewPage",
                "MobileInterviewModuleConfig"
            ]
        },
        "SocialMessage": {
            "RequiredModels": [],
            "ModelExtensions": [],
            "PagesExtensions": []
        },
        "InterviewQuestion": {
            "RequiredModels": [
                "InterviewQuestion",
                "SocialMessage"
            ],
            "ModelExtensions": [],
            "PagesExtensions": []
            
        }
      
    }
}

У меня такой же вопрос

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

Никита, просьба предоставить полный листинг PreviewPage.

Также убедитесь, что объект SuInterview существует. Также такое ощущение, что у есть 2 раздела с разными названиями и они перемещались. Перепроверьте, название объектов и что схемы используется для соответствующего объекта.

 

  "Modules": {
        "SuInterview": {
 
            "Model": "Interview",
        }
    },
    "Models": {
 
        "SuInterview": {
            "Preview": "SuInterviewPreviewPage",
            "RequiredModels": [
                "Interview",
            ],
   
            "PagesExtensions": [
                "InterviewPreviewPage",
                "MobileInterviewModuleConfig"
            ]
        },

Вильшанский Дмитрий,

да действительно я перепутал название уже все работает,спасибо!

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

Добрый день,подскажите пожалуйста что подробно означает запись (комментарий) рода /* globals Accountfalse */ например на PreviewPage. Заранее спасибо!

У меня такой же вопрос

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

Никита, здравствуйте!

Это служебное сообщение для дизайнера схемы. А именно, предотвращает предупреждение дизайнера при сохранении схемы, что объект Account не определен.

понял,спасибо!

 

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