Вопрос

Мы пытаемся оптимизировать время синхронизации мобильного приложения (оффлайн) и как один из шагов - оптимизации изображений.

Подскажите, каким образом можно выставлять целевой размер фотографий (к примеру 1280 х 800). К примеру в Apache Cordova такая возможность есть.

Возможно ли делать изменить это в настройках  или необходимо изменять код?

Ответ

В приложении мы уже оптимизируем.

Ниже приведен код, который есть в базовой версии:

Terrasoft.Camera.captureFromCamera({
            quality: 70,//в процентах
            size: 1280,//по максимальной стороне
            success: function() {},
            failure: function() {},
            scope: this
        });

Ниже приведен пример как можно изменить качество: 

Terrasoft.sdk.RecordPage.configureColumn("Opportunity", "opportunityFilesDetail", "Data", {
    quality: 50
});

Общая информация по настройке мобильного приложения есть на SDK - https://academy.terrasoft.ru/documents/technic-sdk/7-11/stranica-redaktirovaniya-s-ukazannym-naborom-kolonok

Нравится

Поделиться

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

Симптомы

Bpm'online mobile bug report:

Тип: Terrasoft.ServerException

Сообщение: Запрос на сервер вернул ошибку Дополнительная информация:

{"request":{"id":4,"headers":{"X-Terrasoft-Mobile":"true","Accept":"application/json","Content-Type":"application/json","Authorization":"Cookie","X-Requested-With":"XMLHttpRequest"},"options":{"url":"http://xxxxx.xxxxxxx.xxxxx/0/Services/ProfileService.asmx/Logout","method":"POST","jsonData":{"customData":"","doLogout":"true"},"headers":{"X-Terrasoft-Mobile":"true","Accept":"application/json","Content-Type":"application/json","Authorization":"Cookie"},"disableCaching":false,"scope":{"initialConfig":{"url":"http://xxxxx.xxxxxxx.xxxxx/0/Services/ProfileService.asmx/Logout","method":"POST","jsonData":{"customData":"","doLogout":"true"},"headers":{"X-Terrasoft-Mobile":"true","Accept":"application/json","Content-Type":"application/json","Authorization":"Cookie"},"disableCaching":false},"performanceCounterKey":"86e101ce-533b-4802-941b-56bf73c7b609"}},"async":true},"requestId":4,"status":500,"statusText":"Internal Server Error","responseText":"{\r\n  \"Code\": -1,\r\n  \"Exception\": \"Terrasoft.Core.LicException: Срок действия лицензии истек либо лицензия неактивна\\r\\n  at Terrasoft.Core.UserConnection.CheckLicense()\\r\\n  at Terrasoft.Core.UserConnection.InitializeCurrentUser(String userName, TimeZoneInfo timeZone, String clientIP, String agent, Boolean logSessionStart)\\r\\n  at Terrasoft.Core.UserConnectionFactory.CreateUserConnection(AppConnection appConnection, AuthData authData, String sessionId, String clientIP, String agent, Boolean checkPasswordExpiry)\\r\\n  at Terrasoft.Web.Common.SessionHelper.RecreateUserConnection(AuthData authData)\"\r\n}","responseXML":null,"responseBytes":null}

Причина

У пользователя отсутствует активная лицензия.

Решение

Для корректной авторизации и работы в мобильном приложении необходимо, чтобы лицензия была роздана пользователю.

Нравится

Поделиться

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

Мне нужно, чтобы при выборе колонки в справочнике подгружались и ещё дополнительные значения по этой колонке. В основной версии я это могу сделать, перечислив нужные мне колонки в 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, то нужно добавлять колонку к родительскому объекту, чтобы получить доступ к нужной колонке при создании записи.

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

Вопрос

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

Ответ

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

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

Пример на основе файлов базы знаний:

В манифесте в секции ModelDataImportConfig для KnowledgeBaseFile колонки Data установить признак "ImportBinaryData": false

 

{
    "Name": "KnowledgeBaseFile",
    "SyncColumns": [
        {
            "Name": "Data",
            "UseRecordIdAsFileName": false,
            "ImportBinaryData": false
        } 
    ]
}

 

Нравится

Поделиться

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

Добрый час суток! Сделал когда нажимаю на запись в реестре  в разделе то переходит на пустую белую страницу и в консоле такое вот предупреждение,а надо на мою 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 не определен.

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

 

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

Симптомы

Суть инцидента: пытаемся войти в мобильное приложение – происходит ошибка синхронизации.

Часть полученного баг-репорта:

ENG

Terrasoft-Mobile":"true","Accept":"application/json","Content-Type":"application/json","Authorization":"Cookie"},"method":"GET","disableCaching":false},"performanceCounter":{"startDate":"2015-07-24T08:26:56.702Z"}},"headers":{"X-Terrasoft-Mobile":"true","Accept":"application/json","Content-Type":"application/json","Authorization":"Cookie"},"method":"GET","disableCaching":false},"async":true},"requestId":8,"status":500,"statusText":"Internal Server Error","responseText":"Terrasoft.Mobile.MobileModelLoopException: Models specified in the mobile application manifest have circular relationships\r\n   at Terrasoft.Mobile.MobileModelTopologicalSorter.Sort()\r\n   at Terrasoft.Mobile.MobileModelGraph.Build()\r\n   at Terrasoft.Mobile.MobileManifest.BuildModelGraph()\r\n   at Terrasoft.Mobile.MobileUtilities.GetAppMetadata(HttpContextBase context)\r\n   at Terrasoft.WebApp.Mobile.Services.MobileCodeService.ProcessRequest(HttpContext context)\r\nЦикл: [Account,KnowledgeBase]","responseXML":null,"responseBytes":null} 

Calls sequence:

RUS

Type: Terrasoft.SyncException

Message: An error occurred while synchronizing

Type: Terrasoft.ServerException

Message: Server request returned error

Additional information: 

{"request":{"id":4,"headers":{"X-Terrasoft-Mobile":"true","Accept":"application/json","Content-Type":"application/json","Authorization":"Cookie","X-Requested-With":"XMLHttpRequest"},"options":{"url":"https://xxx.xxxxxx.xxx/0/Mobile/Services/MobileCodeService.ashx?functionName=getAppMetadata&workplaceCode=","scope":{"initialConfig":{"url":"https://xxx.xxxxxx.xxx/0/Mobile/Services/MobileCodeService.ashx?functionName=getAppMetadata&workplaceCode=","scope":{},"headers":{"X-Terrasoft-Mobile":"true","Accept":"application/json","Content-Type":"application/json","Authorization":"Cookie"},"method":"GET","disableCaching":false},"performanceCounter":{"startDate":"2015-07-23T09:41:43.803Z"}},"headers":{"X-Terrasoft-Mobile":"true","Accept":"application/json","Content-Type":"application/json","Authorization":"Cookie"},"method":"GET","disableCaching":false},"async":true},"requestId":4,"status":500,"statusText":"InternalServer Error","responseText":"Terrasoft.Mobile.MobileModelLoopException: Модели, указанные в манифесте мобильного приложения, имеют циклические связи\r\n at Terrasoft.Mobile.MobileModelTopologicalSorter.Sort()\r\n at Terrasoft.Mobile.MobileModelGraph.Build()\r\n at Terrasoft.Mobile.MobileManifest.BuildModelGraph()\r\n at Terrasoft.Mobile.MobileUtilities.GetAppMetadata(HttpContextBase context)\r\n at Terrasoft.WebApp.Mobile.Services.MobileCodeService.ProcessRequest(HttpContext context)\r\nЦикл: [Invoice,Contract]","responseXML":null,"responseBytes":null}

Решение

Для решения необходимо создать (Добавить - Исходный код) кастомный манифест (например, MobileApplicationManifestCustom) и указать язык "Javascript"

Для версии 7.6 и выше, в случае если MobileApplicationManifest в Custom нет - нужно замещать родительскую схему манифеста. Для этого можно войти в мастер мобильного приложения, выбрать "Настройку разделов" для рабочего места и нажать кнопку "Сохранить".

Если кастомный манифест уже присутствует, то открываем имеющий и добавляем следующий код:

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

{
    "Loops": [
        ["Account", "KnowledgeBase"],
    ]
}

, где

["Account", "KnowledgeBase"], - связи, которые необходимо указать. Значение прописывается из значения.

Например (из баг-репорта):

Цикл: [Invoice,Contract]","responseXML":null,"responseBytes":null}

То, прописывать надо:

 

{
    "Loops": [
        ["Invoice”,”Contract "],                   
    ]
}

Если версия 7.5 и ниже, то также необходимо манифест (например,  MobileApplicationManifestCustom ) прописать в системной настройке MobileApplicationManifest:

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

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

Нравится

Поделиться

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

Вопрос

Как отобразить другую колонку в реестре "Контрагенты" в мобильном приложении? Например, колонку "Адрес".

Ответ

Для реализации, так как базовую схему MobileAccountModuleConfig нельзя изменять, то Вам необходимо создать свою схему UsrMobileAccountModuleConfig (в пользовательском пакете создать схему расширения страницы соответствующего раздела. Для этого в разделе [Конфигурация] выбрать Добавить  > Исходный код. Для схемы заполнить свойства[Заголовок], [Название], [Пакет]. В качестве языка для схемы выбрать JavaScript) и подключить ее в манифесте.

"Models": {
"Account": {
"RequiredModels": [
. . .
],
"ModelExtensions": [
. . .
],
"ModelExtensions": [],
            "PagesExtensions": [
                "MobileAccountRecordPageSettingsDefaultWorkplace",
                "MobileAccountGridPageSettingsDefaultWorkplace",
                "MobileAccountActionsSettingsDefaultWorkplace",
                "MobileAccountModuleConfig",
                "UsrMobileAccountModuleConfig"
            ]

В ней прописать такой код:

Terrasoft.sdk.GridPage.setSecondaryColumn("Account", {
    columns: ["Address"],
    convertFunction: function(values) {
        return values.Address;
    }
});

В манифесте для импорта прописать необходимые колонки:

{
            "Name": "Account",
            "SyncColumns": [
                "Address"
            ]
        }

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

Для наглядности прикрепил на деталь «Файлы» скриншот и примеры с полным листингом кода.

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

Нравится

Поделиться

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

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

Нравится

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

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

Реестр справочника и так открывается если нажать на значение - http://prntscr.com/jixl4c

Как вариант можете реализовать пользовательское действие - https://www.dropbox.com/s/80xtv5f8ngqviru/%D0%9F%D0%BE%D0%BB%D1%8C%D0%B…

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

Мне нужно открывать справочник, не связанный со страницей, и перед этим ещё могут потребоваться доп. действия. Просто справочным полем не получится это реализовать.

Есть возможность поместить кнопку именно где-то посреди страницы? Дейсвтие для пользователя будет довольно неудобным. Или это принципиально невозможно?

Бершеда Д. Н.,

Можете посмотреть алгоритм реализации в похоже топике:

https://community.terrasoft.ru/questions/dobavlenie-kastomnyh-elementov-v-mobilnom-prilozenii

Если нужно открыть пикер для выбора значения, то посмотрите MobileActivityGridPageControllerV2. Там много пример открытия пикеров. Например, для выбора «Ответственного» (метод getEmployeePicker()

) или выбора режима расписания (метод getGridModePicker()).

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

Спасибо, всё получилось. Только возникла проблема другого характера. После изменения значений записи из кода на самой странице по-прежнему отображаются старые значения. Как это можно исправить?

Бершеда Д. Н.,

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

Используйте отладку для выяснения причины - https://academy.terrasoft.ru/documents/technic-sdkmob/7-12/otladka-mobi…

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