BPMonline Service enterprise 7.11

На странице обращения кнопка "сохранить" появляется при внесении изменений. При появлении сдвигает все остальные кнопки "отмена" "действия" "решить".

Как сделать так, чтобы кнопка "сохранить" стала статичной и была всегда ???

Нравится

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

Добрый день. Видимость кнопки "Сохранить" привязана к аттрибуту ShowSaveButton, можете либо устанавливать его в true при входе в карточку, либо сделать для данной кнопки merge в замещающем модуле и указать 

"visible": true

Кот Владимир Владимирович пишет:

Добрый день. Видимость кнопки "Сохранить" привязана к аттрибуту ShowSaveButton, можете либо устанавливать его в true при входе в карточку, либо сделать для данной кнопки merge в замещающем модуле и указать 

"visible": true

Спасибо за ответ, не могли бы Вы подробнее, для особо одаренных, разъяснить где поменять свойства атрибута и в каком модуле находится этот атрибут ?

Плотников ДИ пишет:

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

Добрый день! Элемент SaveButton находится в BasePageV2, для решения вашей задачи необходимо в замещающей схеме раздела (или замещающей BasePageV2, если во всех разделах) добавить в блок diff следующую операцию:

{

    "operation": "merge",

    "name": "SaveButton",

    "values": {

        "visible": true,

    }

}

Чубко Илья,  при переходе на страницу обращения отображается все по старому (кнопка "сохранить " остается быть динамической) , если тут же обновить страницу, то кнопка "сохранить" отображается. Кэш чистил.

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

Добрый день!

Нужна помощь. Есть запрос на T-SQL вот такого вида: 

SELECT

    [tbl_BaseAssortment].[OfferingID] AS [OfferingID],

    [tbl_BaseAssortment].[Description] AS [Description],

    [tbl_BaseAssortment].[ChannelID] AS [ChannelID],

    [tbl_BaseAssortment].[StartDate] AS [StartDate],

    [tbl_BaseAssortment].[DueDate] AS [DueDate]

FROM

    [dbo].[tbl_BaseAssortment] AS [tbl_BaseAssortment]

WHERE([tbl_BaseAssortment].[StartDate] = 

    (SELECT

        MAX([tbl_BaseAssortmentLast].[StartDate]) AS [StartDate]

    FROM

        [dbo].[tbl_BaseAssortment] AS [tbl_BaseAssortmentLast]

    WHERE([tbl_BaseAssortment].[OfferingID] = [tbl_BaseAssortmentLast].[OfferingID] AND

        [tbl_BaseAssortment].[ChannelID] = [tbl_BaseAssortmentLast].[ChannelID] AND

        ([tbl_BaseAssortmentLast].[DueDate] >= getdate() OR

        [tbl_BaseAssortmentLast].[DueDate] IS NULL))))

Его нужно записать на EntitySchemaQuery в конфигурационной схеме. С фильтром совсем запутался...

Нравится

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

Добрый день. Если данный запрос необходимо выполнить из серверного кода - вам стоит посмотреть в сторону использования класса SELECT (более низкоуровневый класс чем ESQ). В случае клиентского кода необходимо добавлять View, поскольку конструкция SELECT FROM SELECT не поддерживается (если только не делать второй запрос в коллбеке первого).

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

Помогите с обьяснением

Вот к примеру в схеме обьекта:

diff: /**SCHEMA_DIFF*/[

    {

        "operation": "insert",

        "name": "UsrSchema13Detail1dcd436c",

        "values": {

            "itemType": 2,

            "markerValue": "added-detail",

            "visible":{"bindTo": "myFunction"} //

        },

        "parentName": "Tabcf202d7cTabLabel",

        "propertyName": "items",

        "index": 5

    }

]

 "visible":{"bindTo": "myFunction"}  - Эта функция отрабатывает только в момент инициализации???

Как динамически поменять свойство видимости view элемента? 

Например у меня поменялся статус в справочнике представленным view элементом в разделе и мне нужно отобразить на странице деталь(по умолчанию она скрыта)

Нравится

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

"Как динамически поменять свойство видимости view элемента?" — Биндить на аттрибут.

" "visible":{"bindTo": "myFunction"}  - Эта функция отрабатывает только в момент инициализации???" — уж не знаю когда, но отрабатывает она по несколько раз при загрузке страницы (подозреваю, что при рендеринге и ререндеринге элемента)

Роман. "visible":{"bindTo": "myFunction"}  по факту делает одностороннее связывание. Вызов функции или же проверка атрибута будут происходить при любом изменении в модели (т.е. даже если вы поменяете соседнее тектосвое поле). И да, Данила подметил верно, при рендеринге и инициализации страницы вызов функции может произойти несколько раз, по этому не стоит громоздить в подобные функции много логики и точно не стоит в них хоть как-то менять остальную модель. 

Лучше всего проверять значения соседних полей и основываясь на их содержании менять возвращаемое значение. К примеру:

myFunction: function() {

      return this.get("UsrSTRING") === "123";

}

 

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

Подскажите пожалуйста каким образом можно внедрить сторонние библиотеки JS в мобильную версию bpm online

Нравится

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

Здравствуйте, Андрей!

Подскажите, какую функциональность Вы хотите добавить сторонними библиотеками?

Pavel Bashtovoy, мне необходимо распрарсить xlsx файл, без отправки на сервер.

Андрей, добрый день!

Как вариант Вы можете создать отделньую схему и полностью скопировать код из этой библиотеки (т.е. метод "copy-paste"). А затем подключить как обычно в манифест CustomSchemas.

Пример подключения таких скриптов:

CustomSchemas: ['MobileActionCheckIn', 'MobileUtilities']

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

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

Потому начал создавать грид по аналогии из FieldForceMobileActivitySKUGridPage и настроил конфиг по аналогии с FieldForceMobileActivitySKUModuleConfig, подключил схемы в манифесте для детальки 

MyDetailSchema: {

"Grid": "MyGridPage",

PagesExtensions: [

"MyGridConfig"

]

}

Но теперь, при открытии детали в мобилке выдает ошибку: 'caption' undefined, что я не так сделал? Или чего мне не хватает? В схеме грида тайтл подключен через переопределенный метод getCustomTitle (думал что из-за него - нет)

 

И еще, чтобы не создавать отдельную тему. Как можно в Embedded детали вывести чекбос? Справочные/текстовые/числовые/дату поля отображает без проблем, а логическую не грузит вовсе (причем без ошибок, просто не отображает)

Нравится

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

Добрый день, 

Относительно Embedded детали: текущая логика приложения по работе с карточками Preview работает таким образом, что "пустые" колонки отображаются только в режиме редактирования. Значение false для булевой колонки сейчас воспринимается, как отсутствие значения. Это можно проверить таким образом: добавьте на деталь запись, у которой булевое поле будет true - и оно отобразится на карточке просмотра. 

Мы зарегистрировали пожелание по доработке этой функциональности в базовом продукте. Так как false может сам по себе нести определенный бизнес-смысл для булевой колонки. 

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

Есть страница реестра, код которой примерно такой.

Ext.define("MyObjectPage.View", {
    extend: "Terrasoft.view.BaseGridPage.View",
    xtype: "myobjectgridpage",
    config: {//Конфиг
    }
    //...
});
 
Ext.define("MyObjectGridPage.Controller", {
    extend: "Terrasoft.controller.BaseGridPage",
    //методы и т.д.
});

Требуется расширить имеющиеся классы view и controller, не создавая новые. Пробовал добавить следующий код:

Ext.define("MyObjectGridPage.View", {
    override: "MyObjectGridPage.View", 
    //Остальное...
});
 
Ext.define("MyObjectGridPage.Controller", {
    override: "MyObjectGridPage.Controller", 
    //Остальное...
});

Подключал по разному в манифесте: свойство "Grid" или массив "PagesExtensions" для модели нужного объекта, добавлял в "CustomSchemas". Всё время получаю ошибку:

Uncaught TypeError: Cannot read property 'singleton' of null

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

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

Нравится

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

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

  1. Мы рекомендуем не использовать override для расширения возможностей существующих классов. Для этих целей можно использовать extend.
  2. Для решения вашей задачи необходимо:
  • добавить свои классы, которые будут расширять существующие классы грида (view и контроллер)
  • указать эти новые классы в переменной Terrasoft.LastLoadedPageData, использующейся при навигации страниц (по сути, в ней хранится связь view и controller)
  • указать в манифесте вашу новую схему с реализацией своих классов в секции Models для соотв. модели в параметре «Grid»
  • указать там же в свойстве PagesExtensions ту базовую схему, которую вы расширяли

Возьмем, к примеру, view карточки реестра раздела «Лента». Схема, описывающая view, называется MobileSocialMessageGridPageView и соотв. класс называется SocialMessageGridPage.View.

  1. Создадим свою схему MySocialMessageGridPage. В нее добавляем след. код:

 

Terrasoft.LastLoadedPageData = {

controllerName: "SocialMessageGridPage.Controller",

viewXType: "mysocialmessagegridpageview"

};

 

Ext.define("Terrasoft.configuration.view.MySocialMessageGridPage", {

alternateClassName: "MySocialMessageGridPage.View",

extend: "SocialMessageGridPage.View",

xtype: "mysocialmessagegridpageview",

 

config: {

 

myButton: true

 

},

 

/**

* @protected

* @virtual

* @cfg-applier

*/

applyMyButton: function(newButton) {

if (!newButton) {

return false;

}

var config = {

style: "background: red; width: 32px; height: 32px;"

};

return Ext.factory(config, "Ext.Button", this.getMyButton());

},

 

/**

* @protected

* @virtual

* @cfg-updater

*/

updateMyButton: function(newButton, oldButton) {

if (newButton) {

var myButton = this.getMyButton();

this.add(myButton);

}

}

 

});

В этом расширении класса SocialMessageGridPage.View мы добавили свою красную кнопку, которая будет добавлена в «Ленту». При этом основные моменты в этом классе выделены красным. Т.е. помимо того, что мы расширили существующий класс (extend: "SocialMessageGridPage.View"), мы еще указали свой xtype (xtype: "mysocialmessagegridpageview"). И затем в Terrasoft.LastLoadedPageData указали его, сказав тем самым, что при открытии грида нужно использовать нашу новую view (контроллер при этом будет использоваться базовый, но вы можете его расширить и указать самостоятельно).

  1. Изменения в манифесте будут следующими:

 

{

"Models": {

"SocialMessage": {

"Grid": "MySocialMessageGridPage",

"PagesExtensions": [

"MobileSocialMessageGridPage"

]

}

}

}

 

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

 

 

Вильшанский Дмитрий,

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

Uncaught TypeError: Cannot read property 'getName' of undefined
    at Class.getModelName (ApplicationConfig.js:189)
    at Class.getModelConfig (ApplicationConfig.js:203)
    at Class.getConfig (GridPage.sdk.js:24)
    at Class.beforeInitializeGrid (BaseGridPageController.js:226)
    at Class.doFire (sencha-touch-all-debug.js:15417)
    at Class.fire (sencha-touch-all-debug.js:15344)
    at Class.doDispatchEvent (sencha-touch-all-debug.js:15842)
    at Class.dispatchEvent (sencha-touch-all-debug.js:15823)
    at Class.doFireEvent (sencha-touch-all-debug.js:16188)
    at Class.fireEvent (sencha-touch-all-debug.js:16142)
    at Class.beforeinitialize (BaseGridPageView.js:75)
    at Class.doFire (sencha-touch-all-debug.js:15417)
    at Class.fire (sencha-touch-all-debug.js:15344)
    at Class.doDispatchEvent (sencha-touch-all-debug.js:15842)
    at Class.dispatchEvent (sencha-touch-all-debug.js:15823)
    at Class.doFireEvent (sencha-touch-all-debug.js:16188)
    at Class.fireEvent (sencha-touch-all-debug.js:16142)
    at Class.initialize (List.js:566)
    at Class.constructor (sencha-touch-all-debug.js:22965)
    at Class.callParent (sencha-touch-all-debug.js:4715)
    at Class.constructor (sencha-touch-all-debug.js:32881)
    at Class.callParent (sencha-touch-all-debug.js:4715)
    at Class.constructor (Sencha.js:126)
    at Class.callParent (sencha-touch-all-debug.js:4715)
    at Class.constructor (sencha-touch-all-debug.js:54756)
    at Class.callParent (sencha-touch-all-debug.js:4715)
    at Class.constructor (sencha-touch-all-debug.js:70258)
    at new Class (sencha-touch-all-debug.js:5267)
    at eval (eval at getInstantiator (sencha-touch-all-debug.js:7041), <anonymous>:3:8)
    at Object.instantiate (sencha-touch-all-debug.js:7008)
    at Object.instantiateByAlias (sencha-touch-all-debug.js:6920)
    at Object.factory (sencha-touch-all-debug.js:10109)
    at Class.applyGrid (BaseGridPageView.js:80)
    at Class.setter [as setGrid] (sencha-touch-all-debug.js:5541)
    at Class.initConfig (sencha-touch-all-debug.js:4979)
    at Class.constructor (sencha-touch-all-debug.js:22952)
    at Class.callParent (sencha-touch-all-debug.js:4715)
    at Class.constructor (sencha-touch-all-debug.js:32881)
    at Class.callParent (sencha-touch-all-debug.js:4715)
    at Class.constructor (Sencha.js:126)
    at new Class (sencha-touch-all-debug.js:5267)
    at eval (eval at getInstantiator (sencha-touch-all-debug.js:7041), <anonymous>:3:8)
    at Object.instantiate (sencha-touch-all-debug.js:7008)
    at Object.instantiateByAlias (sencha-touch-all-debug.js:6920)
    at Object.factory (sencha-touch-all-debug.js:10109)
    at Class.initializeCacheItem (PageNavigator.js:125)
    at Class.forward (PageNavigator.js:198)
    at Class.success (MainPageController.js:318)
    at Object.callback (sencha-touch-all-debug.js:10397)
    at Class.loadLookupSubColumnsModels (StructureLoader.js:308)
    at Class.success (StructureLoader.js:317)
    at Object.callback (sencha-touch-all-debug.js:10397)
    at Class.loadLookupSubColumnModels (StructureLoader.js:331)
    at Class.success (StructureLoader.js:338)
    at Object.callback (sencha-touch-all-debug.js:10397)
    at Class.loadSchemas (StructureLoader.js:154)
    at Class.loadLookupSubColumnModels (StructureLoader.js:335)
    at Class.success (StructureLoader.js:338)
    at Object.callback (sencha-touch-all-debug.js:10397)
    at Class.loadSchemas (StructureLoader.js:154)
    at Class.loadLookupSubColumnModels (StructureLoader.js:335)
    at Class.loadLookupSubColumnsModels (StructureLoader.js:313)
    at Class.success (StructureLoader.js:224)
    at Object.callback (sencha-touch-all-debug.js:10397)
    at Class.loadSchemas (StructureLoader.js:154)
    at Class.loadGridPageModelDependencies (StructureLoader.js:222)
    at Class.success (StructureLoader.js:196)
    at Object.callback (sencha-touch-all-debug.js:10397)
    at Class.success (StructureLoader.js:145)
    at Object.callback (sencha-touch-all-debug.js:10397)
    at Class.<anonymous> (ScriptLoader.js:158)
    at one (head.js:566)
    at head.js:782
    at head.js:818
    at HTMLScriptElement.process (head.js:914)

Что я мог упустить?

Бершеда Д. Н.,

Так сказать сложно.

Возьмите эмулятор (http://ftp.bpmonline.com/support/downloads/mobile/7.11.7.rar) и поставьте debugger в функцию getModelConfig: function(model) класса Terrasoft.ApplicationConfig

И посмотрите в переменной model что приходит.

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

Фухх. Делаю настройку по донной инструкции: https://academy.terrasoft.ru/documents/technic-sdk/7-11/otladka-servernogo-koda

И вот когда подключаюсь к процессу и ставлю отладчик - он не ставится, выбивает следующее:

Изображение удалено.эта ошибка описана и описано как ее решить, но после проделывания всех шагов - ошибка не пропала. В чем может быть проблема?

Нравится

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

На эту ошибку я напарывался раза три. 2 раза она просто так исчезала спустя некоторое время, 3 раз пришлось обновлять студию ибо абсолютно все инструкции из интернета не помогли. Внезапно в 2015 версии всё заработало как надо.

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

"по донной инструкции" — я не знаю, опечатка ли это, но да, вы правы) *тут должна быть гифка из пиратов карибского моря "все на дно!"*

Варфоломеев Данила,

да, это опечатка) Инструкция вроде нормальная, только по этой ошибке не все верно прописано).

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

у меня стоит самая новая 2017, некуда уже обновлять(

или качать 2015, 2010 и на них пробовать ещеfrown

честно говоря, ничего 100% рабочего не могу вам посоветовать.

если уж прям совсем надо, то можно ручками указать в "Сервис—>Параметры—>Отладка—>Символы" папку с символами (по сути вся папка с выгруженными из bpm ресурсами), студия минуты 2 подумает, подгрузит и всё должно отработать. Лично у меня прокатывало.

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

Варфоломеев Данила,

Благодарю, помогло!!! Невероятно, но факт!

Коллеги, можно символы microsoft вообще не подгружать!

На самом деле порядок таков:

1) Удаляем все файлы, кроме dll в Terrasoft.Configuration/bin

2) Подключаемся к процессу и ставим точку останова

3) Компиляция

Чубко Илья,

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

1) Удаляем все файлы, кроме dll в Terrasoft.Configuration/bin

Это наверно аналогичный шаг, по идее достаточно удалить только exe(в моем случае) Проблема в визуалке а не БПМ)))

Чубко Илья,

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

1) Удаляем все файлы, кроме dll в Terrasoft.Configuration/bin

Это наверно аналогичный шаг, по идее достаточно удалить только exe(в моем случае) Проблема в визуалке а не БПМ)))

Варфоломеев Данила, еще такое вот в отладке пишет:

        insert.GetSqlText()    Не удается получить значение локальной переменной или аргумента, так как оно недоступно по указателю инструкции, возможно, вследствие оптимизации.    string

и так ко всем переменным(((

Таже ситуация, не знаю что делать, делаю все по инструкции и ничего не помогает((

 

Попробуйте советы из комментариев выше.

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

Всем доброго времени суток. Версия 7.10.

При редактировании раздела Контрагенты выяснилось, что при добавлении новых типов страницы, их схемы наследуются от базовой BaseModulePageV2 (ESN) ( NUI ).

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

После сохранения вот такой правки, как на скриншоте, на странице Клиента остался первоначальный вариант страницы контакта (лежит в пользовательском пакете, наследуется от версии страницы в пакете UIv2 ), а страница Партнёра (лежит в Custom) почти пустая, занаследована от Базовой.

При попытке на странице редактирования схемы страницы Партнёра изменить родительский объект, вылезает сообщение об ошибке: "Невозможно установить родительский объект. Элемент c именем "SaveButtonCaption" уже существует в родительской схеме"

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

Нравится

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

Добрый день. Если я не ошибаюсь, то "элемент существует" - это всего лишь предупреждение. Попробуйте проигнорировать и сохранить страницу

Денис, здравствуйте!

Наследование типизированных страниц от базовой страницы раздела обеспечивает корректную работу с данными страницами в Мастере. При наличии типизированных страниц, унаследованных не от BaseModulePageV2, при внесении изменений Мастером в родительскую схему будут возникать конфликты, ошибки (когда страницы-наследники будут пытаться унаследовать какое-то новое поле, добавленное на страницу-родителя в Мастере).

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

- если все-таки удобно работать с Мастером, то, к сожалению, типизированные страницы необходимо настраивать с нуля. Аналитики продукта анализируют данную проблему и, возможно, в будущих релизах можно будет создавать типизированные страницы сразу на базе конкретной страницы раздела;

- на данный момент, можно наследовать типизированные страницы не от "BaseModulePageV2" (редактировать свойства в конфигурации), но, в таком случае, все доработки по конфигурации страницы необходимо будет вносить вручную в схему страницы.

Рекомендации по формату схем для обеспечения совместимости с мастерами Вы найдете на SDK: https://academy.terrasoft.ru/documents/technic-sdk/7-10/trebovaniya-k-formatu-shem-dlya-obespecheniya-sovmestimosti-s-masterami

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

Как скрывать элементы интерфейса для пользователя?

Такие как шестеренка, меню добавления (+), настройки в правом тулбаре (звоночек, лента, трубка) и прочее.

Можно ли создавать пользователей вне орг Роли "Все сотрудники компании"?

Нравится

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

Добрый день, Владимир! Видимость кнопок и полей настраивается с помощью их свойства visible. Настрйока видимости элементов в правой панели в данный момент в приложении не предусмотрена. Также вы можете управлять видимостью элементов с помощью CSS стилей в модуле: 

https://academy.terrasoft.ru/documents/technic-sdk/7-11/dizayner-modulya

Нет, в данный момент пользователей можно создавать только в "Все сотрудники компании" или "Все пользователи портала".

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

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

Как должно быть:

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

И как на самом деле:

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

 

Нравится

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

Оказалось, что нужно назначить пользователю организационную роль "Операторы КЦ", что бы он видел процессы. Ну или вообще нафиг убрать проверку, создав замещающую схему CtiPanel и переопределив метод loadProcessActions закомментировать if (!actions.isEmpty() || !this.get("IsCurrentUserContactCenterOperator"))

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