Симптомы

При переходе в раздел:

Type: Terrasoft.SourceCodeException 

Message: Uncaught TypeError: Cannot read property 'getComponent' of undefined 

AdditionalInfo: Script: file:///storage/emulated/0/BPMonline700/AppStructure/rev_0/src/MobileSocialMessageGridPageController.js?hash=c73dfb1d-eca1-40b3-8d5c-c6de590f5a6c%0D%0A%09Line: 160 

Stack trace: 

    at Ext.define.showException (file:///android_asset/www/appV2/Common/Terrasoft.Mobile.Combined.js:39893:41

    at Ext.define.showUncaughtException (file:///android_asset/www/appV2/Common/Terrasoft.Mobile.Combined.js:3461:25

    at Ext.define.onWindowError (file:///android_asset/www/appV2/Common/Terrasoft.Mobile.Combined.js:2987:18

Причина

Не хватает в манифесте компонентов.

Решение

Кейс 1:

Необходимо было в манифесте мобильного приложения подключить схемы, которые отвечают за раздел "Лента" для рабочего места "Support". 

-       MobileSocialMessageActionsSettingsSupport;

-       MobileSocialMessageGridPageSettingsSupport.

А также убрать соотвествующие схемы только которые относятся к основного рабочему месту, а не к "Support".

-       MobileSocialMessageGridPageSettingsDefaultWorkplace;

-       MobileSocialMessageRecordPageSettingsDefaultWorkplace.

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

Нравится

Поделиться

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

Симптомы

При создании детали через мастер деталей, в момент регистриции страницы возникает ошибка: message: Uncaught Terrasoft.ArgumentNullOrEmptyException: Несуществующий или пустой аргумент с именем; argumentName: query

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

Причина

Слишком длинные заголовки объектов на основе которых создаются детали:

"Документальное сопровождение Продажи в Продукте", "История изменения документального сопровождения".

Решение

Сменить заголовок объектв на более короткий (в пределах 30 символов) и опубликовать объект.

Нравится

Поделиться

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

Задача

Добавление ссылки на свою страницу на панели разделов

Решение

1) Cоздать новый раздел.

2) В Схеме страницы нового раздела (UsrNewSection) добавить метод в секцию методов:

methods: {
init: function() {
      window.location.replace("http://stackoverflow.com");
   }
},

 

Нравится

Поделиться

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

Подскажите, вы хотите чтоб ссылка была так реализована?



Но если вы добавляете ее как описано выше, то она не появляется?

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

Отредактировать схему детали:

define("UsrSchema1Detail", [], function() {
    return {
        entitySchemaName: "UsrStageInProject",
        details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
        diff: /**SCHEMA_DIFF*/[
            {
                    "operation": "remove",//Удалить кнопку "+"
                    "name": "AddRecordButton"
            },
            {
                    "operation": "remove",//Удалить кнопку " ⋮ "
                    "name": "ToolsButton"
            }]/**SCHEMA_DIFF*/,
        methods: {
                    getCopyRecordMenuItem: function() {
                    return false;},//скрыть кнопку "Копировать"
                    getDeleteRecordMenuItem: function() {
                    return false;}//скрыть кнопку "Удалить"
            }
    };
});

другие элементы настраиваются аналогично

get*NAME OF ELEMENT*: function() {return false;}

Список элементов:

  • getCopyRecordMenuItem
  • getEditRecordMenuItem
  • getDeleteRecordMenuItem
  • getGridSortMenuItem - сортировка
  • getShowQuickFilterButton - показать фильтр
  • getHideQuickFilterButton - скрыть фильтр
  • getGridSettingsMenuItem - настройка колонок

Нравится

Поделиться

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

Вопрос

Нам необходимо в некотором роде дублировать функционал progress bar из раздела Лиды. Какими характеристиками должен обладать lookup в разделе помимо наличия колонки с номером, чтобы при отображении в реестре(List View) к нему применился прогресс бар модуль?

Интересует применение данного функционала для объекта Аккаунт, по аналогии с объектом Лид и полем Lead stage.

Ответ

Для реализации функционала progress bar на странице списка необходимо:

1) Чтобы поле справочного типа, которое Вы ходите выводить как progress bar, обладало доп. колонкой UsrStageNumber, которая собственно и будет определять стадию прогресса.

2) Реализовать необходимые методы и зависимости по аналогии с LeadSectionV2 для AccountSectionV2.

3) Если стадий у вас не 5, то написать свой элемент управления, с другим количеством стадий по аналогии с BaseProgressBarModule и использовать его в AccountSectionV2.

Создан справочник UsrAccStage с колонкой UsrStageNumber, и выведен в одноименную колонку в Account.

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

Код замещающей схемы страницы секции контрагента:

define("AccountSectionV2", ["AccountSectionV2Resources", "terrasoft", "ControlGridModule", "BaseProgressBarModule",
        "EntityHelper", "css!BaseProgressBarModule"], function(resources, Terrasoft) {
        return {
            entitySchemaName: "Account",
            diff: /**SCHEMA_DIFF*/[
                {
                    "operation": "remove",
                    "name": "DataGrid"
                },
                {
                    "operation": "insert",
                    "name": "DataGrid",
                    "parentName": "DataGridContainer",
                    "propertyName": "items",
                    "values": {
                        "itemType": Terrasoft.ViewItemType.GRID,
                        "type": {"bindTo": "GridType"},
                        "listedZebra": true,
                        "activeRow": {"bindTo": "ActiveRow"},
                        "collection": {"bindTo": "GridData"},
                        "isEmpty": {"bindTo": "IsGridEmpty"},
                        "isLoading": {"bindTo": "IsGridLoading"},
                        "multiSelect": {"bindTo": "MultiSelect"},
                        "primaryColumnName": "Id",
                        "selectedRows": {"bindTo": "SelectedRows"},
                        "sortColumn": {"bindTo": "sortColumn"},
                        "sortColumnDirection": {"bindTo": "GridSortDirection"},
                        "sortColumnIndex": {"bindTo": "SortColumnIndex"},
                        "selectRow": {"bindTo": "rowSelected"},
                        "linkClick": {"bindTo": "linkClicked"},
                        "needLoadData": {"bindTo": "needLoadData"},
                        "activeRowAction": {"bindTo": "onActiveRowAction"},
                        "activeRowActions": [],
                        "className": "Terrasoft.ControlGrid",
                        "controlColumnName": "UsrAccStage",
                        "applyControlConfig": {"bindTo": "applyControlConfig"},
                        "getEmptyMessageConfig": {"bindTo": "prepareEmptyGridMessageConfig"}
                    }
                }
            ]/**SCHEMA_DIFF*/,
            methods: {
                getGridDataColumns: function() {
                    var gridDataColumns = this.callParent(arguments);
                    gridDataColumns.UsrAccStage = gridDataColumns.UsrAccStage || {path: "UsrAccStage"};
                    gridDataColumns["UsrAccStage.UsrStageNumber"] =
                        gridDataColumns["UsrAccStage.UsrStageNumber"] || {path: "UsrAccStage.UsrStageNumber"};
                    return gridDataColumns;
                },
                applyControlConfig: function(control) {
                    control.config = {
                        className: "Terrasoft.BaseProgressBar",
                        value: {
                            "bindTo": "UsrAccStage",
                            "bindConfig": {"converter": "getUsrAccStageValue"}
                        },
                        width: "158px"
                    };
                },
                getUsrAccStage: function(id) {
                    var activeRow;
                    if (id) {
                        var gridData = this.getGridData();
                        activeRow = gridData.get(id);
                    } else {
                        activeRow = this.getActiveRow();
                    }
                    if (!activeRow) {
                        return null;
                    }
                    var accStage = activeRow.get("UsrAccStage");
                    return (accStage) ? accStage.value : null;
                },
                addColumnLink: function(item) {
                    item.getUsrAccStageValue = function(accStage) {
                        if (!accStage) {
                            return null;
                        } else {
                            return {
                                value: this.get("UsrAccStage.UsrStageNumber"),
                                displayValue: accStage.displayValue
                            };
                        }
                    };
                    return this.callParent(arguments);
                }
            }
        };
    }
);

Как результат для записей, где стадия заполнена, в соответствующей колонке отображается progress bar:

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

Нравится

Поделиться

8 комментариев

Добрый день! Подскажите, пожалуйста, как сделать так, чтобы цвет тянулся с цвета стадии в кейсе?

Добрый день, Константин

 

Можно воспользоваться решением из marketplace, цвет будет использоваться с цвета стадии в кейсе - https://marketplace.creatio.com/app/case-stage-color-coding-creatio

 

С уважением, 

Игорь

Ihor Skohariev,

Спасибо, Игорь! Но именно интересует подкраска progress bar. Может есть какой-то вариант для этого? Или может можно как-то в самом файле элемента progress bar прописать коды нужных цветов? Подскажите, пожалуйста.

Сам цвет прогресс бара реализован в стиле модуля BaseProgressBarModule, конкретно в этом месте:

.ts-progress-bar-item-active {
	background: #f8c065;
}

Вы можете переписать этот элемент со своим необходимым цветом. 

Однако, тут встает вопрос, как получить цвет необходимой стадии. Рекомендую обратить внимание на код указанного выше дополнения из маркетплейса и как там это реализованно.

Дима Вовченко,

 

Благодарю!

Добрый день, коллеги! После использования кода замещения схемы пропало отображение кнопок "Открыть", "Копировать", "Удалить", которые появляются при выделении мышкой. Подскажите, пожалуйста, что необходимо подправить в коде, чтоб они появились обратно?

Константин,

 

Добрый вечер,

 

В коде Вам необходимо:

 

1) Удалить remove грида:

{
                    "operation": "remove",
                    "name": "DataGrid"
                },

2) "operation": "insert" заменить на "operation": "merge"

3) удалить из DataGrid свойство "activeRowActions": [],

 

В итоге код в diff должен стать таким:

{
                    "operation": "merge",
                    "name": "DataGrid",
                    "parentName": "DataGridContainer",
                    "propertyName": "items",
                    "values": {
                        "itemType": Terrasoft.ViewItemType.GRID,
                        "type": {"bindTo": "GridType"},
                        "listedZebra": true,
                        "activeRow": {"bindTo": "ActiveRow"},
                        "collection": {"bindTo": "GridData"},
                        "isEmpty": {"bindTo": "IsGridEmpty"},
                        "isLoading": {"bindTo": "IsGridLoading"},
                        "multiSelect": {"bindTo": "MultiSelect"},
                        "primaryColumnName": "Id",
                        "selectedRows": {"bindTo": "SelectedRows"},
                        "sortColumn": {"bindTo": "sortColumn"},
                        "sortColumnDirection": {"bindTo": "GridSortDirection"},
                        "sortColumnIndex": {"bindTo": "SortColumnIndex"},
                        "selectRow": {"bindTo": "rowSelected"},
                        "linkClick": {"bindTo": "linkClicked"},
                        "needLoadData": {"bindTo": "needLoadData"},
                        "activeRowAction": {"bindTo": "onActiveRowAction"},
                        "className": "Terrasoft.ControlGrid",
                        "controlColumnName": "Status",
                        "applyControlConfig": {"bindTo": "applyControlConfig"},
                        "getEmptyMessageConfig": {"bindTo": "prepareEmptyGridMessageConfig"}
                    }
                }

После обновления страницы все будет работать.

Oleg Drobina,

Олег, спасибо вам большое за помощь!

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

Вопрос

Добавил в мастере страниц поле с типом ДАТА. Как из него сделать ДАТА/ВРЕМЯ?

Ответ

Ниже предоставлен алгоритм:

- поменять тип данных колонки на «Дата/время» в объекте раздела (например, «Contact») в конфигурации приложения (рис. 1). Затем опубликуйте объект (рис. 2).

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

Рис. 1

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

Рис. 2

- создать колонку с типом «Дата» (например, с названием «UsrDate2016») через мастер раздела или через в объекте через раздел «Конфигурации» (рис. 3);

 

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

Рис. 3

- в мастер раздела разместить колонку на страницу редактирования (рис. 4);

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

Рис. 4

- затем перейти в конфигурацию («Управление конфигурацией») приложения и открыть замещающую схему страницы редактирования например, «ContactPageV2» (рис. 5);

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

Рис. 5

- в секции diff найти код с настройками колонки «UsrDate2016» и вставить под «values» следующую строку:

"contentType": this.Terrasoft.ContentType.DATE_TIME,

Наглядный скриншот прикрепил ниже (рис. 6). Пожалуйста, соблюдайте, чтобы количество открывающихся и закрывающихся фигурных скобок.

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

Рис. 6

- Затем нужно сохранить схему;

- Очистить кэш браузера.

В результате на страницу будет отображаться колонка с типом «Дата/время» (рис. 7).

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

Рис. 7

Нравится

Поделиться

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

В 7.16.4 добавили смену между «Дата/время», «Дата» и «Время» пользовательскими средствами в мастере:

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

Симптомы

Terrasoft.Exception%0D%0AСообщение: Произошел таймаут при определении текущих координат%

Причина

В момент возникновения ошибки была проблема с определением местоположения. 

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

В зависимости от устройства, определение местоположения может выполнятся следующими сервисами:

  • Встроенный в устройство GPS
  • Google-сервисами посредством использования Wi-Fi
  • Использованием технологии A-GPS, в случае если устройство поддерживает данное устройство.

Наиболее надежным способом является определение местоположение с помощью сети Wi-Fi, в случае, если устройству удалось залогинится в сеть.

Наиболее распространённым способом является определение координат по GPS. Но работа самого GPS на устройстве может выполнятся со сбоями, например:

- Функция GPS была принудительно отключена на устройстве

- В момент запроса координат нет сигнала от спутников

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

- Существуют радио-помехи для определения координат

 

Немного о влиянии внешних факторов на качество сигнала:

Уровень приёма сигнала от спутников, а как следствие и точность определения координат, ухудшается под плотной листвой деревьев или из-за очень большой облачности. Также нормальному приёму сигналов GPS могут повредить помехи от многих наземных радиоисточников. Однако, главным фактором, влияющим на снижение точности GPS, является неполная видимость небосвода. Особенно ярко это проявляется при нахождении GPS приемника в условиях плотной городской застройки, когда значительная часть небосвода скрыта рядом расположенными строениями, навесами и прочими препятствиями.

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

Решение

Так как ошибка возникает в следствии того, что на мобильном устройстве пропал GPS сигнал или пользователь находился в закрытом помещении, то для решения необходимо просто подождать восстановления GPS сигнала и пересинхронизироваться.

Если пользователь использует мобильное устройство на ОС Android, проблема может быть связана особенностью некоторых версий ОС. Для решения следует перезагрузить мобильное устройство.

Если ошибка осталась, то уточните, пожалуйста, следующие моменты:

1. Какие опции включены в настройках геолокации на устройстве (Рис. 1-3);

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

Рис. 1

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

Рис. 2

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

Рис. 3

2. Выполнялись действия в помещении или на улице?

3. Делалась ли попытка повторно начать визит?

Если в помещении, котором делались действия есть wifi и устройство нормально к нему подключено, но в настройках указано «Использовать только GPS», то в результате этого может возникать ошибка

Нравится

Поделиться

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

Вопрос

По поводу ошибки при работе с мобильной версией приложения:

Ошибка HTTP 405.0 - Method Not Allowed. Разыскиваемая вами страница не может быть отображена потому, что используется недопустимый метод (команда HTTP).

Полный bug report:

Type: Terrasoft.ServerException 

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

 

<legend>Наиболее вероятные причины:</legend> \n  <ul> \t<li>В запросе, направленном на веб-сервер, использовалась команда HTTP, не допускаемая модулем, настроенным для обработки запроса.</li> \t<li>На сервер был послан запрос, содержащий недействительную команду HTTP.</li> \t<li>Этот запрос к статическому содержимому содержит команду HTTP, отличную от GET и HEAD.</li> \t<li>В виртуальный каталог был направлен запрос с использованием HTTP-команды POST; между тем, используемый по умолчанию документ представляет собой статический файл, не совместимый с командами HTTP кроме команд GET и HEAD.</li> </ul> \n </fieldset> \n</div> \n<div class=\"content-container\"> \n <fieldset><legend>Что можно предпринять:</legend> \n  <ul> \t<li>Проверьте список команд, активированных для обработчика модуля, куда был направлен этот запрос, и позаботьтесь о том, чтобы эта команда могла беспрепятственно попасть на веб-сайт.</li> \t<li>Просмотрите журнальный файл IIS и определите, какая команда не может использоваться в запросе.</li> \t<li>Создайте правило трассировки, чтобы отслеживать невыполненные запросы для этого кода состояния HTTP. Чтобы получить дополнительные сведения о создании правила трассировки для невыполненных запросов, щелкните
 
Наиболее вероятные причины:
В запросе, направленном на веб-сервер, использовалась команда HTTP, не допускаемая модулем, настроенным для обработки запроса. 
На сервер был послан запрос, содержащий недействительную команду HTTP. 
Этот запрос к статическому содержимому содержит команду HTTP, отличную от GET и HEAD. 
В виртуальный каталог был направлен запрос с использованием HTTP-команды POST; между тем, используемый по умолчанию документ представляет собой статический файл, не совместимый с командами HTTP кроме команд GET и HEAD.
 
Возможные решения:
Проверьте список команд, активированных для обработчика модуля, куда был направлен этот запрос, и позаботьтесь о том, чтобы эта команда могла беспрепятственно попасть на веб-сайт.
Просмотрите журнальный файл IIS и определите, какая команда не может использоваться в запросе.
Создайте правило трассировки, чтобы отслеживать невыполненные запросы для этого кода состояния HTTP. Чтобы получить дополнительные сведения о создании правила трассировки для невыполненных запросов, щелкните здесь

 

Ответ

Данная настройка может возникать из-за некорректных настроек IIS на сервере.

Для решения необходимо в web.config приложения внести изменения:

<system.webServer>
    <modules>
        <remove name="WebDAVModule" />
    </modules>
    <handlers>
        <remove name="WebDAV" />
    </handlers>
</system.webServer>

 

Нравится

Поделиться

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

Симптомы

При выгрузке большого количества данных, через 30 секунд, происходит ошибка.

Причина

Причиной возникновения ошибки по таймауту, при выгрузке большого количества данных, или большого количества вложенных запросов, является компонента: Ext.Ajax

Стандартный таймаут которой равен 30 секундам.

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

Решение

Возможное решение, увеличение таймаута в "ядре" системы (...\Terrasoft.WebApp\Resources\ui\Terrasoft\core\). Файл ajax-provider.js в функции «request: function(config) { …», добавить следующие строчки кода:

Ext.Ajax.timeout = 90000;
Ext.override(Ext.data.proxy.Server, { timeout: Ext.Ajax.timeout });
Ext.override(Ext.data.Connection, { timeout: Ext.Ajax.timeout });

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

Нравится

Поделиться

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

Задача

Параметр определнения скрыть/ раскрыть деталь при входе на страницу

Решение

Вы можете переопределить функцию onDetailCollapsedChanged, которая отвечает за отображение детали:

/**
* Обрабатывает сворачивание или разворачивание детали.
* @protected
* @virtual
* @param {Boolean} isCollapsed Признак свернутости/развернутости детали.
*/
onDetailCollapsedChanged: function(isCollapsed) {
    var profile = this.getProfile();
    var key = this.getProfileKey();
    if (profile && key) {
        profile.isCollapsed = isCollapsed;
        this.Terrasoft.utils.saveUserProfile(key, profile, false);
    }
    this.set("IsDetailCollapsed", isCollapsed);
},

 

Нравится

Поделиться

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

Добрый день! Коллеги, подскажите как на дальше использовать переопределенную функцию на странице с деталью которую нужно раскрывать? Понимаю что в блоке metods переопределяем функцию

onDetailCollapsedChanged, а дальше нужно ее как-то вызвать из нужной мне детали, но как это корректно сделать не знаю

Стельмаш Дмитрий Сергеевич,

 

Здравствуйте.

Для начала рекомендую вам посмотреть как происходит работа с атрибутом IsDetailCollapsed в схеме BaseDetailV2, чтобы понимать, как изменяется параметр.

 

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

В конфигурации создать "Замещающую модель представления" и наследоваться от какой-то детали - например ServicePactRecipientsDetail.

Использовав примерно такой код:

 define("ServicePactRecipientsDetail", [],
	function() {
		return {
			entitySchemaName: "ServiceInServicePact",
			messages: {},
			methods: {
				onDetailCollapsedChanged: function(isCollapsed) {
					debugger;
					var profile = this.getProfile();
					var key = this.getProfileKey();
					if (profile &amp;&amp; key) {
						profile.isCollapsed = isCollapsed;
						this.Terrasoft.utils.saveUserProfile(key, profile, false);
					}
					this.set("IsDetailCollapsed", isCollapsed);
				}
			},
			diff: /**SCHEMA_DIFF*/[]/**SCHEMA_DIFF*/
		};
	});

 

Григорьев Михаил Алексеевич,

Спасибо за подсказку. Я правильно понимаю что в данному случае, деталь будет разворачиваться на любой странице где она определена, а ни на конкретной странице?

Стельмаш Дмитрий Сергеевич,

 

Где вы выводите делать, там и будет она разворачиваться/сворачиваться.

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