Симптомы

Тип: Terrasoft.ServerException 

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

{{Terrasoft.PerformanceCounterManager.startCounter(\"onReady\");Ext.BLANK_IMAGE_URL=\"/0/terrasoft.axd?rm=Terrasoft.UI.WebControls&r=s.gif\";\r\n\r\nthis.ErrorIcon=new Terrasoft.ImageBox({\r\n  id: \"ErrorIcon\",\r\n  cls: \"application-ico-error\",\r\n  renderTo: \"ErrorIcon_Container\"\r\n});\r\nthis.ErrorOccures=new Terrasoft.Label({\r\n  id: \"ErrorOccures\",\r\n  cls: \"x-label-black\",\r\n  renderTo: \"ErrorOccures_Container\",\r\n  caption: \"В работе приложения bpm'online возникла ошибка. Приносим извинения за неудобства.\"\r\n});\r\nthis.ErrorSupportInfo=new Terrasoft.Label({\r\n  id: \"ErrorSupportInfo\",\r\n  cls: \"x-label-black\",\r\n  renderTo: \"ErrorSupportInfo_Container\",\r\n  caption: \"Пожалуйста, сообщите в службу поддержки bpm'online об этой ошибке.\"\r\n});Terrasoft.PerformanceCounterManager.stopCounter(\"onReady\");}});Terrasoft.ScriptManagerUniqueID=\"ScriptManager\";\n\t//]]>\n\t\n\r\n\r\n\t\r\n\r\n\r\n\r\nМы гарантируем полную конфиденциальность и анонимность.
\r\n\t\t\t
\r\n\t\t\t\r\n\t\t\t
\r\n\t\t\t
\r\n\t\t\tПоказать детальную информацию об ошибке

\r\n\t\t\tDate: 07.11.2015 8:12:22\r\nDate (UTC): 07.11.2015 6:12:22\r\n\r\nException Message: Memory gates checking failed because the free memory (107479040 bytes) is less than 1% of total memory.  As a result, the service will not be available for incoming requests.  To resolve this, either reduce the load on the machine or adjust the value of minFreeMemoryPercentageToActivateService on the serviceHostingEnvironment config element.\r\nException Type: System.InsufficientMemoryException\r\nException Source: System.ServiceModel.Activation\r\n\r\nException Stack Trace:\r\n  at System.ServiceModel.Activation.ServiceMemoryGates.Check(Int32 minFreeMemoryPercentage, Boolean throwOnLowMemory, UInt64& availableMemoryBytes)\r\n  at System.ServiceModel.ServiceHostingEnvironment.HostingManager.CheckMemoryCloseIdleServices(EventTraceActivity eventTraceActivity)\r\n  at System.ServiceModel.ServiceHostingEnvironment.HostingManager.EnsureServiceAvailable(String normalizedVirtualPath, EventTraceActivity eventTraceActivity)\r\n\r\nSessionID: w0l0muum2dgm2vmlxyszxo0j\r\nRequest URL: /0/ServiceModel/EntityDataService.svc/MobileDataCollection?$select=Id,CreatedById,CreatedOn,ModifiedById,ModifiedOn,Key&%24skip=0&%24top=-1\r\nRequest Path: /0/ServiceModel/EntityDataService.svc/MobileDataCollection\r\nRequest Type: GET\r\nUser Agent: Mozilla/5.0 (iPhone; CPU iPhone OS 9_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Mobile/13B143 (5048248176)\r\nUser Host Address: 37.147.161.229\r\nUser: Xxxxxxxxxxx\r\nIs Authenticated: True\r\nAuthentication Type: Forms\r\nIs Secure Connection: True\r\n\r\nApplication Version: 7.6.0.1148\r\nApplication Path: D:\\App\\peremenatrade\\Terrasoft.WebApp\\\r\nApplication Virtual Path: /0\r\nApplication Trust Level: Full\r\nMachine Name: RU2-C004-WEB01\r\nIs Local: False\r\n\r\nProcess ID: 9124\r\nProcess Name: w3wp.exe\r\nProcess Account Name: RU\\iis-peremenatrade\r\nThread Account Name: RU\\iis-peremenatrade\r\nOS Version: Microsoft Windows NT 6.3.9600.0\r\nNet Framework Version: 4.0.30319.34209\r\nDBExecutor Type: MSSqlExecutor\r\n\r\n\t\t\r\n\t\r\n\r\n\r\n"}

Причина

Согласно ошибки мобильного приложения:

Exception Message: Memory gates checking failed because the free memory (107479040 bytes) is less than 1% of total memory.  As a result, the service will not be available for incoming requests.  To resolve this, either reduce the load on the machine or adjust the value of minFreeMemoryPercentageToActivateService on the serviceHostingEnvironment config element.\r\nException Type: System.InsufficientMemoryException\r\nException Source: System.ServiceModel.Activation\r\n\r\nException Stack Trace:\r\n  at System.ServiceModel.Activation.ServiceMemoryGates.Check(Int32 minFreeMemoryPercentage, Boolean throwOnLowMemory, UInt64& availableMemoryBytes)\r\n  at System.ServiceModel.ServiceHostingEnvironment.HostingManager.CheckMemoryCloseIdleServices(EventTraceActivity eventTraceActivity)\r\n  at 

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

Решение

Перезапустить сайт в IIS.

Нравится

Поделиться

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

Вопрос

Уточните, пожалуйста, для определение GPS-координат на мобильном устройстве Android используется Terrasoft.Geolocation.getCurrentCoordinates, который по каким-то причинам не запускает GPS-модуль (в UI устройства не появляется индикатор запуска GPS). Уточните пожалуйста, может ли информация о координатах сниматься без включения данного модуля (некий кэш координат)?

Ответ

Да, сервис GPS может не включаться. Данные могут браться на основании настроек мобильного устройства из WiFi-точек либо действительно могут кешироваться.

На самом деле, тем как bpm'online получает координаты, можно управлять. Приведу пример текущей реализации упомянутого метода:

getCurrentCoordinates: function(config) {
   var enableHighAccuracy = !Terrasoft.Connection.isOnline() ||
      Terrasoft.Connection.getType() !== Terrasoft.ConnectionTypes.WiFi;
   var geo = Ext.create("Ext.util.Geolocation", {
      autoUpdate: false,
      allowHighAccuracy: enableHighAccuracy,
      timeout: 60000,
      listeners: {
         scope: this,
         locationupdate: function(geo) {
            Ext.callback(config.success, config.scope, [geo.getLatitude(), geo.getLongitude()]);
         },
         locationerror: function(geo, timeout, permissionDenied, locationUnavailable, message) {
            …
         }
      }
   });
   geo.updateLocation();
}

Сейчас, если нет интернет-соединения или это соединение – не WiFi (типа, EDGE, 3G), то будет использоваться «точное» позиционирование (с использованием GPS), иначе данные будут получены с использованием WiFi, кеширования и т.д., т.е. способами дающими неточные представления о местоположении устройства, но вполне достаточные для выполнения бизнес-задач.

Если, все-таки, нужно в любом случае получать данные с использованием GPS, можно создать свою реализацию действия, по аналогии с тем, как это реализовано в bpm'online:

getCurrentCoordinates: function(config) {
   var geo = Ext.create("Ext.util.Geolocation", {
      autoUpdate: false,
      allowHighAccuracy: true,
      timeout: 60000,
      listeners: {
         scope: this,
         locationupdate: function(geo) {
            Ext.callback(config.success, config.scope, [geo.getLatitude(), geo.getLongitude()]);
         },
         locationerror: function(geo, timeout, permissionDenied, locationUnavailable, message) {
            …
         }
      }
   });
   geo.updateLocation();
}

При реализации нужно учитывать, что у такого способа есть ряд проблем:

- несмотря, что метод GPS более точен, время получения таких данных может быть достаточно больших (до 10-15 минут)

- соответсвенно время ожидания получения ответа нужно увеличить, т.е. параметр timeout выше в коде нужно будет устанавливать больше, чем 1 минуту (60000 мс)

- любые перекрытия, помехи в виде любых объектов могут не позволить получить координаты (например, у нас в офисе это нереально)

- быстрее садится батарея, что для Android-устройств весьма критично

Нравится

Поделиться

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

Симптомы

Не работает мобильное приложение BPM 7.6.0.838 onSite

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

Решение

Скорее всего у Вас не обновлена структура базы.

Для обновления структуры базы в браузере необходимо:

- Закрыть все экземпляры Chrome;

- Перейти в папку, в которой Chrome хранит локальные данные: C:\Users\[ИМЯ_ПОЛЬЗОВАТЕЛЯ]\AppData\Local\Google\Chrome\User Data\Default;

- Удалить содержимое папок:

C:\Users\[ИМЯ_ПОЛЬЗОВАТЕЛЯ]\AppData\Local\Google\Chrome\User Data\Default\File System

C:\Users\[ИМЯ_ПОЛЬЗОВАТЕЛЯ]\AppData\Local\Google\Chrome\User Data\Default\databases

- Перезапускаем Chrome, используя startchrome.bat (в папке Mobile с исходниками моб. приложения);

- Запускаем мобильное приложение в браузере.

В результате Chrome создаст с нуля локальную базу со всеми необходимыми таблицами (в том числе с новыми колонками, как в указанном случае).

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

Нравится

Поделиться

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

Вопрос

Каким образом можно залезть в локальную базу эмулятора мобильного приложения?

Посмотреть, какие данные приходят во время синхронизации в режиме оффлайн.

Ответ

Физически файл лежит здесь - ...\7.11.7\ChromeUserData\Default\databases\file__0, но Вы его не сможете открыть пользовательскими средствами из-за кодировки.

Есть два варианта: 



- в браузере после того, как просинхронизировались открыть консоль, перейти во вкладку "Application", раскрыть список баз в Web SQL и выбрать базу bpm'online - http://prntscr.com/hke2e6. В результате Вы можете писать SQL запросы и видеть список всех таблиц. Больше информации можете найти на сайте Google Chrome - https://developers.google.com/web/tools/chrome-devtools/manage-data/local-storage;

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

- найти расширение для Firefox, который умеет работать SQLlite (найти можно на сторонних ресурсах).

Нравится

Поделиться

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

Симптомы

Попытался повторно синхронизироваться. Вижу ошибку:

Тип: Terrasoft.SyncException%0D%0AСообщение: В процессе синхронизации произошла ошибка%0D%0A%0D%0AТип: Terrasoft.ServerException%0D%0AСообщение: Запрос на сервер вернул ошибку%0D%0AДополнительная информация: %0D%0A%09{"request":{"id":6,"headers":{"X-Terrasoft-Mobile":"true","Accept":"application/json","Content-Type":"application/json","Authorization":"Cookie","X-Requested-With":"XMLHttpRequest"},"options":{"url":"http://xxx.xxx.xxx.xxx/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://xxx.xxx.xxx.xxx/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-06-08T12:11:51.319Z"}}},"async":true},"requestId":6,"status":500,"statusText":"Internal Server Error","responseText":"System.InvalidOperationException: Request format is invalid: application/json.\r\n   at System.Web.Services.Protocols.HttpServerProtocol.ReadParameters()\r\n   at System.Web.Services.Protocols.WebServiceHandler.CoreProcessRequest()\r\n","responseXML":null,"responseBytes":null}%0D%0A%0D%0A

Причина

Проблема в настройках IIS

Решение

Заходим в настройки IIS - модуль Handler Mappings

Ищем правила для файлов с расширением *.asmx с такими названиями:

"WebServiceHandlerFactory-Integrated"

"WebServiceHandlerFactory-ISAPI-2.0_32bit"

"WebServiceHandlerFactory-ISAPI-2.0_64bit"

(это всё устаревшие версии)

и удаляем их

Нравится

Поделиться

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

Вопрос

Как убрать действие в мобильном приложении и как можно их отсортировать

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

Ответ

Примерный алгоритм.

1. Необходимо создать свой модуль (например «TestOrderRemoveMobileAccountModuleConfig»)

2. Для удаления действия необходимо использовать следующий метод - Terrasoft.sdk.Actions.remove: function(model, actionName)

 

Пример:

Terrasoft.sdk.Actions.remove("Account", "addAccountAnniversary");



3. Для сортировки нужно использовать:

Terrasoft.sdk.Actions.setOrder("model ", {
    "actionName1": 0,
    "actionName2": 1,
    …,
    "actionName5": 4
});

Пример:

Terrasoft.sdk.Actions.setOrder("Account", {
    "Phone": 0,
    "Email": 1,
    "Meeting": 2,
    "Terrasoft.ActionCopy": 3,
    "Terrasoft.ActionDelete": 4
});
 

4. Потом подключить в пользовательском манифесте мобильного приложения (можно ознакомиться на нашем SDK)  в секции «Models» для объекта «Account» (если это контрагенты) в разделе «PagesExtensions». Например:

"Models": {
    "Account": {
        "RequiredModels": [],
        "ModelExtensions": [],
        "PagesExtensions": [
            "TestOrderRemoveMobileAccountModuleConfig"
        ]
    },
 



где TestOrderRemoveMobileAccountModuleConfig – произвольное название схемы.

 

Реализацию логики добавления адреса можете посмотреть в схеме «MobileAccountModuleConfig» (действие называется «addAccountAddress»).

Нравится

Поделиться

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

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

Нет, при помощи Terrasoft SDK такой возможности нет.

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

Симптомы

При установке bpm'online mobile 7 для Windows 10 ошибка "The error code is 0x803F7000"

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

Причина

Ошибка связана с локальными настройками Windows 10.

Причины ошибки:

  • Windows Store Cache.
  • Неверные данные и время.
  • Окна не активировали.
  • Microsoft Сервер перегружен.

Решение

Ссылки, в которых описана причина и решение данной проблемы:

-      http://answers.microsoft.com/en-us/windows/forum/windows_10-win_upgrade/error-code-0x803f7000-in-windows-store-10/18f61f6f-009a-435f-8d33-6956e301a849?auth=1

-      http://www.fixerrs.com/2015/09/fix-error-0x803f7000-windows-10-store.html

-      http://errortools.com/windows/how-to-fix-windows-10-error-code-0x803f7000/

-      http://microsoftfixnow.com/error-code-0x803f7000-windows-10-while-accessing-windows-store/

Нравится

Поделиться

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

Вопрос

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

После попадания в основную систему, где можно их увидеть?

Ответ

К сожалению, в базовой версии продукта эти данные не отображаются.

Найти эти данные можно в таблице БД, которая называется CheckInOutResult.

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

Информацию о визите на  мы храним локально на устройстве и затем при синхронизации передаем ее.

Получение данных при чекине (схема «FieldForceMobileUtilitiesV2»):

checkInOut: function(activityId, isCheckIn) {
    Terrasoft.Geolocation.getCurrentCoordinates({
        success: function(latitude, longitude) {
            var checkinResultModelName = "CheckInOutResult";
            var saveQueryConfig = Ext.create("Terrasoft.QueryConfig", {
                modelName: checkinResultModelName,
                columns: ["GpsX", "GpsY", "Activity", "IsCheckIn", "ActionTime"]
            });
            var checkInOutRecord = Ext.create("CheckInOutResult", {
                Activity: activityId,
                GpsX: String(latitude),
                GpsY: String(longitude),
                IsCheckIn: isCheckIn,
                ActionTime: new Date()
            });
            checkInOutRecord.save({
                queryConfig: saveQueryConfig,
                success: function() {
                    this.changeActivityStatusByCheckInOut(isCheckIn);
                },
                failure: this.failureHandler
            }, this);
        },
        failure: this.failureHandler,
        scope: this
    });
},
 

Получение текущих координат описано в схеме «FieldForceMapsModule»

Также, координаты, которые получает bpm'online, можно управлять. Приведу пример текущей реализации метода «Terrasoft.Geolocation.getCurrentCoordinates»:

getCurrentCoordinates: function(config) {
   var enableHighAccuracy = !Terrasoft.Connection.isOnline() ||
      Terrasoft.Connection.getType() !== Terrasoft.ConnectionTypes.WiFi;
   var geo = Ext.create("Ext.util.Geolocation", {
      autoUpdate: false,
      allowHighAccuracy: enableHighAccuracy,
      timeout: 60000,
      listeners: {
         scope: this,
         locationupdate: function(geo) {
            Ext.callback(config.success, config.scope, [geo.getLatitude(), geo.getLongitude()]);
         },
         locationerror: function(geo, timeout, permissionDenied, locationUnavailable, message) {
            …
         }
      }
   });
   geo.updateLocation();
}

Сейчас, если нет интернет-соединения или это соединение – не WiFi (типа, EDGE, 3G), то будет использоваться «точное» позиционирование (с использованием GPS), иначе данные будут получены с использованием WiFi, кеширования и т.д., т.е. способами дающими неточные представления о местоположении устройства, но вполне достаточные для выполнения бизнес-задач.

Если нужно получать данные с использованием GPS, можно создать свою реализацию действия, по аналогии с тем, как это реализовано в bpm'online:

getCurrentCoordinates: function(config) {
   var geo = Ext.create("Ext.util.Geolocation", {
      autoUpdate: false,
      allowHighAccuracy: true,
      timeout: 60000,
      listeners: {
         scope: this,
         locationupdate: function(geo) {
            Ext.callback(config.success, config.scope, [geo.getLatitude(), geo.getLongitude()]);
         },
         locationerror: function(geo, timeout, permissionDenied, locationUnavailable, message) {
            …
         }
      }
   });
   geo.updateLocation();
}

При реализации нужно учитывать, что у такого способа есть ряд проблем:

- несмотря, что метод GPS более точен, время получения таких данных может быть достаточно больших (до 10-15 минут);

- соответсвенно время ожидания получения ответа нужно увеличить, т.е. параметр timeout выше в коде нужно будет устанавливать больше, чем 1 минуту (60000 мс);

- любые перекрытия, помехи в виде любых объектов могут не позволить получить координаты (например, у нас в офисе это нереально);

- быстрее садится батарея, что для Android-устройств весьма критично.

Нравится

Поделиться

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

Симптомы

В мобильном приложении добавляется файл/фото на деталь "файлы и ссылки" в одном из разделов.

После запуска синхронизации возникает ошибка:

Bpm'online mobile bug report

Type: Terrasoft.ODataException 

Message: An error occurred while processing this request. 

Сообщение содержит: Невозможно получить значение колонки Data, так как она не была загружена

Причина

В процессе схемы File в скрипте ScriptFileSaving есть код:

var data = Entity.GetColumnValue("Data") as byte[];

И если обновлять данные в этой схеме (через OData) и не указывать колонку Data, то появляется сообщение, что она не загружена.

Такая ситуация может происходить если в таблице файлов (ActivityFile, OpportunityFile и т.п.) есть циклическая связь.

Например в таблице ActivityFile есть колонка Activity, которая ссылается на таблицу Activity, в которой, в свою очередь, есть справочная колонка UsrActivityFile, которая ссылается на таблицу ActivityFile.

Мобильное приложение это отслеживает и разбивает один запрос

 

INSERT INTO ActivityFile (Id, Name, Data, Activity) VALUES (1, 2, 3, 4)

На два запроса:

INSERT INTO ActivityFile (Id, Name, Data) VALUES (1, 2, 3)
UPDATE ActivityFile SET Activity = 4 WHERE Id = 1

Вот этот второй запрос и не срабатывает.

Решение

Есть обходное решение. Для требуемой таблицы в манифесте установить признак IgnoreSplitLogActions

{
   "SyncOptions": {
      "ModelDataExportConfig": [
         {
            "Name": "ActivityFile",
            "IgnoreSplitLogActions": true
         }
      ],

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

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

Для UIV1 необходимо дополнительно "заоверрайдить" схему:

if (!Terrasoft.SysSettingsValue.getBooleanValue("UseMobileUIV2")) {
    /*
     * Moved from UIV2
     */
    Ext.define("Terrasoft.Sync.LogManager.override", {
        override: "Terrasoft.Sync.LogManager",
        /**
         * @private
         */
        ignoreSplitLogActions: function(logAction) {
            var modelName = logAction.get("ModelName");
            var manifest = Terrasoft.ApplicationConfig.manifest;
            var ignore = false;
            if (manifest.SyncOptions) {
                var modelDataExportConfig = manifest.SyncOptions.ModelDataExportConfig || [];
                for (var i = 0, ln = modelDataExportConfig.length; i < ln; i++) {
                    var modelConfig = modelDataExportConfig[i];
                    if (Ext.isObject(modelConfig) && modelConfig.Name === modelName) {
                        ignore = modelConfig.IgnoreSplitLogActions;
                        break;
                    }
                }
            }
            return ignore === true;
        },
        /**
         * @private
         */
        splitLogActions: function() {
            var firstTierActions = this.firstTierActions = [];
            var secondTierActions = this.secondTierActions = [];
            for (var i = 0, ln = this.mergedLogActions.length; i < ln; i++) {
                var logAction = this.mergedLogActions[i];
                if (this.isCreateAction(logAction) && !this.ignoreSplitLogActions(logAction)) {
                    firstTierActions.push(logAction);
                    this.splitLogActionWithLoopColumns(logAction);
                    this.splitLogActionWithBinaryColumns(logAction);
                } else {
                    secondTierActions.push(logAction);
                    if (this.isUpdateAction(logAction)) {
                        this.splitLogActionWithBinaryColumns(logAction);
                    }
                }
            }
        }
    });
}

 

Нравится

Поделиться

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

Симптомы

Испытываю сложности с настройкой клиента на IOS, он просто не проходит процедуру синхронизации, говорит что сервер недоступен и т.п. При этом, на андроиде все работает

Причина

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

Решение

1. Убедиться что метод отключен в IIS. В структуре IIS выбрать сайт, перейти в меню Authentication. Включены только Anonymous, Forms Authentications.

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

2. Убедиться, что версия .Net Framework соответствует значениям из таблицы. Определить версию можно в регистре, ознакомившись со статьей https://msdn.microsoft.com/en-us/library/hh925568%28v=vs.110%29.aspx

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

3. Перезапустить сайт.

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

Доступ к IIS, доступ к регистру.

Нравится

Поделиться

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