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

Вопрос

Стоит задача вывода пользователю результата выборки. Выборку делаю с помощью esq запросов, помещаю в коллекцию. Далее пытаюсь отрисовать в разделе свой GRID (по аналогии с "datagrid" в basesection) и направить в него коллекцию. Однако созданный грид не появляется. Есть ли примеры/инструкции по работе с данным элементом и вообще с таким кейсом как "вывод данных, полученных в результате esq запросов, на страницу" ?

Ответ

Инструкций по гридам нет, но достаточно много написано в комментариях к атрибутам самого контрола грида, исходный код которого в неcжатом виде лежит тут:

*путь_к_сайту*\Terrasoft.WebApp\Resources\ui\Terrasoft\controls\grid\grid.js

Так же достаточно примеров использования Вы найдете поискав по кодам конфигурации строку «Terrasoft.ViewItemType.GRID».

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

define("UsrContactType3Page", ["UsrContactType3PageResources", "GeneralDetails"],
    function (resources, GeneralDetails) {
        return {
            entitySchemaName: "Contact",
            details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
            attributes: {
                "TestCollection": {
                    dataValueType: this.Terrasoft.DataValueType.COLLECTION,
                    value: this.Ext.create("Terrasoft.BaseViewModelCollection")
                },
                IsGridEmpty: {
                    dataValueType: this.Terrasoft.DataValueType.BOOLEAN,
                    value: true
                },
            },
            methods: {
                init: function () {
                    this.callParent(arguments);
                },
                onEntityInitialized: function () {
                    this.callParent(arguments);
 
                    var esq = this.Ext.create("Terrasoft.EntitySchemaQuery", {
                        rootSchemaName: "Account"
                    });
                    esq.addColumn("Name");
                    esq.addColumn("Phone");
                    esq.addColumn("City");
 
                    var collection = this.get("TestCollection");
                    esq.getEntityCollection(function (response) {
                        var entities = response.collection;
                        if (entities.getCount() > 0) {
                            this.set("IsGridEmpty", false);
                            collection.loadAll(entities);
                        }
                    }, this);
 
                }
            },
            rules: {},
            diff: /**SCHEMA_DIFF*/[
                {
                    "operation": "insert",
                    "name": "TestContainer",
                    "parentName": "Header",
                    "propertyName": "items",
                    "values": {
                        "itemType": this.Terrasoft.ViewItemType.CONTAINER,
                        "layout": {"column": 0, "row": 0, "colSpan": 34},
                        "items": []
                    }
                },
                {
                    "operation": "insert",
                    "name": "TestDataGrid",
                    "parentName": "TestContainer",
                    "propertyName": "items",
                    "values": {
                        "itemType": this.Terrasoft.ViewItemType.GRID,
                        "type": this.Terrasoft.GridType.LISTED,
                        "collection": {"bindTo": "TestCollection"},
                        "isEmpty": {"bindTo": "IsGridEmpty"},
                        "captionsConfig": [{
                            cols: 10,
                            name: "Имя"
                        },
                            {
                                cols: 10,
                                name: "Телефон"
                            },
                            {
                                cols: 4,
                                name: "Город"
                            }
                        ],
                        "columnsConfig": [
 
                            {
                                "cols": 10,
                                "key": [
                                    {
                                        "name": {"bindTo": "Name"},
                                        "caption": "Name"
                                    }
                                ]
                            },
                            {
                                "cols": 10,
                                "key": [
                                    {
                                        "name": {"bindTo": "Phone"},
                                        "caption": "Phone"
                                    }
                                ]
                            },
                            {
                                "cols": 4,
                                "key": [
                                    {
                                        "name": {"bindTo": "City"},
                                        "caption": "City"
                                    }
                                ]
                            }
                        ]
                    }
                }
            ]/**SCHEMA_DIFF*/,
            userCode: {}
        };
    }
);

Результат:

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

Нравится

Поделиться

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

В английских сборках BPMonline 7x есть проблема с замещением объектов: при попытке выбрать родительский объект выпадающий список пустой.

Это возникает из-за символа ' (апостроф, или одинарная кавычка) в заголовке объекта. Исправить это досадное недоразумение можно выполнив следующий запрос:

update SysSchema
set Caption = replace (Caption, '''', '')

 

Нравится

Поделиться

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

Вопрос

Здравствуйте, при попытке установить тип карточки для которой должна отображаться печатная форма "Торг -12", установить признак "Отображать на карточке" в false или удалить эту ПФ из карточки пропадает кнопка "Печать". При этом созданная копия этой ПФ работает нормально, но скрыть старую запись не удаётся. Даже при попытке сделать это через базу пропадает кнопка "Печать" с карточки.

Раздел "Склад", ПФ должна отображаться только для записей с типом "Расход", но отображается либо для всех, либо кнопка "Печать" отсутствует вовсе, хотя в ней есть ещё и другие ПФ.

Ответ

Здравствуйте, уточню, что речь идет об отображении кнопки печати в комбинированном режиме (когда слева еще доступен суженный, или свернутый реестр, а справа открыта карточка редактирования).

Проблема в том, что в текущей реализации установка атрибута «IsCardPrintButtonVisible» в «BaseSectionV2» выполняется единожды при инициализации реестра, когда еще не известно на какой строке установлена активность, и в этот момент для определения видимости анализируются только печатные формы с галочкой для отображения в карточке, доступные для всех типов.

А у Вас как можно видеть по скриншоту

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

для отображения во всех типах, доступна только одна печатная форма «Торг-12», от того, когда вы её скрываете, кнопка отображения комбинированного режима скрывалась.

Конечно, данное поведение будет пересмотрено в последующих версиях.

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

define("BtcStoreSection", ["GridUtilitiesV2", "ProductSalesUtils", "MenuUtilities"],
function(GridUtilitiesV2, ProductSalesUtils, MenuUtilities) {
    return {
        entitySchemaName: "BtcStore",
        contextHelpId: "1001",
        details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
        attributes: {
            "CombinedModePrintButtonVisible": {dataValueType: Terrasoft.DataValueType.BOOLEAN}
        },
        diff: /**SCHEMA_DIFF*/[
            {
                "operation": "insert",
                "name": "CombinedModePrintButton",
                "parentName": "CombinedModeActionButtonsCardRightContainer",
                "propertyName": "items",
                "index": 0,
                "values": {
                    "itemType": Terrasoft.ViewItemType.BUTTON,
                    "caption": {"bindTo": "Resources.Strings.PrintButtonCaption"},
                    "classes": {"wrapperClass": ["actions-button-margin-right"]},
                    "controlConfig": {"menu": {"items": {"bindTo": "CardPrintMenuItems"}}},
                    "visible": {"bindTo": "CombinedModePrintButtonVisible"}
                }
            },
            {
                "operation": "merge",
                "name": "CombinedModeViewOptionsButton",
                "parentName": "CombinedModeActionButtonsCardRightContainer",
                "propertyName": "items",
                "index": 1,
                "values": {
                    "itemType": Terrasoft.ViewItemType.BUTTON,
                    "caption": {"bindTo": "Resources.Strings.ViewOptionsButtonCaption"},
                    "menu": {"items": {"bindTo": "CombinedModeViewOptionsButtonMenuItems"}},
                    "visible": {"bindTo": "getCombinedModeViewOptionsButtonVisible"}
                }
            }
        ]/**SCHEMA_DIFF*/,
        messages: {
        },
        methods: {
            setCombinedModePrintButtonVisible: function(activeRow, cardPrintMenuItems) {
                this.set("CombinedModePrintButtonVisible", this.getCardPrintButtonVisible());
            },
            onCardRendered: function() {
                this.callParent(arguments);
                this.setCombinedModePrintButtonVisible();
            }
        }
    };
});

 

Нравится

Поделиться

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

Вопрос

Как добавить карточку редактирования в этот справочник? Сейчас справочник редактируется с помощью редактируемого реестра. В карточку редактирования надо добавить деталь как в справочнике «Источник лида»

Ответ

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

Либо создать по аналогии как в справочнике «Источник лида» (см. Схему «LeadSourcePageV2»).

Либо же попробовать вручную (см. приближенный пример, который по необходимо «дебажить»):

  • Создаем схему модели представления карточки, наследуемся от «BaseModulePageV2» вводя ее имя заголовка в поле «родительский объект», в разных конфигурациях может быть переведена по-разному, в нашем примере это «Страница активности V2».
  • Заполняем ее нужными полями, в нашем примере только Name, а объект в нашем примере называется «UsrAccStage»:
define("UsrAccStagePageV2", ["AccountPageV2Resources""GeneralDetails"],
    function(resources, GeneralDetails) {
        return {
            entitySchemaName: "UsrAccStage",
            details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
            diff: /**SCHEMA_DIFF*/[
                {
                    "operation": "insert",
                    "name": "Name",
                    "parentName": "Header",
                    "propertyName": "items",
                    "values": {
                        "bindTo": "Name",
                        "layout": {
                            "column": 0,
                            "row": 0,
                            "colSpan": 12
                        }
                    }
                }
            ]/**SCHEMA_DIFF*/,
            attributes: {},
            methods: {},
            rules: {},
            userCode: {}
        };
    });

Далее нашей целью является зарегистрировать связь страницы редактирования в базе данных в таблице «SysModuleEdit» через развязочную таблицу «SysModuleEntity» с сущностью объекта, в котором хранится информация. В нашем случае «UsrAccStage». Листинг SQL приводим ниже:

SELECT * FROM SysSchema Where Name = 'UsrAccStagePageV2'
-- UId карточки редактирования = 064A98B5-E6FE-47E7-B9A6-499561BD1347
SELECT * FROM SysSchema Where Name = 'UsrAccStage'
-- колонка UId объекта = E894EBA6-9FBB-4AA7-90E4-6A99B6CD5329
-- проверяем развязочную таблицу
SELECT * FROM SysModuleEntity
WHERE SysEntitySchemaUId = 'E894EBA6-9FBB-4AA7-90E4-6A99B6CD5329'
-- если нет там записи, добавляем:
INSERT INTO SysModuleEntity (SysEntitySchemaUId) VALUES ('E894EBA6-9FBB-4AA7-90E4-6A99B6CD5329')
-- проверяем развязочную таблицу
SELECT * FROM SysModuleEntity
WHERE SysEntitySchemaUId = 'E894EBA6-9FBB-4AA7-90E4-6A99B6CD5329'
-- берем от туда Id = 671F61D8-2E72-47A4-95C7-D67E2C8B723F
INSERT INTO SysModuleEdit (SysModuleEntityId, CardSchemaUId, ActionKindCaption,
ActionKindName, PageCaption) VALUES ('671F61D8-2E72-47A4-95C7-D67E2C8B723F''064A98B5-E6FE-47E7-B9A6-499561BD1347''Добавить нашу сущность','UsrAccStage','Стадия контрагента')
SELECT * FROM SysModuleEdit WHERE SysModuleEntityId = '671F61D8-2E72-47A4-95C7-D67E2C8B723F'

В итоге, наш справочник можно открывать страницей редактирования:

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

 

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

 

Нравится

Поделиться

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

Вопрос

Существует ли в 7.9 способ "подкрасить" строку в мобильном реестре

Ответ

Стили (css) можно менять в конфигурации. Для этого нужно использовать метод Terrasoft.writeStyles. Предположительно, пример можно подсмотреть в MobileActivityGridPageV2.

Нравится

Поделиться

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

Вопрос

Как подписаться на событие нажатия какой-то клавиши, чтобы при нажатии выполнить определенное действие?

Ответ

Подписку можно выполнить на любой Ext компонент, с помощью Ext.util.KeyMap 

Например так:

onEntityInitialized: function() {
   this.callParent(arguments);
 
   var map = new Ext.util.KeyMap({
      target: "AccountPageV2CodeTextEdit-el",
      key: Ext.EventObject.ENTER,
      fn: this.myHandler,
      scope: this
   });
},
myHandler: function() {
   alert("ENTER");
},

 

Нравится

Поделиться

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

Вопрос

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

Подскажите, пожалуйста, как это сделать на текущей версии.

Ответ

Вам необходимо в секции SyncOptions изменить два параметра (во втором указывается количество "пачки"):

 

"SyncOptions": {
    "UseSkipToken": true,
    "ImportPageSize": 1000,
},

 

Нравится

Поделиться

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