Симптомы

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

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

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 комментариев
Показать все комментарии

Вопрос

При нажатии на кнопку "добавить" детали "Продукты в заказе" возникала следующая ошибка.

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

Аналогичная ошибка возникала про попытке добавить "График поставок и оплат" 

Ответ

Проблема в следующем: при попытке добавить продукт предварительно выполняется сохранение страницы, однако по неизвестным причинам был изменен базовый спрвочник "OrderStatus". Во время сохранения выполняется проверка на равенство сумм и код страницы OrderPageV2 пакета Passport отрабатывает некорректно:

validateOrderStatus: function(callback, scope) {
    var result = {
        success: true
    };
    var status = this.get("Status");
    var primaryAmount = this.get("PrimaryAmount");
    var OrderStatus = OrderConfigurationConstants.Order.OrderStatus;
    if (status && (status.value === OrderStatus.InPlanned || status.value === OrderStatus.Canceled)) {
        callback.call(scope || this, result);
        return;
    }
    var esq = Ext.create("Terrasoft.EntitySchemaQuery", {
        rootSchemaName: "SupplyPaymentElement"
    });
    esq.addAggregationSchemaColumn("PrimaryAmountPlan", Terrasoft.AggregationType.SUM,
"PrimaryAmountPlanSum");
    var filters = Terrasoft.createFilterGroup();
    filters.addItem(Terrasoft.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL,
"Order", this.get("Id")));
    filters.addItem(Terrasoft.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL,
"Type", OrderConfigurationConstants.SupplyPaymentElement.Type.Payment));
    esq.filters = filters;
    esq.getEntityCollection(function(response) {
        if (response.success) {
            var collection = response.collection;
            if (collection.getCount() > 0 && primaryAmount !==
collection.getByIndex(0).get("PrimaryAmountPlanSum")) {
                result.message = this.get("Resources.Strings.ValidateOrderStatus");
                result.success = false;
            }
        } else {
            return;
        }
        callback.call(this, result);
    }, scope);

Инструкция

var status = this.get("Status"); - возвращает undefined

collection.getByIndex(0).get("PrimaryAmountPlanSum"))  - возвращает 0

Из-за это не проходит проверка и выдается предупреждения для статуса "В планах"

Для решения необходимо заместить модуль OrderConfigurationConstant и указать в нем корректные id, тогда код:

if (status && (status.value === OrderStatus.InPlanned || status.value === OrderStatus.Canceled)) {
    callback.call(scope || this, result);
    return;
}

будет выполняться корректно.

 

Нравится

Поделиться

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

Вопрос

Не даёт из активностей удалить участника,

Пишет, что ответственного удалить нельзя, но он НЕ ЯВЛЯЕТСЯ ответственным.

Ответ

-- понижение для не ответственных до учасника
SELECT ac.Id, Title, OwnerId, ap.ParticipantId, ap.Id as ApId FROM Activity ac
LEFT JOIN ActivityParticipant ap on ap.RoleId = '53fc4a92-b0ea-e111-96c4-00165d094c12'
AND ac.Id = ap.ActivityId
WHERE OwnerId <> ap.ParticipantId
--
UPDATE ActivityParticipant SET RoleId = '1a8324e8-a6e1-df11-971b-001d60e938c6'
WHERE Id In (
SELECT ap.Id FROM Activity ac
LEFT JOIN ActivityParticipant ap on ap.RoleId = '53fc4a92-b0ea-e111-96c4-00165d094c12'
AND ac.Id = ap.ActivityId
WHERE OwnerId <> ap.ParticipantId
)
-- повышение ответственных до ответственного
SELECT ac.Id, Title, OwnerId, ap.ParticipantId, ap.Id as AppId, ap.RoleId FROM Activity ac
LEFT JOIN ActivityParticipant ap on ac.Id = ap.ActivityId
WHERE ac.OwnerId = ap.ParticipantId AND
ap.RoleId <> '53fc4a92-b0ea-e111-96c4-00165d094c12'
--
UPDATE ActivityParticipant Set RoleId = '53fc4a92-b0ea-e111-96c4-00165d094c12'
WHERE Id In (
SELECT ap.Id FROM Activity ac
LEFT JOIN ActivityParticipant ap on ac.Id = ap.ActivityId
WHERE ac.OwnerId = ap.ParticipantId AND
ap.RoleId <> '53fc4a92-b0ea-e111-96c4-00165d094c12'
)

 

Нравится

Поделиться

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

Вопрос

В версии 7.7.0.2293 SalesEnterprise + Marketing + CustomerCenter в редактируемом реестре все поля изменяемой записи доступны для изменений. Как можно заблокировать от изменений отдельные поля? 

Ответ

1) Создать деталь с помощью мастера деталей, на закладке страницы вывести хотя бы несколько полей. Сохранить.

2) Зарегистрировать мастером разделов деталь на странице в разделе. Настроить колонки.

3) Для того, чтобы деталь стала редактируемой, добавляем зависимости, миксин, атрибут и мердж грида в блоке дифф как показано в примере ниже:

define("UsrSchema1Detail", ["ConfigurationGrid", "ConfigurationGridGenerator",
"ConfigurationGridUtilities"], function() {
    return {
        entitySchemaName: "UsrTestContactDetail",
        attributes: {
            "IsEditable": {
                dataValueType: Terrasoft.DataValueType.BOOLEAN,
                type: Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
                value: true
            }
        },
        mixins: {
            ConfigurationGridUtilites: "Terrasoft.ConfigurationGridUtilities"
        },
        details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
        diff: /**SCHEMA_DIFF*/[
            {
            "operation": "merge",
            "name": "DataGrid",
            "values": {
               "className": "Terrasoft.ConfigurationGrid",
               "generator": "ConfigurationGridGenerator.generatePartial",
               "generateControlsConfig": {"bindTo": "generatActiveRowControlsConfig"},
               "changeRow": {"bindTo": "changeRow"},
               "unSelectRow": {"bindTo": "unSelectRow"},
               "onGridClick": {"bindTo": "onGridClick"},
               "activeRowActions": [
                  {
                     "className": "Terrasoft.Button",
                     "style": this.Terrasoft.controls.ButtonEnums.style.TRANSPARENT,
                     "tag": "save",
                     "markerValue": "save",
                     "imageConfig": {"bindTo": "Resources.Images.SaveIcon"}
                  },
                  {
                     "className": "Terrasoft.Button",
                     "style": this.Terrasoft.controls.ButtonEnums.style.TRANSPARENT,
                     "tag": "cancel",
                     "markerValue": "cancel",
                     "imageConfig": {"bindTo": "Resources.Images.CancelIcon"}
                  },
                  {
                     "className": "Terrasoft.Button",
                     "style": this.Terrasoft.controls.ButtonEnums.style.TRANSPARENT,
                     "tag": "remove",
                     "markerValue": "remove",
                     "imageConfig": {"bindTo": "Resources.Images.RemoveIcon"}
                  }
               ],
               "initActiveRowKeyMap": {"bindTo": "initActiveRowKeyMap"},
               "activeRowAction": {"bindTo": "onActiveRowAction"},
               "multiSelect": false
            }
         }
        ]/**SCHEMA_DIFF*/,
        methods: {}
    };
});

5) В схеме страницы редактирования детали описываем бизнес-правило по правилам написания бизнес-правил - http://academy.terrasoft.ua/documents/docs/technic/SDK/7.6.0/BlockingFieldByCondition.html

define("UsrUsrTestContactDetail1Page", ["BusinessRuleModule"], function(BusinessRuleModule) {
    return {
        entitySchemaName: "UsrTestContactDetail",
        details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
        diff: /**SCHEMA_DIFF*/[
            {
                "operation": "insert",
                "name": "UsrContact",
                "values": {
                    "layout": {
                        "colSpan": 12,
                        "rowSpan": 1,
                        "column": 0,
                        "row": 0,
                        "layoutName": "Header"
                    },
                    "bindTo": "UsrContact"
                },
                "parentName": "Header",
                "propertyName": "items",
                "index": 0
            },
            {
                "operation": "insert",
                "name": "UsrTestInt1",
                "values": {
                    "layout": {
                        "colSpan": 12,
                        "rowSpan": 1,
                        "column": 12,
                        "row": 0,
                        "layoutName": "Header"
                    },
                    "bindTo": "UsrTestInt1"
                },
                "parentName": "Header",
                "propertyName": "items",
                "index": 1
            },
            {
                "operation": "insert",
                "name": "UsrTestInt2",
                "values": {
                    "layout": {
                        "colSpan": 12,
                        "rowSpan": 1,
                        "column": 0,
                        "row": 1,
                        "layoutName": "Header"
                    },
                    "bindTo": "UsrTestInt2"
                },
                "parentName": "Header",
                "propertyName": "items",
                "index": 2
            },
            {
                "operation": "insert",
                "name": "CreatedBy",
                "values": {
                    "layout": {
                        "colSpan": 12,
                        "rowSpan": 1,
                        "column": 12,
                        "row": 1,
                        "layoutName": "Header"
                    },
                    "bindTo": "CreatedBy"
                },
                "parentName": "Header",
                "propertyName": "items",
                "index": 3
            }
        ]/**SCHEMA_DIFF*/,
        methods: {},
        rules: {
            "UsrTestInt1": {
                "EnabledUsrTestInt1": {
                    "ruleType": BusinessRuleModule.enums.RuleType.BINDPARAMETER,
                    "property": BusinessRuleModule.enums.Property.ENABLED,
                    "conditions": [
                        {
                            "leftExpression": {
                                "type": BusinessRuleModule.enums.ValueType.CONSTANT,
                                "value": true
                            },
                            comparisonType: Terrasoft.ComparisonType.NOT_EQUAL,
                            rightExpression: {
                                type: BusinessRuleModule.enums.ValueType.CONSTANT,
                                value: true
                            }
                        }
                    ]
                }
            }
        }
    };
});

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

Нравится

Поделиться

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

Симптомы

На странице "Заказ" у пользователя на всех вкладках отображаются поля "Состояние оплаты", "Состояние доставки" и итоги по валютам. Мастером разделов данные поля отредактивать возможности нет, в мастере они отображаются в том же виде что и на странице.

Причина

Страница OrderPageV2 была разработана партнером и содержала следующий код для указанных элементов (пример для состояния доставки):

{
    "operation": "merge",
    "name": "PaymentStatus",
    "values": {
        "layout": {
            "column": 0,
            "row": 1,
            "colSpan": 12,
            "rowSpan": 1
        },
        "caption": {
            "bindTo": "Resources.Strings.PaymentStatusCaption"
        },
        "enabled": true
    }
},
{
    "operation": "remove",
    "name": "PaymentStatus",
    "properties": [
        "contentType",
        "parentName",
        "propertyName"
    ]
},
{
    "operation": "move",
    "name": "PaymentStatus",
    "index": 1
}

Решение

Изменить код страницы для указанных элементов, убрав партнерскую логику, например на:

{
    "operation": "insert",
    "name": "PaymentStatus",
    "values": {
        "bindTo": "PaymentStatus",
        "layout": {
            "column": 0,
            "row": 6,
            "colSpan": 12,
            "rowSpan": 1
 },
        "contentType": Terrasoft.ContentType.ENUM,
        "caption": {
            "bindTo": "Resources.Strings.PaymentStatusCaption"
 },
        "enabled": true
 },
    "parentName": "Header",
    "propertyName": "items",
    "index": 9
}

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

Частный случай, индивидуальное решение

Нравится

Поделиться

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

Вопрос

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

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

Ответ

Для реализации подобного функционала необходимо изменять базовую логику приложения с помощью. Вам необходимо заместить (например, «OpportunityProductPageV2») и для желаемой колонки в секции diff добавить параметр «prepareList», который будет ссылаться пустую функцию (например, «preparelistemptyFn»). Функцию также необходимо объявить на странице редактирования.

controlConfig": {
    "prepareList": { "bindTo": " preparelistemptyFn" }
}

Полный Source Code

define("OpportunityProductPageV2", ["MoneyModule"],
        function(MoneyModule) {
            return {
                entitySchemaName: "OpportunityProductInterest",
                attributes: {},
                details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
                methods: {
 
                    preparelistreturnfalse: function() {
                        return false;
                    },
                },
                diff: /**SCHEMA_DIFF*/[
                    {
                        "operation": "merge",
                        "parentName": "Header",
                        "propertyName": "items",
                        "name": "Product",
                        "values": {
                            "bindTo": "Product",
                            "controlConfig": {
                                "prepareList": { "bindTo": "preparelistreturnfalse" }
                            }
                        }
                    },
                ]/**SCHEMA_DIFF*/
            };
        });

Наглядный пример ниже (рис. 1).

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

Рис. 1

Нравится

Поделиться

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

Симптомы

Тип: 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 комментариев
Показать все комментарии

Вопрос

Интересует таблица SysModuleEdit. Куда ссылаются поля SysPageSchemaUId и MiniPageSchemaUId? Тот же вопрос для поля SysEntitySchemaUId из таблицы SysModuleEntity.

Ответ

Таблица SysModuleEdit:

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

Например объект «Активность». У него может быть одна или несколько страниц редактирования и они описываются в этой таблице. То есть, тут задается связь «Объект» – «Схема страницы, которая будет отображать содержимое этого объекта».

Основные колонки этой таблицы:

SysModuleEntityId – Ссылка на таблицу SysModuleEntity, которая будет описана ниже. По сути, в ней будет описана ссылка на схему объекта «Активность». А все схемы, это таблица SysSchema.

TypeColumnValue – если колонка пуста, значит у этого объекта одна страница редактирования. Если поле TypeColumnValue заполнено, то это идентификатор типа, по которому идет разграничение страниц редактирования. Например, разграничение страниц редактирования Активности может быть по колонке Тип (ActivityType), тогда Id именно этой таблицы (ActivityType) будут записаны в TypeColumnValue. Разграничение может быть по любой ссылочной колонке объекта, но только по одной в один момент времени. Обычно это все же «Тип».

CardSchemaUId – ссылка на поле UId таблицы SysSchema, а именно на схему страницы редактирования. Например, ссылка на UId схемы ActivityPageV2, но обязательно на ту строчку где

SELECT * FROM SysSchema WHERE Name = 'Activity' AND ExtendParent = 0

То есть, на базовую, родительскую схему карточки. Это относится к любым ссылкам на SysSchema. Они всегда ссылаются на родительскую схему (ExtendParent = 0), чтобы работало наследование.

Оставшиеся текстовые колонки – это текстовые представления карточек и действий.

SysPageSchemaUId – ссылка на устаревшие aspx карточки (SysSchema), на данный момент для новых сущностей не используется.

MiniPageSchemaUId нужна только для создания мини-карточек, о чем написано в соответствующей статье:

https://academy.terrasoft.ru/documents/technic-sdk/7-8/sozdanie-mini-kartochki

Таблица SysModuleEntity:

Развязочная таблица для SysModuleEdit, итоговая связь выглядит так

SysSchema (схема объекта) – SysModuleEntity SysModuleEdit SysSchema (схема(ы) карточек)

Основные колонки этой таблицы это:

SysEntitySchemaUId – ссылка на таблицу SysSchema, а именно на схему объекта. Например, на поле UId вот этой записи:

SELECT * FROM SysSchema WHERE Name = 'Activity' AND ExtendParent = 0

TypeColumnUId – заполняется для тех случаев, когда есть много страниц редактирования для одного объекта. Именно тут указывается UId колонки из метаданных объекта по которому идет разграничение, тесно связана идеологически с колонкой TypeColumnValue таблицы SysModuleEdit.

Нравится

Поделиться

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 комментариев
Показать все комментарии