Вопрос

Как отобразить данные на детали в виде иерархической (древовидной) структуры?

Ответ

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

1) в объекте детали должно быть поле, содержащее идентификатор родительской записи (например, Parent), ссылающееся на этот же объект. Это поле должно быть указано в свойстве "Родитель в иерархии" объекта детали;

2) в блоке diff схемы детали для элемента DataGrid необходимо добавить значения "hierarchical": true и "hierarchicalColumnName": "<Название родительской колонки>" (второе свойство необходимо указывать только если название родительской колонки отличается от Parent);

3) добавить свою кнопку (или модифицировать существующую) для возможности добавления новых элементов детали в корень иерархии либо как подчинённые к выбранной записи;

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

Для более подробной информации можно посмотреть прикрепленный файл.

Нравится

Поделиться

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

На самом деле

3) Замещаем метод addGridDataColumns добавив в него все нужные колонки (обязательно колонку родитель, ну и остальные по необходимости):

 

addGridDataColumns: function (esq) {

                this.callParent(arguments);

                if (!esq.columns.contains("UsrParent")) {

                    esq.addColumn("UsrParent");

                }

            }

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

Как минимум, от п. 1 с созданием в самом объекте поля-родителя не обойтись. Да и остальное тоже не выглядят лишним, если Вы хотите работать именно как с деревом, а не просто с колонкой и её значением.

А как запретить выбрать узлы для ИЕРАРХИЧЕСКОГО справочника ?

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

Вопрос

Преднастроенная страница. Как создать FLOAT колонку не создавая колонку в объеке?

Объявлено так:

"InPrice": {dataValueType: Terrasoft.DataValueType.FLOAT}, в параметрах страницы тоже есть (дробное, 0,01)

В модели выглядит так:

{
    "operation": "insert",
    "parentName": "InContractParametersGrid",
    "propertyName": "items",
    "name": "InPrice",
    "values": {
        caption: { bindTo: "Resources.Strings.InPriceLcz" },
        contentType: Terrasoft.ContentType.FLOAT,
        bindTo: "InPrice",
        layout: {column: 0, row: 2, colSpan: 12},
        "isRequired": {bindTo: "IsNadmarze"},
        "enabled": {bindTo: "IsNadmarze"}
    }
},

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

Ответ

Для FLOAT нужно прописывать «Terrasoft.DataValueType.FLOAT».

Как пример, можно посмотреть как реализована базовая колонка «PrimaryPrice» в схеме «ProductPageV2»:Для корректной работы колонки необходимо:

/**
* Цена б.в.
* @private
*/
"PrimaryPrice": {
    "dataValueType": Terrasoft.DataValueType.FLOAT,
    "dependencies": [
        {
            "columns": ["CurrencyRate""Price"],
            "methodName": "recalculatePrimaryPrice"
        }
    ]

- указывать «entityschemaname» (если страница унаследуется от базовой страницы (BasePageV2). Используются базовые методы, которые обращаются к объекту страницы);

- при использовании колонки FLOAT на уровне атрибута указывать точность – свойство «precision» (сколько знаков после запятой) (Рис. 1). Если колонка добавлено на уровне объекта, то по умолчанию эта колонка имеет значение «2» (свойство «decimalPrecision»).

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

Другой вариант:

Это обновить приложение на более новую сборку (исправлено начиная с версии 7.8.0).

Также попробуйте повысить точность до полной, в отображении детали можно в конфигураторе, доработав схему детали, переопределением метода:

getGridRowViewModelConfig

Подобным образом:

getGridRowViewModelConfig: function(config) {
    // ovveride
    var gridRowViewModelConfig = this.callParent(arguments);
    gridRowViewModelConfig.rowConfig.UsrFLOAT.dataValueType = 1;
    return gridRowViewModelConfig;
}

Где UsrFLOAT имя колонки, как в объекте детали. Для которой необходимо применить полную точность знаков после запятой.

Полный пример схемы, на которой все тестировалось:

define("UsrSchema3Detail", [], function() {
    return {
        entitySchemaName: "AccountBillingInfo",
        details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
        diff: /**SCHEMA_DIFF*/[]/**SCHEMA_DIFF*/,
        methods: {
            init: function() {
                this.callParent(arguments);
                document.dtl = this;
 
            },
            getGridRowViewModelConfig: function(config) {
                // ovveride
                var gridRowViewModelConfig = this.callParent(arguments);
                gridRowViewModelConfig.rowConfig.UsrFLOAT.dataValueType = 1;
                return gridRowViewModelConfig;
            }
        }
    };
});

 

Нравится

Поделиться

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

Вопрос

Как организовать сортировку в EntitySchemaQuery по дате модификации записей?

Ответ

Если вопрос касается логики на клиенте, то сортировка устанавливается примерно так:

var entitySchemaQuery = Ext.create("Terrasoft.EntitySchemaQuery"{
        rootSchemaName: entitySchemaName
});
var modifiedOnColumn = entitySchemaQuery.addColumn("ModifiedOn""ModifiedOn");
modifiedOnColumn.orderPosition = 0;
modifiedOnColumn.orderDirection = Terrasoft.OrderDirection.ASC;
...

Для серверной логики:

var query = new EntitySchemaQuery(entitySchema);
var modifiedOnColumn = query.AddColumn("ModifiedOn");
modifiedOnColumn.OrderByAsc(0);
...

 

Нравится

Поделиться

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

Вопрос

Стоит задача вывода пользователю результата выборки. Выборку делаю с помощью 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 комментариев
Показать все комментарии