Симптомы

Мобильное приложение не синхронизируется в онлайн режиме (в офлайн режиме – все ОК).

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

Причина

По результатам анализа, в некоторых конфигурациях IIS и .NET Framework ASP.NET обрабатывает URL (адрес сайта) таким образом, что экранируются спецсимволы. При интеграции средствами OData (мобильное приложение bpm'online) используются URL содержащие $.

Эту особенность можно выключить специальной опцией в файле «web.config».

Решение

Для этого Вам необходимо (ниже пункты, которые должен выполнить пользователь с правами системного администратора):

  1. Перейти к папке с исходными файлами приложения (например, C:\bpm\7.8.0.1681_SalesEnterprise_Softkey_MSSQL_ENU). Путь к папке произвольный. Данной информацией должен владеть системный администратор приложения;
  2. Далее в корневой папке открыть блокнотом  файл web.config;
  3. Найти секцию   (например, быстрее можно найти через поиск в блокноте (Ctrl + F);
  4. В эту секцию добавить строку:





     
  5. Сохранить изменения (просьба перепроверить, что изменения сохранились);



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

     
  6. Далее открыть второй web.config, который находится в папке с приложением «Terrasoft.WebApp» (C:\bpm\7.8.0.1681_SalesEnterprise_Softkey_MSSQL_ENU\Terrasoft.WebApp) и повторить пункты 2-5.



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



     
  7. Далее перезапустить приложение на IIS и почистить Redis.

Просьба перед внесением изменений сделать копии файлов web.config.

Хотелось бы отметить, что данная ситуация возникает только при использовании Online режима - https://academy.terrasoft.ru/documents/mobile/7-8-0/specifika-raboty-v-online-i-offline-rezhimah

Необходимые условия и возможные ограничения

Права системного администратора

Нравится

Поделиться

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

Вопрос

Мобильное приложение.

Интересует вопрос по настройке порядка отображения заказов в мобильном приложении.

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

 В чём была причина хаотичного расположения заказов?

Ответ

Для сортировки по определенной колонке необходимо в манифеесте прописать дополнительно логику.

Пример:

Terrasoft.sdk.GridPage.setOrderByColumns("Order", {
    column: "CreatedOn",
    orderType: Terrasoft.OrderTypes.DESC
});

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

Ниже пример:

 

- добавляет объект «UsrTestOrderMobile» с нужными колонками 

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

- регистрируем деталь в мастере деталей;

- добавляем деталь в мастере мобильного приложения

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

- далее нам необходимо настроить сортировку. Создаем новую клиентскую схему, например, «UsrMobileUsrTestOrderMobileModuleConfig» с необходимым кодом:

 

Terrasoft.sdk.GridPage.setOrderByColumns("UsrTestOrderMobile", {
    column: "UsrName",
    orderType: Terrasoft.OrderTypes.DESC
});

- сохраняем изменения;

- подключаем в манифест в секции «Models» нужного объекта детали в «PagesExtensions»

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

- очищаем кэш и заново синхронизируется (чтобы получить актуальные настройки) и проверяем.

 

Важные моменты:

- убедиться, что в настройках импорта (ModelDataImportConfig) синхронизируете все необходимые колонки

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

- была первичная колонка (которая используется в сортировке) для отображения в объекте либо на уровне кода (ниже пример):

 

Terrasoft.sdk.GridPage.setPrimaryColumn("UsrTestOrderMobile", "UsrName");

Terrasoft.sdk.RecordPage.addColumn("UsrTestOrderMobile", {

        name: "UsrName",

        position: 1

    }, "primaryColumnSet");

 

Проверили на последней сборке 7.11.3 и все работает корректно.



Также используйте следующую документацию:

https://academy.terrasoft.ru/documents/technic-sdk/7-11/manifest-mobilnogo-prilozheniya;

https://academy.terrasoft.ru/documents/technic-sdk/7-11/kak-dobavit-polzovatelskiy-razdel-v-mobilnoe-prilozhenie;

https://academy.terrasoft.ru/documents/technic-sdk/7-11/sdk-reestra.

Нравится

Поделиться

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

Кейс

Добавил кастомное поле «Проект» в Активность, которое является обязательным.

Из за этого не могу теперь внеси Активность через мобильное приложение.  Можно ли это исправить оставив поле «Проект» обязательным?

Причина

Настройка полей в меню [Мастер мобильного приложения] для разделов Активности/Контрагенты работает некорректно. Исправлено в последних релизных версиях.

Цель

Добавить пользовательское поле в раздел Активность для мобильного приложения.

Необходимые условия

Доступ в систему с правами администратора.

Выполнение

1. Обновить систему до последней релизной версии, выпущенной после 01.05.2015.

2. В [Мастер мобильного приложения] настроить соответствующие колонки.

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

1. Сохранить изменение на странице раздела.

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

2. Сохранить изменения для мобильного приложения в целом.

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

 3. Выполнить повторную синхронизацию.

Нравится

Поделиться

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

Симптомы

Вопрос по обработке часовых поясов.

В карточке торговой точки есть поля "Воемя доставки от" и "Время доставки до" с типом Время. При создании точки на планшете ставим в них 17:00 и 18:00, в базу они синхронизируются как 14:00 и 15:00. Более того, после синхронизации и на планшете в этих полях оказываются значения 14:00 и 15:00.

В интерфейсе веб-версии они тоже видны как 14:00 и 15:00

Причина

Исправлено в версии 7.8 

Решение

Ниже предоставлен фикс, исправляющие проблему без переноса серверных изменений 7.8 по часовым поясам.

 

Порядок действий следующий:

 

- создать схему UsrSyncExtension (тип «Модуль») в пользовательском пакете;

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

- добавить в нее следующий код:

 

var sysAdminUnitStore = Ext.create("Ext.data.Store", {model: "SysAdminUnit"});
sysAdminUnitStore.setProxy("odata");
sysAdminUnitStore.load({
    queryConfig: Ext.create("Terrasoft.QueryConfig", {
        modelName: "SysAdminUnit",
        autoSetProxy: false,
        columns: ["TimeZoneId"]
    }),
    filters: Ext.create("Terrasoft.Filter", {
        property: "Contact",
        value: Terrasoft.CurrentUserInfo.contactId
    }),
    callback: function(records, operation, success) {
        if (success === true && records.length > 0) {
            var firstRecord = records[0];
            var timeZoneCode = firstRecord.get("TimeZoneId");
            if (!Ext.isEmpty(timeZoneCode)) {
                var timeZoneStore = Ext.create("Ext.data.Store", {model: "TimeZone"});
                timeZoneStore.setProxy("odata");
                timeZoneStore.load({
                    queryConfig: Ext.create("Terrasoft.QueryConfig", {
                    modelName: "TimeZone",
                    autoSetProxy: false,
                    columns: ["Offset"]
                }),
                filters: Ext.create("Terrasoft.Filter", {
                    property: "Code",
                    value: timeZoneCode
                }),
                callback: function(timeZoneRecords, timeZoneOperation, timeZoneSuccess) {
                    if (timeZoneSuccess === true && timeZoneRecords.length > 0) {
                        var timeZoneRecord = timeZoneRecords[0];
                        var offset = timeZoneRecord.get("Offset");
                        var offsetValue = 0;
                        if (!Ext.isEmpty(offset)) {
                            offset = offset.replace("GMT", "");
                            if (!Ext.isEmpty(offset)) {
                                var sign = (offset.substring(0, 1) === "-") ? 1 : -1;
                                var hours = parseInt(offset.substr(1, 2));
                                var minutes = parseInt(offset.substr(4, 2));
                                offsetValue = sign * (hours * 60 + minutes);
                            }
                        }
                        Terrasoft.Configuration.CurrentUserTimeZoneOffset = offsetValue;
                    }
                },
                scope: this
            });
        }
    }
},
scope: this
});
 
if (!Terrasoft.Configuration.processColumn) {
                Terrasoft.Configuration.processColumn = Terrasoft.OData.ResponseParser.processColumn;
}
 
Terrasoft.OData.ResponseParser.processColumn = function(data, queryConfig, record, columnName) {
                var model = record.self;
                var columnConfig = model.ColumnConfigs.get(columnName);
                var columnValue = data[columnName];
                if ((columnConfig.columnType === Terrasoft.ColumnTypes.date ||
                               columnConfig.columnType === Terrasoft.ColumnTypes.datetime) &&
                               !Ext.isEmpty(Terrasoft.Configuration.CurrentUserTimeZoneOffset)) {
                               if (columnValue.indexOf("/") !== -1) {
                                               var timeZoneOffset = Terrasoft.Configuration.CurrentUserTimeZoneOffset;
                                               columnValue = new Date(parseInt(columnValue.substr(6)));
                                               columnValue = new Date(columnValue.getTime() + timeZoneOffset * 60 * 1000);
                               } else {
                                               columnValue = Terrasoft.util.convertISOStringToDate(columnValue);
                               }
                               record.set(columnName, columnValue);
                } else {
                               Ext.callback(Terrasoft.Configuration.processColumn, Terrasoft.OData.ResponseParser, arguments);
                }
};

- добавить в текущий пакет манифест мобильного приложения (манифест соответствующего рабочего места) и в нем прописать схему UsrSyncExtension, а именно добавить ее в SyncExtensions и CustomSchemas:

"SyncExtensions": [
                               "UsrSyncExtension"
                ],
                "CustomSchemas": [
                               "UsrSyncExtension"
                ],

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

Что делает вышеуказанный код:

- получает из SysAdminUnit часовой пояс текущего пользователя;

- при получении дат во время синхронизации использует этот часовой пояс.

Нравится

Поделиться

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

Вопрос

Необходимо открыть внешний доступ к bpm'online только для сервисов мобильного приложения.

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

Ответ

Интеграция осущевстляется через O'Data по порту сайта.

Сервисы используемые мобильным приложением в версии 7.8.2:

http://server/ServiceModel/AuthService.svc

http://server/0/Services/ProfileService.asmx

http://server/0/Mobile/Services/MobileDataService.ashx

http://server/0/Mobile/Services/MobileCodeService.ashx

http://server/0/ServiceModel/EntityDataService.svc

Список сервисов в последующих обновлениях мобильного приложения может быть изменен.

Нравится

Поделиться

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

Вопрос

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

Ответ

Пример.

Необходимо настроить следующие параметры:

LEADS: Only show leads with the LEAD STAGES: Registration and Qualification.

OPPORTUNITIES: Only show opportunities with the OPPS STAGES: Presentation, Proposal, Negotiation and Pending.

Используем следующий код (для Лида):

Terrasoft.sdk.Module.addFilter("Lead", Ext.create("Terrasoft.Filter", {
    type: Terrasoft.FilterTypes.Group,
    logicalOperation: Terrasoft.FilterLogicalOperations.Or,
    subfilters: [
        {
            property: "QualifyStatus",
            value: "d790a45d-03ff-4ddb-9dea-8087722c582c"
        },
        {
            property: "QualifyStatus",
            value: "14cfc644-e3ed-497e-8279-ed4319bb8093"
        }
    ]
}));

 - Для начала нам необходимо создать новые модули с кодом фильтрации отдельно для Лида, отдельно для Продажи:

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

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

 - Затем в конфигурациях выбираем рабочее место (если у клиента их несколько), к которому будем применять фильтр, в нашем случае MobileApplicationManifestOn_the_Road

Там нам необходимо добавить нами созданные модули с фильтрами в тех разделах, к которым относятся фильтры, в данном случае в Lead и Opportunity в PageExtentions

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

  - Сохраняем.

Нравится

Поделиться

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

Спасибо! Ваша статья очень помогла. Пробовал настроить фильтрацию в манифесте через SyncFilter и QueryFilter, но ничего не получилось (точнее фильтрация работала только в офлайн режиме). А когда перенес свои фильтры в модуль, то все заработало.

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

Вопрос

Я не могу синхронизировать мой демо сайт Центра взаимодействия с клиентами с мобильным приложением.

Ошибка:

"requestId":20,"status":200,"statusText":"OK","responseText":"{\"Code\":1,\"Message\":\"Either invalid login or password specified, or your user account is inactive.Verify that you have entered correct data or contact support service.\"

Ответ

Для bpm'online 7.5 мобильное приложение доступно только для Sales (Team, Commerce, Enterprise, Omnichannel).

Нравится

Поделиться

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

Android

 

Обязательные требования

Icon

  • Компьютер под управлением Windows;
  • На компьютере должен быть установлен Chrome браузер;
  • Мобильное устройство под управлением Android.

 

 

  1. Скачать Vysor chrome extension для браузера Chrome
  2. Подключить мобильное устройство к ПК или ноутбуку
  3. Запустить Vysor

    Изображение удалено.
  4.  В списке доступных устройств выбрать ваше устройство и нажать кнопку "View"

    Изображение удалено.
  5. Выполнится установка приложения Vysor на Ваше устройство и откроется окно в котором будет демонстрироватся экран устройства

 

iOS

 

Обязательные требования

Icon

  • Компьютер под управлением MacOS;
  • Мобильное устройство под управлением iOS.

 

  1. Подключить мобильное устройство к компьютеру под управлением MacOS
  2. На компьютере запустить приложение QuickTime Player
  3. Выбрать "New Movie Recording" 

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

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

 

Нравится

Поделиться

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

Симптомы

Тип: Terrasoft.UnauthorizedServerException%0D%0AСообщение: Неправильное имя пользователя, пароль или адрес сервера bpm'online%0D%0AДополнительная информация: %0D%0A%09{"request":{"id":2,"headers":{"X-Terrasoft-Mobile":"true","Accept":"application/json","Content-Type":"application/json","Authorization":"Cookie","X-Requested-With":"XMLHttpRequest"},"options":{"url":"http://xxxx.xxxxx.xxxx/ServiceModel/AuthService.svc/Login","method":"POST","jsonData":{"UserName":"Xxxxxxx","UserPassword":"xxxxxxx","TimeZoneOffset":-180},"scope":{"initialConfig":{"url":"http://cxxxx.xxxxx.xxxx/ServiceModel/AuthService.svc/Login","method":"POST","jsonData":{"UserName":"Xxxxxxx","UserPassword":"xxxxxxx","TimeZoneOffset":-180},"scope":{},"headers":{"X-Terrasoft-Mobile":"true","Accept":"application/json","Content-Type":"application/json","Authorization":"Cookie"},"disableCaching":false},"performanceCounter":{"startDate":"2015-05-27T07:08:29.520Z"}},"headers":{"X-Terrasoft-Mobile":"true","Accept":"application/json","Content-Type":"application/json","Authorization":"Cookie"},"disableCaching":false},"async":true},"requestId":2,"status":401,"statusText":"Unauthorized","responseText":"{\"Message\":\"Проверка подлинности не пройдена.\",\"StackTrace\":null,\"ExceptionType\":\"System.InvalidOperationException\"}","responseXML":null,"responseBytes":null}%0D%0A%0D%0A

Причина

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

Решение

Ввести корректные данные.

Нравится

Поделиться

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

Симптомы

Тип: Terrasoft.SyncException%0D%0AСообщение: Unable to connect to server

Probable causes:
- Could not connect to internet
- Server unavailable
- Incorrect server address%0D%0A%0D%0AТип: Terrasoft.ServerException%0D%0AСообщение: Запрос на сервер вернул ошибку%0D%0AДополнительная информация: %0D%0A%09{"request":{"id":1,"xhr":{"statusText":"","status":0,"response":"","responseType":"","responseXML":null,"responseText":"","upload":{"onprogress":null,"onloadstart":null,"onloadend":null,"onload":null,"onerror":null,"onabort":null},"withCredentials":false,"readyState":0,"timeout":0,"onreadystatechange":null,"ontimeout":null,"onprogress":null,"onloadstart":null,"onloadend":null,"onload":null,"onerror":null,"onabort":null},"headers":{"X-Terrasoft-Mobile":"true","Accept":"application/json","Content-Type":"application/json","Authorization":"Cookie","X-Requested-With":"XMLHttpRequest"},"options":{"url":"https://xxxxxx.xxxxx.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":"https://xxxxxx.xxxxx.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},"performanceCounter":{"startDate":"2015-05-25T15:54:03.446Z"}}},"async":true,"timedout":true},"requestId":1,"status":0,"statusText":"communication failure","timedout":true}%0D%0A%0D%0A 

Причина

  1. Отсутствие интернета
  2. Неверно прописан адрес сайта
  3. Сайт был недоступен

Решение

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

Нравится

Поделиться

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