Вопрос

На странице редактирования активности типа email нужно включить возможность редактирования заголовка, но она в режиме disabled и мы не видим, где это можно включить.

Ответ

Для возможности редактирования заголовка для активностей типа “email”, нужно создать “замещающий клиентский модуль” и указать родительским объектом схему  “EmailPage” из пакета NUI.

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

Скопировать в созданный модуль код из схемы “EmailPage”. И закомментировать бизнес-правило отвечающее за возможность редактирования поля “Заголовок”.

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

Сохранить и опубликовать модуль. В результате поле “Заголовок” стает редактируемым.

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

 

Нравится

Поделиться

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

Вопрос

У нас возникла задача программно запретить редактирование поля "Поставщика" на странице договора (ContractPage) при наступлении определенных условий. Все попытки сделать что-то вроде this.get или find('Supplier') и установить ему enabled или IsEnabled или всё что удалось нагуглить - не работает. 

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

Ответ

Данную возможность можно реализовать следующими способами:

var supp = this.find('Supplier');
supp.customConfig = {
    enabled: { bindTo: 'methodName''}
}

или

var supp = this.find('Supplier');
supp.customConfig = {
    enabled: false
}

Следующий пример кода демонстрирует блокирование поля "Поставщик" если значение поля "Номер" не равняется 2:

var supp = this.find('Supplier');
supp.customConfig = {
    enabled: { bindTo: 'test'}
}
this.methods.test = function(){ return this.get('Number') == '2' };

 

Нравится

Поделиться

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

Вопрос

Как сделать все элементы детали Адреса на странице Контрагента недоступными для редактирования? Версия 7.2.0.

Ответ

Пример реализации функционала для схемы AddressDetail:

1) можно добавить новый метод enableDetailControls:

this.methods.enableDetailControls = function(viewConfig, enabled) {
    if (!viewConfig.items) {
        return;
    }
    viewConfig.items.forEach(function(item) {
        item.enabled = enabled;
    }, this);
};

2) далее вызвать этот метод внутри метода getCustomItemView после полного формирования конфигурации представления, добавив необходимые условия. Например, перед строкой return viewConfig:

this.methods.getCustomItemView = function(viewModel, itemKey, action, types, itemViewModel) {
    var viewConfig = {};
    ...
    var enableControls = (action === "edit") && (/*любые другие условия*/);
    this.enableDetailControls(viewConfig, enableControls);
    return viewConfig;
};

Очень желательно до этого момента уже получить значения необходимых условий, так как после выполнения getCustomItemView управление передаётся в модуль базовой детали (DetailModule), в котором уже выполняется привязка модели к представлению и рендеринг детали.

Нравится

Поделиться

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

Возможно кто-то сталкивался с такой проблемой в BPMOnline 7.2:
Есть класс Service, определенной в пакете Package поставляемой от Terrasoft. Требуется изменить логику работу в нем метода Send. Но, тут возникала проблема, что в пакете Package метод Send вызывается следующим образом:

new Service(UserConnection).Send();

В результате механизм замещения классов не работает через атрибут Override и IOC:
ClassFactory.GetService>(new ConstructorArgument("userConnection", UserConnection));

И мест, где сервис создается напрямую много. Соответственно заместить схемы, где вызывается сервис не представляется возможным.

Есть ли какой-то обходной путь?
Если с процессами, мы можем его отключить в базе флагом, то как быть со схемой исходного кода?
Есть ли такая же возможность отключить?
Может быть если заменить в базе ManagerName, или как-то иначе заблокировать схему, чтобы генератор её не включал в сборку. А самим создать схему с таким же кодом, но с нужными правками?

Нравится

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

Здравствуйте.
Нужно определить какого типа эта схема. Если это SourceCodeSchema, то отключить или заместить не получится.

"Александр Зубков" написал:

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

Нужно определить какого типа эта схема. Если это SourceCodeSchema, то отключить или заместить не получится.


Да, схема типа SourceCodeSchema. Печально, но может быть есть какой-то вариант? Как-то поменять код в самой базе?

"Александр Красноперов" написал:Как-то поменять код в самой базе?

Разблокируйте схему да поправьте, времени кучу сэкономите...
Про то, что будет с поддержкой конфигурации в этом случае, вам расскажет сам Terrasoft, хотя с версией 7.2 я бы не задумывался уже :)

"Александр Кудряшов" написал:
Александр Красноперов пишет:

Как-то поменять код в самой базе?

Разблокируйте схему да поправьте, времени кучу сэкономите...

Про то, что будет с поддержкой конфигурации в этом случае, вам расскажет сам Terrasoft, хотя с версией 7.2 я бы не задумывался уже :)


Спасибо за ответ.

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

Здравствуйте.
Для SourceCodeSchema можно попробовать заместить её и полностью переписать код:
1. Заместить схему.
2. Скопировать контент базовой схемы
3. Переписать код нужного метода.

"Котенко Александр" написал:

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

Для SourceCodeSchema можно попробовать заместить её и полностью переписать код:

1. Заместить схему.

2. Скопировать контент базовой схемы

3. Переписать код нужного метода.

С уважением, Котенко Александр.


А как это можно сделать?
В 7.2 я не вижу возможности заместить схему типа "Исходный код", для клиентских схем - такая возможность есть, а вот для исходного кода - нет

Добрый день.
Действительно, для схемы типа "Исходный код" не получится. Похоже это было доступно в более ранних версиях.

"Александр Зубков" написал:

Добрый день.

Действительно, для схемы типа "Исходный код" не получится. Похоже это было доступно в более ранних версиях.


Самое интересное, что есть не доступная галочка в свойствах схемы. Да и выгружается признак в json о родителе.
Эх, добавили проблем на ровном месте :(

Галочку, наверное, просто, не убрали из интерфейса.

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

Версия BPMOnline 7.2

Простая задача: в зависимости от чекбокса на основной карточке разрешить или запретить добавление элементов в деталь.

1. В коде основной карточки:

добавим чекбокс на страницу

{
                                        type: Terrasoft.core.enums.ViewModelSchemaItem.ATTRIBUTE,
                                        name: 'IsProductChoose',
                                        columnPath: 'IsProductChoose',
                                        dataValueType: Terrasoft.DataValueType.BOOLEAN,
                                        visible: true,
                                        customConfig: {
                                                click: {
                                                        bindTo: "IsProductChooseClicked"
                                                }
                                        }
                                }

обработчик изменения чекбокса

this.methods.IsProductChooseClicked = function() {
                       
                        var args = {
                                param: this.get("IsProductChoose")
                        };
                        sandbox.publish(
                                "IsProductChooseChanged",
                                args,
                                [sandbox.id]
                        );
                };

2. В коде детали:

изменим конфиг выпадающего меню

this.modifyUtilsButton = function(utilsButton) {
                        var utilsMenuItems = utilsButton.menu.items;
                       
                        utilsMenuItems[1].caption = "Выбрать продукты";
                        utilsMenuItems[1].enabled = {bindTo: "isProductChooseForSelection"};
                        return utilsButton;
                };

обработчик "включить/выключить пункт меню"

this.methods.isProductChooseForSelection = function() {                
                        this.sandbox.subscribe("IsProductChooseChanged", function(arg) {
                                console.log(arg);
                        }, this, [this.getSenderSandboxId()]);
                };
               
                this.methods.getSenderSandboxId = function() {
                        return this.sandbox.id.replace('_detail_SynchronizedProduct', '');
                };

Однако при открытии карточки получаю ошибку в консоли браузера:
Uncaught Terrasoft.UnsupportedTypeException: Message IsProductChooseChanged is not defined in undefined module

К сожалению в документации не описано как работать с событиями через sandbox.

Буду благодарен за консультацию.

Нравится

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

как раз недавно обсуждались сообщения: http://www.community.terrasoft.ru/forum/topic/15210
по версиям, насколько я знаю, отличий нет

К сожалению, отличия есть. В 7.2 как минимум нет такого объекта Terrasoft.MessageMode.PTP

Для BPM'Online 7.2 Вы можете воспользоваться уже существующими месседжами, к примеру "UpdateDetail".

Вот пример кода для общения страницы "Контакт" с деталью "Средства связи". Код для страницы контакта в методе "init":

var moduleId = sandbox.id + '_detail_communications';
            this.on("change:Name", function(){
                if(this.get("Name") === "Some name"){
                    sandbox.publish('UpdateDetail', null, [moduleId]);
                }
            });

Код в методе "init" детали:

var moduleId = sandbox.id;
            sandbox.subscribe("UpdateDetail", function() {
                alert("GOAL!")
            }, [moduleId]);

Данный код тестировался для версий 720 и 722. Основное условие работоспособности - идентичность содержания переменной moduleId как для модуля так и для страницы редактирования.

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

Да, в версии 7.2 создавать месседжи можно только в модулях.

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

Добрый день.

Среда: bpmOnline 7.2

Запускаю бизнес-процесс по нажатию на кнопку с помощью:

args={
sysProcessName: 'SomeProcess',
parameters: {
inParam1: 'paramValue'
}
}
ProcessModuleUtilities.executeProcess(args)

В бизнес-процессе определен исходящий параметр outResult, его значение определяется внутри бизнес-процесса.

Как мне получить значение исходящего параметра после вызова ProcessModuleUtilities.executeProcess(args)?

Заранее благодарен за помощь.

Нравится

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

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

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

Задача следующая: есть некий служебный справочник, который содержит правила синхронизации. На странице раздела каждой записи из этого справочника добавлена кнопка "Синхронизировать", по нажатию на которую запускается бизнес-процесс, который выполняет некие действия. И мне необходимо получить результат выполнения этого бизнес-процесса. Как мне это сделать?

Что нужно сделать с результатом:
1) Отобразить пользователю
2) Обновить запись
3) Использовать в другом процессе?

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

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

  1. Updated (обновлено)
  2. Created (создано)

Далее, Вам необходимо реализовать логику записи этих параметров.

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

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

Как вариант, Вы можете создавать уведомление, в котором отобразите количество созданных/обновленных записей.

Спасибо!

А не подскажете решение такой проблемы: пытаюсь выполнить запрос Insert в своем сервисе

using Terrasoft.Core.DB;
using Terrasoft.Core;
// some code ...
var insert = new Insert(UserConnection).Into("SomeObject")
        .Set("ColumnName1", Column.Const("String1"))
        .Set("ColumnName2", Column.Const("String2"));
insert.Execute();

И получаю ошибку The name 'UserConnection' does not exists in active context. Однако все примеры указывают на использование именно UserConnection.

В чем может быть проблема?

Видимо UserConnection пишется немного в другом регистре - userConnection

Спасибо за помощь

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

Создаю стандартный раздел, как описано здесь: http://www.terrasoft.ru/bpmonlinesdk/CreateStandartSection.html

Новый объект наследую от Базового объекта.

Все проходит нормально, однако стандартные кнопки элементов реестра ("Изменить", "Просмотр" и т.п.) не работают. Открывается страница редактирования с пустыми полями.

При этом в консоли браузера 500 ошибка при запросе на DataService/json/SyncReply/SelectQuery с сообщением "Элемент коллекции с именем Notes не найден".

Анализ выявил, что на указанный URL уходит запрос с перечислением столбца Notes в параметрах. Но мой объект не содержит данного столбца.

Подскажите, в чем может быть проблема?

Upd. Проблема решена. Извините за беспокойство.

Нравится

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

Добрый день.

Добавляю кнопку для каждого элемента грида в разделе. Код следующий:

define('UsrSvcCatSection', ['ext-base', 'terrasoft', 'sandbox', 'UsrSvcCat',
        'UsrSvcCatSectionStructure', 'UsrSvcCatSectionResources'],
        function(Ext, Terrasoft, sandbox, entitySchema, structure, resources) {
        structure.userCode = function() {
                this.entitySchema = entitySchema;
                // ...
                // add sync button
                this.methods.syncThis = function() {
                        this.showInformationDialog("Bla-bla-bla!");
                };
                var baseGridConfig = this.methods.modifyGridConfig;
                this.methods.modifyGridConfig = function(gridConfig) {
                        if (baseGridConfig) {
                                baseGridConfig.call(this, gridConfig);
                        }
                        var syncButtonConfig = {
                                className: "Terrasoft.Button",
                                caption: "Bla-bla",
                                enabled: true,
                                style: "blue",
                                visible: true,
                                tag: 'sync'
                        };
                        var gConfig = gridConfig;                      
                        gConfig.activeRowActions.push(syncButtonConfig);
                        return gConfig;
                };
                var baseOnActiveRowAction = this.methods.onActiveRowAction;
                this.methods.onActiveRowAction = function(buttonTag, primaryColumnValue) {
                        switch (buttonTag) {
                                case "sync":
                                        this.syncThis();
                                        break;
                                default:
                                        baseOnActiveRowAction.call(this, buttonTag, primaryColumnValue);
                                        break;
                        }
                };
        };
        return structure;
});

Код на моей кнопке отрабатывает корректно, однако не работает код на стандартных кнопках "Просмотр", "Копировать" и т.п.

Также пытался выполнить

default:
        this.callParent(arguments);
        break;

Результат аналогичен - стандартные кнопки не отрабатывают.

Подскажите пожалуйста, в чем моя ошибка?

Нравится

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

Вероятно вы не вызываете родительский код метода при его переопределении (callParent).
Посмотрите в соседнюю тему http://www.community.terrasoft.ru/forum/topic/11933

Максим, спасибо за ответ. Однако в теме, на которую вы ссылаетесь, добавление кнопки происходит отличным от моего способом.

Я пробовал вызывать callParent - результат аналогичен. Стандартные кнопки не работают.

Проблема решена. Возможно кому-то поможет:

this.methods.onActiveRowAction = function(tag, id, parentOnActiveRowAction) {
    switch (tag) {
        case 'sync':
             this.syncThis();
             break;
        default:
             parentOnActiveRowAction.call(this, tag, id);
             break;
    }
}

Вопрос...а такое применимо для кнопок в редактируемом реестре.
Столкнулся что добавив к стандартным кнопкам свои...стандартные кнопки не работают.

onActiveRowAction: function(buttonTag) {
				var activeRow = this.getActiveRow();
				var position;
				//this.callParent(arguments);
				switch (buttonTag) {
					case "Up":
						position = activeRow.get("Position");
						if (position > 0) {
							position--;
							this.setPosition(activeRow.get("Id"), position, this.reloadGridData, this);
						}
						break;
					case "Down":
						position = activeRow.get("Position");
						position++;
						this.setPosition(activeRow.get("Id"), position, this.reloadGridData, this);
						break;
					default:
						break;
				}
			},
Показать все комментарии

В BPMOnline 7.2 (813) AgentDesktop Demo существуют поля для настройки asterisk. К сожалению, заставить все заработать не вышло, потому возникли вопросы. Прошу помочь разобраться.
Что было сделано
1. В системных настройках "Библиотека обмена сообщениями по умолчанию" было выбрано "Библиотека интеграции с телефонией по протоколу Asterisk (AMI)".
2. В системных настройках "Сервер обмена сообщениями" была добавлена "localhost:2011"
3. В профиле пользователя в пункте настройки Call Centre сохранены настройки. Правда, выпадающий список "Технология" был пуст, справочник с похожим названием найти не удалось, и таблица в БД ConnectionTechnologies также пуста.
В итоге
1. CTIPanel, к сожалению, не отобразилась.
2. Рядом с номерами телефонов контрагентов и контактов появился ярлычок трубки
При нажатии на трубочку в консоль отладки браузера выводится callMake('номер телефона') и тишина, никаких ошибок.
Вопросы
1. Я так понимаю, на данном этапе интеграция с asterisk не реализована до конца?
2. Как добиться отображения ctipanel
3. В каком модуле (процессе) обрабатывается вызов callMake?

Нравится

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

Здравствуйте, Эмин!

Для интеграции с Asterisk рекомендуем использовать BPMonline Agent Desktop 7.2.0.915 и выше.

Для интеграции с Asterisk используется дополнительно Terrasoft Messaging Service (служба, которая должна быть установлена на одном из компьютеров в локальной сети). Браузер обращается к Terrasoft Messaging Service, Terrasoft Messaging Service обращается к Asterisk.

Касательно первого пункта, все верно.

Касательно второго пункта, в системной настройке "Сервер обмена сообщениями" задается строка подключения к Terrasoft Messaging Service. Установлена ли она у Вас? Не рекомендуем в данной настройке использовать localhost, вместо этого используйте ip-адрес сервера, на котором установлена Terrasoft Messaging Service. Правильный вид: ws://ip-адрес:2013 (обратите внимание, что порт не 2011).

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

CTIPanel не отображается из-за того, что соединение с сервером телефонии не установлено.

Также, обратите внимание на то, что на рабочем месте должен быть установлен софтфон, настроенный на ту же учетную запись пользователя телефонии, которая указана в профиле пользователя в пункте настройки Call Centre.

"Резвов Роман" написал:

Огромное спасибо, Роман! Запросили демо BPM AgentDesktop(915), будем разбираться.

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

bpm 7.2 on-site

Можно ли сделать, чтобы файлы не скачивались, а сразу предлагалось открытие системой?
Или только через ссылки, так можно сделать?

Нравится

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

Здравствуйте, Илья.

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

Google Chrome:

http://i62.fastpic.ru/big/2014/0523/33/6e4b9e46c9a40fe7d09b623db5e6dc33.png

Mozilla Firefox:

http://i62.fastpic.ru/big/2014/0523/33/0ce94959f221827fa4b780f59028e133.png

"Соколов Илья Андреевич" написал:файлы не скачивались, а сразу предлагалось открытие системой

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

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