Доброго времени суток!
Предлагает ли Террасофт какой либо пакет интеграции с IP телефонией(Астериск)?
Или есть у сторонних разработчиков?

Нравится

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

День добрый.
В версии 7.х для взаимодействия с Asterisk используется сервис AMI.
Детально о настройке Вы можете прочитать в Академии Terrasoft - например:
Интеграция с Asterisk

Стоимость коннектора уточняйте у Ваших менеджеров

Возможна ли интеграция с Asterisk для версии bpmoline 7.7 OnDemand?

Да, конечно возможна.
Для етого Вам необходимо установить на одном из своих серверров службу MessagingService, настроить ее на взаимодействие с АТС.
В системных настройках bpm'online указать адрес сервера со службой - что позволит пользователю, входя в bpm'online обращатся к локальному серверу с службой MessagingService.
Более детально - по ссылке выше.

Добрый день. Можете подсказать еще по настройке телефонии Asterisk.
Вот мне прислали лицензию bpmonline sales commers 7.7 ondemand и лицензию BPMonline Asterisk Connector.
У меня телефония есть в офисе.
Какие должны быть мои шаги для настройки телефонии?

В настройках сказано "Запустите предоставленный вам файл BPMonline Messaging Service Install.msi на том компьютере, который будет использоваться в качестве сервера обмена сообщениями, и выполните установку" Но мне его не предоставляли.

Нужен ли мне BPMonline Agent Desktop?
Спасибо.

Николай, Вам следует настраивать не телефонию, а интеграцию с ней.
Шаги описаны в Академии Terrasoft:
- Подготовить Asterisk к интеграции
- Настроить сервис сообщений (Messaging Service) Файл инсталляции коннектора Вы в любой момент можете запросить в службе технической поддержки, написав письмо или создав заявку на портале технической поддержки.
- Настроить библиотеку обмена сообщениями
- Настроить параметры подключения к Asterisk
- При необходимости - заказать SSL сертификат на сервер, где установлен MessagingService (В случае если bpm'online и MessagingService работают по защищенным протоколам https и wss, ссоттветсвенно)

BPMonline Agent Desktop - конфигурация bpm'online версии 5.4 Его аналогом для версии 7.7 является продукт CustomerService. Ознакомьтесь с его функционалом в Академии Terrasoft для того, чтобы приянть решение - нужна ли Вам данная функциональность.

Спасибо за информацию, Николай!

Добрый день. Мы хотим заказать заказать SSL сертификат на наш сервер, где установлен MessagingService. Помогите с этим, пожалуйста.

Вам необходимо обратится в любой центр доверенной сертификации для получения сертификата.
Сертификат должен иметь расширение .psf и пароль.

При поиске центра, полезными будут ссылки:
https://ru.wikipedia.org/wiki/%D0%A6%D0%B5%D0%BD%D1%82%D1%80_%D1%81%D0%…

https://www.sslshopper.com/certificate-authority-reviews.html

https://www.tractis.com/help/?p=3670

Это платная услуга?
А если самому делать, то можна воспользоваться этими указаниями? http://www.community.terrasoft.ua/blogs/5138
Или они не подходят в нашей ситуации?

Да, в основной массе - это платная услуга.
Некоторые клиенты находили акции центров, по которым доверенные сертификаты предоставлялись бесплатно на некоторое время.
Как временно решение - вы можете сформировать самоподписанный сертификат, но разработчики не рекомендуют им пользоваться, так как это не совсем безопасно.
С использованием самоподписанных сертификатов имеется одна особенность - его нужно будет загружать на каждую машину в отдельности в доверенные центры сертификации браузера, в то время как доверенный сертификат достаточно просто загрузить на сервер согласно инструкции.

Ещё недавно появились бесплатные сертификаты от Let's Encrypt, но там пока тоже не всё просто и не факт, что вообще можно их прикрутить к MessagingService.

1.И что, никак я не могу обойтись без него, если мой сайт на https://klanss.bpmonline.com?

2.А если самому делать, то можна воспользоваться этими указаниями: http://www.community.terrasoft.ua/blogs/5138
Если да, то какое у меня будет Название сервера? klanss.bpmonline.com?

3.Какое у сертификата должно быть имя? Или это не важно. Главное чтобы был логин и пароль, для прописки?

4.А если покупать - то может посоветуете наиболие популярный сервис, который покупали ваши клиенты?
Спасибо.

1) Нет. Так как сайт в защищенном режиме, то и соединение с телефонией должно соответсвовать.
2) Да, или проще - воспользоватся утилитой SelfSert. Вы должны заказать сертификат не на сервер bpm'online а на сервер, на котором у Вас установлен MessagingService
3) Имя - не важно. Важно что должно быть заказано на Ваш сервер и иметь расширение .psf и пароль.
4) Посоветовать какой-либо не можем - подойдет любой сертифицированный.

А у вас есть инсталка SelfSert? Или ссылка где ее можна скачать безопасно?

Все сделал - но результата нету. Прошу о помощи.

Вот ошибки которые выдает.

Сертификат сделал программой SelfSert.
Установил его и на сервере и на своем компе.
Закинул его в папку BPMonline Messaging Service.

Прописал в файле

Из-за чего может выдавать ошибку?

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

Не сразу заметил - у Вас адрес сервера зачем-то обернут в двойные кавычки. В системной настройке указывается ws:\\адрес_сервера:2013

Добрый день, Николай! У нас поменялся сервер Сервиса сообщений. И после перенастройки системы и установки нового сертификата телефония не заработала. Выбрасывает сообщение "WebSocket connection to 'wss://31.131.17.23:2013/' failed: Error in connection establishment: net::ERR_CONNECTION_TIMED_OUT"
Можете подключиться и помочь?

Здравствуйте, Николай!

Такая ошибка свидетельсвует о том, что не получилось открыть веб-сокет соединение между bpm и messaging service. Убедитесь, что фаервол или брендмауер не блокируют нужный Вам порт 2013. В случае, если необходимо удаленное подключение для настройки, пожалуйста, создайте обращение в техническую поддержку.

Не помогло. Отлючил брандмауер вообще - всеравно не пропускает...

Николай, в этом случае наиболее оптимальным решением будет проверить параметры Bpm Messaging Service при удаленном подключении в рамках обращения в техническую поддержку.

Спасибо Павел и Николай за помощь. Теперь уже есть связь bpm из Asterisk. Я добавил номер линии пользователя в Asterisk в Настройках параметров Call Centre. И хотел проверить роботу - совершить звонок. Вместо этого получил сообщение в консоли:

Что еще нужно сделать чтобы начать звонить. Спасибо.

Здравствуйте, Сергей!

Подскажите, при звонке просто с софтфона на этот номер, звонок проходит успешно?
И какая версия сервера Asterisk используется?

Asterisk 11.7.0
Звонки там настроены и работают.
Но там для акаунта используются:

Server: sip.MyCompany.ru
username=2001
secret=12dfe3
callerid=wefsd23

А в Bpm прописал
Номер - 2001
Контекст исходящего звонка - callcenter
А пароль и callerid не нужно прописывать?

Здравствуйте, Николай!

В телефонном разговоре проблему решили, проблема соответсвовала тексту ошибки - неправильно был указан параметр OriginateContext.

Телефония Asterisk настроена. Но нет файлов разговора в системе. То есть, не работает Запись и прослушивание звонков. Не подскажете что может быть причиной?

Здравствуйте, Николай!

Да, это действительно так, на текущий момент коннектор телефонии Asterisk не поддерживает возможность получения и прослушивания звонков с АТС. Возможность реализации этих функций прорабатывается, однако точно сказать, будет ли это ренализовано пока не могу.

Показать все комментарии
динамически
Технические вопросы
7.x

Добрый день.
Подскажите, как можно на клиентском модуле в 7.2 генерировать новые поля по нажатию кнопки?
Имеется ввиду обычный клиентский модуль с getView(), getViewModule(), render() и т.п
Заранее спасибо за помощь!

Нравится

1 комментарий
7.5
преднастроенная страница
Технические вопросы
7.x

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

Предоставляю упрощённый пример моего кода:

define("SxAssignmentPreconfiguredPageV2", ["CustomProcessPageV2Utilities"],
    function() {
        return {
            messages: {},
            mixins: {
                BaseProcessViewModel: "Terrasoft.CustomProcessPageV2Utilities"
            },
            attributes: {
                "IsAssignment": {
                    type: Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
                    dataValueType: Terrasoft.DataValueType.BOOLEAN,
                    caption: { bindTo: "Resources.Strings.IsAssignmentCaption" }
                },
               "OwnersString": {
                   type: Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
                   dataValueType: Terrasoft.DataValueType.String,
                   dependencies: [{
                       columns: ["IsAssignment"],
                       methodName: "onIsAssignmentChanged"
                   }]
               }

            },
            methods: {
                onIsAssignmentChanged: function(){
                    debugger;
                  if(this.get("IsAssignment"))
                      this.set("OwnersString", "Поле заполнено");
                },
                                        /**
                                 * @overridden
                                 * @returns {string}
                                 */
                                getHeader: function() {
                                        return "PreconfiguredPageV2";
                                },
                                /**
                                 * @overridden
                                 */
                                onEntityInitialized: function() {
                                        this.callParent();
                                },
                                /**
                                 * @overridden
                                 */
                                initHeaderCaption: Ext.emptyFn,
                                /**
                                 * @protected
                                 * @overridden
                                 */
                                initPrintButtonMenu: Ext.emptyFn,
                                /**
                                 * @overridden
                                 * @param {Object} args Параметры
                                 * @param {Object} tag Тег
                                 */
                                loadVocabulary: function(args, tag) {
                                        args.schemaName = this.model.attributes[tag].referenceSchemaName;
                                        this.callParent(arguments);
                                },
                                /**
                                 * @overridden
                                 */
                                onCloseCardButtonClick: function() {
                                        this.sandbox.publish("BackHistoryState");
                                },
                                /**
                                 * @protected
                                 */
                                onNextButtonClick: function() {
                                        this.acceptProcessElement("NextButton");
                                }
            },
            diff:[
                {
                    "operation": "remove",
                    "name": "CloseButton"
                },
                {
                    "operation": "remove",
                    "name": "actions"
                },
                {
                    "operation": "remove",
                    "name": "SaveButton"
                },
                {
                    "operation": "remove",
                    "name": "DelayExecutionButton"
                },
                {
                    "operation": "remove",
                    "name": "ViewOptionsButton"
                },
                {
                    "operation": "insert",
                    "parentName": "Header",
                    "propertyName": "items",
                    "name": "HeaderLabel",
                    "values": {
                        layout: {column: 0, row: 0, colSpan: 12},
                        "itemType": Terrasoft.ViewItemType.LABEL,
                        "caption": { "bindTo": "Resources.Strings.HeaderLabelCaption" },
                        "labelClass": ["new-record-header-caption-label"]

                        /*"classes": {
                            "labelClass": [
                                "t-label "
                            ],
                            "wrapClass": [
                                "label-wrap"
                            ]
                        }*/

                    }
                },
                {
                    // Метаданные для добавления кнопки [Следующий]
                    "operation": "insert",
                    "parentName": "LeftContainer",
                    "propertyName": "items",
                    "name": "NextButton",
                    "values": {
                        caption: {bindTo: "Resources.Strings.NextButtonCaption"},
                        itemType: Terrasoft.ViewItemType.BUTTON,
                        classes: {textClass: "actions-button-margin-right"},
                        style: Terrasoft.controls.ButtonEnums.style.GREEN,
                        click: {bindTo: "onNextButtonClick"}
                    }
                },
                {
                    "operation": "insert",
                    "name": "IsAssignment",
                    "parentName": "Header",
                    "propertyName": "items",
                    "values":{
                        bindTo: "IsAssignment",
                        caption : {bindTo: "Resources.Strings.IsAssignmentCaption"},
                        layout: {column: 0, row: 1, colSpan: 6}
                    },
                    "index": 0
                },
                {
                    "operation": "insert",
                    "name": "OwnersString",
                    "parentName": "Header",
                    "propertyName": "items",
                    "values":{
                        bindTo: "OwnersString",
                        caption :  {
                            "bindTo": "Resources.Strings.OwnersStringCaption"
                        },
                        layout: {column: 0, row: 2, colSpan: 6},
                        "contentType": 0,
                        "controlConfig": {
                            "className": "Terrasoft.TextEdit"
                        }
                    }
                }


            ]
        };
    });

Заранее спасибо.

Нравится

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

Ошибка в типе атрибута, у системного перечисления DataValueType нет значения "String", но есть значение TEXT.

Спасибо, помогло.

Показать все комментарии
доступность
кнопка
Технические вопросы
7.x

Добрый день!
Выведена кнопка на карточку редактирования записи.
Она должна быть активна, если определенное поле в карточке редактирования равно определенному значению.

Метод, который определяет активность
isEnableButtonTest: function() {
debugger
var activeRow = this.get("ActiveRow");
if (activeRow)
{
var pc = this.get("GridData").get(activeRow).get("ServiceCategory");
//return (pc || pc !== "") ? true : false;
if (pc.value === UsrConsts.ServiceCategory.Test)
return true
else
return false;
//return (pc.value === UsrConsts.ServiceCategory.Test) ? true : false;
}
else
return false;
}

var pc = this.get("GridData").get(activeRow).get("ServiceCategory")
возвращает какое-то значение только, если колонка ServiceCategory выведена в реестр,
иначе значение undefined.
Почему? Скажите, пожалуйста, как это обойти?
И еще вопрос - при изменении поля ServiceCategory доступность кнопки меняется только, если обновить сам реестр. Как сделать автоматическое обновление кнопки?

Нравится

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

Дарья, здравствуйте!

Уточните, пожалуйста, точную версию продукта.
А также если можно полный листинг кода.

Добрый день!
Версия 7.6 ITIL
Полный список кода в прикрепленном файле

Дарья, здравствуйте.

GridData не гарантирует получение результата. Для получения значения ServiceCategory, Вам необходимо сделать запрос в базу данных при помощи entityschemaquery. Значение Id (из таблицы Case) для выделенного обращения у Вас хранится в переменной activeRow.

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

Спасибо - про запрос с помошью entityschemaquery поняла ( просто в инструкции в sdk было написано GridData)

По поводу изменения доступности кнопки без обновления реестра - подскажите, пожалуйста, где можно посмотреть реализацию сообщений sandbox ?

Дарья, добрый день!

Примеров реализации сообщений в нашей системе довольно много. Самым ярким примером могут служить модули BasePageV2 и BaseSectionV2. В этих модулях при инициализации вызывается метод subscribeSandboxEvents, который выполняет подписку на сообщения sandbox.

Например, в модуле BaseSectionV2 выполняется подписка на сообщение CardChanged, и когда модуль получает это сообщение, он устанавливает изменённое значение соответствующему атрибуту. Само же сообщение отправляет (публикует) модуль BasePageV2 при вызове метода publishPropertyValueToSection. В свою очередь, метод publishPropertyValueToSection вызывается при изменении некоторых атрибутов модели карточки редактирования.

Вы можете поступить похожим образом. Например, в методе init Вашей карточки редактирования (CasePage) подписаться на изменение поля ServiceCategory:

init: function() {
	this.callParent(arguments);
	this.on("change:ServiceCategory", function(model, value) {
		this.publishPropertyValueToSection("CurrentServiceCategory", value);
	}, this);
}

Таким образом, при изменении поля ServiceCategory карточки новое значение будет записываться в атрибут CurrentServiceCategory раздела CaseSection.

После этого в разделе Вы сможете получить значение текущей категории, обратившись к атрибуту CurrentServiceCategory:

isEnableButtonColumbus: function() {
	var serviceCategory = this.get("CurrentServiceCategory");
	if (!serviceCategory) {
		// Ваш код
	} else {
		return (serviceCategory.value === UsrConsts.ServiceCategory.Dynamix);
	}
},
Показать все комментарии
Активность
бизнес-процесс
Технические вопросы
7.x

Добрый день!

Как можно установить заголовок активности в бизнес-процессе (добавив к тексту значение параметра integer, например)?

Нравится

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

Здравствуйте, Владимир!

Вы можете использовать элемент "Формула". В поле "Установить значение в" выберите параметр "Заголовок". В поле ниже Вам необходимо сформировать заголовок, используя параметры процесса. Также (без использования элемента формула) Вы можете сформировать заголовок, выбрав в структуре процесса параметр "Заголовок", а в поле "Значение" задать нужные параметры (здесь необходимо будет использовать конструкции типа [#Int.Parameter#].ToString())

"Демьяник Алексей Олегович" написал:Также (без использования элемента формула) Вы можете сформировать заголовок, выбрав в структуре процесса параметр "Заголовок", а в поле "Значение" задать нужные параметры (здесь необходимо будет использовать конструкции типа [#Int.Parameter#].ToString())

У элемента Task не вижу параметра Title. Всё остальное есть, а Title не вижу

У задачи за заголовок отвечает параметр Recommendation (Рекомендация).

Пишу [#RemindersCount#].ToString()

Получаю ошибку Value for argument "classType" must be specified.

Владимир, эта ошибка связана с тем, что система не понимает, что за параметр вы прописали. Параметры необходимо выбирать через кнопку "Параметр".

Владимир, вот рабочий код:

"Скомплектовать " + [#Читать тип заказа.Первый элемент результирующей коллекции.Название#] + " №" + [#Читать Образцы (Заказ).Первый элемент результирующей коллекции.Номер#] + " для клиента " + [#Читать клиента.Первый элемент результирующей коллекции.Название#] + ", срок до " + ([#Указание желаемой даты комплектации.Желаемая дата комплектации#]).ToString()

его указываю в элементе "Добавление данных"

Пример работы подобного кода - на скриншоте

"Антон Кравченко" написал:Владимир, вот рабочий код:

Спасибо! Отличный рабочий пример!

Показать все комментарии
пакет
раздел
Технические вопросы
7.x

Добрый день!

С помощью мастера разделов был создан раздел в пакете Coustom. Есть ли способ перенести схемы данного раздела в другой пользовательский пакет? (работаем на on-demand).

Заранее спасибо.

Нравится

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

Добрый день!

В меню [Конфигурация], вкладка [Действия] Вы можете выбрать “Экспорт в файл”. После чего, на вкладке [Пакеты] выбрать интересующий пакет и выполнить действие “Импорт из файла”.

Олег, спасибо!
Собственно, как я и предполагал :) Подумал, что есть альтернативный вариант переноса.
А так, решение рабочее - получилось. Спасибо.

Олег, возможно перенести данные из одного пакета в другой???

"Главный Сергей" написал:возможно перенести данные из одного пакета в другой???

Такая возможность есть при переносе изменений с помощью WorkspaceConsole.

"Байбородин Николай" написал:Подумал, что есть альтернативный вариант переноса.

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

Однако, если речь идет о схемах, реализованных в пакете [Custom], то перенос изменений можно выполнить только с помощью механизма экспорта/импорта схем.

Более подробную информацию по работе с WorkspaceConsole можно найти на Академии Terrasoft:

https://academy.terrasoft.ru/documents/technic-sdk/7-9/perenos-izmeneni…

Обращаю Ваше внимание, что, если у Вас on-demand, для переноса таким образом схем Вам нужно написать запрос в службу поддержки.

"Савельева Алла" написал:Такая возможность есть при переносе изменений с помощью WorkspaceConsole.

Я так понимаю это недавний, новый функционал?

"Главный Сергей" написал:Я так понимаю это недавний, новый функционал?

На самом деле, такая возможность есть уже давно.

Также есть возможность переноса с помощью SVN: https://academy.terrasoft.ru/documents/technic-sdk/7-9/perenos-izmeneni…

Показать все комментарии
множественный выбор
подчиненные обращения
Технические вопросы
7.x

Добрый день!
В карточке обращения есть возможность выбрать Подчиненные обращения

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

Подскажите, пожалуйста, как здесь можно сделать так, чтобы можно было несколько записей выбирать:
например, чтобы вот так было

Нравится

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

Дарья, насколько я знаю, нужно просто добавить данный пункт меню, так как это реализовано в базовой странице, признак isMultiSelectVisible

Спасибо...а куда его добавлять надо? в какую схему?

Дарья, это аттрибут схемы, вот его определение BaseCaseSectionV2:
"MultiSelect": {
dataValueType: Terrasoft.DataValueType.BOOLEAN,
value: false
}
заполните его например на init, таким образом, чтобы
isMultiSelectVisible: function() {
return !this.get("MultiSelect");
}
возвращало вам необходимое значение, естественно, что базовая схема, которую вы используете, должна поддерживать этот функционал

Спасибо. Посмотрю

Показать все комментарии
Технические вопросы
7.x

Доброго времени суток!
Надо создать свой сервис на bpm Версия 7.6.0.1693 РеалСтейт, который будет принимать данные из стороннего источника, обрабатывать и записывать из в свой раздел.
Не могу найти подробную информацию с примерами.

Нравится

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

Добрый день, Виктор!

Нужную Вам информацию Вы можете найти на нашем ресурсе для разработчиков http://academy.terrasoft.ru/documents/?product=SDK&ver=7.6.0 в разделе [Рекомендуемые средства интеграции] - [Odata] - [Веб-сервисы в конфигурации].

Суть сервиса вот с чем:
1. На сервис приходят текстовые данные в формате json.
2. В сервисе происходит обработка данных(парсинг,конвертация, вычисление, нахождение совпадений в базе и т.д)
3. Сервис создает новую запись в нужно разделе.

Как я понял OData это просто работа с объектами и записями. А у меня задача более сложная.

Виктор,

документация доступна в SDK.

Если у Вас есть точечные вопросы, пожалуйста, задавайте, постараемся Вам помочь.

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

Доброго времени суток!
Есть у нас запись раздела, надо создать на ней кнопку(в действии или так), которая будет запускать определенный код, который на основе этой записи, создаст запись в другом разделе. Типа конвертации.

Буду рад если поделитесь ссылочкой с примером, или просто как это сделать.

Нравится

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

Добрый день.

Вы можете посмотреть пример реализации по ссылке:
http://www.community.terrasoft.ru/forum/topic/10554#comment-47944

Пример не полный.
1. Не указано как создать Действие.
2. Не указано куда вообще писать данный код.
Я думаю это вопросы связанные.

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

Виктор, всю информацию Вы можете найти по ссылкам ниже:

Создание бизнес-процессов:
http://academy.terrasoft.ua/documents/?product=BPMS&ver=7.6.0

https://www.youtube.com/watch?v=PznkmfwaPYw

Добавление кнопки на страницу редактирования:
http://academy.terrasoft.ua/documents/docs/technic/SDK/7.6.0/AddButtonT…

Как создать замещающую схему страницы или раздела:
http://academy.terrasoft.ua/documents/docs/technic/SDK/7.6.0/CreateRepl…

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

Добрый день!
Вам нужно создать параметр в вашем процессе ( параметр RecordId).
В методе, в котором вызывается ваш процесс, вызывать процесс с заполненным параметром.
Примерно, таким образом
метод
DoTest: function() {
var activeRow = this.get("ActiveRow");
var processArgs = {
sysProcessName: "UsrProcessTest",
parameters: {
RecordId: activeRow
}
};
ProcessModuleUtilities.executeProcess(processArgs);
}

Так... В документации в которую меня отправляли этого нет.
У меня процесс вызывается из кнопки(как в доках указано), я так полагаю это в схеме страницы вставлять?

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

"Татаровская Дарья" написал:

Вы можете из кнопки вызывать, из действия.

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


Это просто хорошо!
Но!
Как же добавить кнопку в действие а не в процесс?

"Сенько Виктор" написал:

Доброго времени суток!

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

Какие именно надо вводить данные?


Данные можно определить строкой:
var contactId = this.get('Id');
в схеме страницы редактирования (как было укзано в первой ссылке).

И передать параметрами в бизнес процесс:

var processArgs = {
    sysProcessName: 'SetPaymentDate',
    parameters: {
        ContactId: contactId
    }
};
this.runProcess(processArgs.sysProcessName, processArgs.parameters, this);

"Сенько Виктор" написал:

Это просто хорошо!

Но!

Как же добавить кнопку в действие а не в процесс?

Уточните, пожалуйста, Ваш вопрос.

"Мотков Илья" написал:Уточните, пожалуйста, Ваш вопрос.

Как создать кнопку на карточке? Что бы потом у ней добавить вызов БП.

Нашел данную статью
http://academy.terrasoft.ru/documents/docs/technic/SDK/7.6.0/AddActionT…

Решил для проверки добавить новое действие которое просто выводит название записи.

В Схема страницы редактирования раздела "Объект недвижимости" с типом "Земля" добавил в methods вот такой код:

                // Метод, проверяющий на какой стадии находится заказ.
                isRunning: function() {
                    return true;
                },
                // Метод-обработчик действия, который отображает в информационном окне дату выполнения заказа.
                showOrderInfo: function() { 
                    // Получение даты выполнения заказа.
                    var dueDate = this.get("Name");
                    // Вызов стандартного системного метода для отображения информационного окна.
                    this.showInformationDialog(dueDate);
                },
				getActions: function() {
				    // Вызывается родительская реализация метода для получения
				    // коллекции проинициализированных действий базовой страницы.
				    var actionMenuItems = this.callParent(arguments);
				    // Добавление линии сепаратора для визуального отделения пользовательского действия от списка
				    // действий базовой страницы.
				    actionMenuItems.addItem(this.getButtonMenuItem({
				        Type: "Terrasoft.MenuSeparator",
				        Caption: ""
				    }));
				    // Добавление пункта меню в список действий страницы редактирования.
				    actionMenuItems.addItem(this.getButtonMenuItem({
				        // Привязка заголовка пункта меню к локализуемой строке схемы.
				        "Caption": {bindTo: "Resources.Strings.GoConvertProperty"},
				        // Привязка метода обработчика действия.
				        "Tag": "showOrderInfo",
				        // Привязка свойства видимости пункта меню к значению, которое возвращает метод isRunning.
				        "Visible": {bindTo: "isRunning"}
				    }));
				    return actionMenuItems;
				}	

Сохранил, сохранило успешно.

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

Посмотрите в консоли браузера, там должна быть ошибка, возможно у вас нет поля Name, или вы не создали локал. строку GoConvertProperty. Так как код из академии верный. Вот к примеру в схеме OrderPageV2 добавлены методы:

methods: {
	showInfo: function() {
		var test = this.get("Id");
		this.showInformationDialog(test);
	},
	getActions: function() {
		var actionMenuItems = this.callParent(arguments);
		actionMenuItems.addItem(this.getButtonMenuItem({
			Type: "Terrasoft.MenuSeparator",
			Caption: ""
		}));
		actionMenuItems.addItem(this.getButtonMenuItem({
			"Caption": "test method 1",
			"Tag": "showInfo"
		}));
		return actionMenuItems;
	}
},

Результат:

Так же кнопку можно добавить не в "действия" а просто, как обычный элемент, в нужную вам часть страницы, к примеру в контейнер с остальными кнопками, описав ее аналогично другим элементам, в секции diff:

{
	"operation": "insert",
		"parentName": "LeftContainer",
		"propertyName": "items",
		"name": "TestButton",
		"values": {
			"itemType": Terrasoft.ViewItemType.BUTTON,
			"caption": "test method 2",
			"click": {"bindTo": "showInfo"}
		}
}

Результат:

Ничего не понимаю
Добавил:

{
        "operation": "insert",
                "parentName": "LeftContainer",
                "propertyName": "items",
                "name": "TestButton",
                "values": {
                        "itemType": Terrasoft.ViewItemType.BUTTON,
                        "caption": "test method 2",
                        "click": {"bindTo": "showInfo"}
                }
},	

в методы:

			showInfo: function() {
			                var test = this.get("Id");
			                this.showInformationDialog(test);
			        }	

TestButton - добавил в переменные.

вот полный код:

define('SFPropertyType5Page', ['SFPropertyType5PageResources', 'GeneralDetails'],
function(resources, GeneralDetails) {
	return {
		entitySchemaName: 'SFProperty',
		details: /**SCHEMA_DETAILS*/{
	"PropertyCon": {
		"schemaName": "PropertyConDetail",
		"entitySchemaName": "PropertyCon",
		"filter": {
			"detailColumn": "Property",
			"masterColumn": "Id"
		}
	}
}/**SCHEMA_DETAILS*/,
		diff: /**SCHEMA_DIFF*/[
{
        "operation": "insert",
                "parentName": "LeftContainer",
                "propertyName": "items",
                "name": "TestButton",
                "values": {
                        "itemType": Terrasoft.ViewItemType.BUTTON,
                        "caption": "test method 2",
                        "click": {"bindTo": "showInfo"}
                }
},			
	{
		"operation": "insert",
		"name": "Name",
		"values": {
			"layout": {
				"column": 0,
				"row": 0,
				"colSpan": 12,
				"rowSpan": 1
			}
		},
		"parentName": "Header",
		"propertyName": "items",
		"index": 0
	},
	{
		"operation": "insert",
		"name": "Owner",
		"values": {
			"layout": {
				"column": 12,
				"row": 0,
				"colSpan": 12,
				"rowSpan": 1
			},
			"bindTo": "Owner",
			"caption": {
				"bindTo": "Resources.Strings.OwnerCaption"
			},
			"enabled": true
		},
		"parentName": "Header",
		"propertyName": "items",
		"index": 1
	},
	{
		"operation": "insert",
		"name": "Type",
		"values": {
			"layout": {
				"column": 0,
				"row": 1,
				"colSpan": 12,
				"rowSpan": 1
			},
			"bindTo": "Type",
			"caption": {
				"bindTo": "Resources.Strings.TypeCaption"
			},
			"enabled": true
		},
		"parentName": "Header",
		"propertyName": "items",
		"index": 2
	},
	{
		"operation": "insert",
		"name": "ExclusiveContract",
		"values": {
			"layout": {
				"column": 12,
				"row": 1,
				"colSpan": 12,
				"rowSpan": 1
			},
			"bindTo": "ExclusiveContract",
			"caption": {
				"bindTo": "Resources.Strings.ExclusiveContractCaption"
			},
			"enabled": true
		},
		"parentName": "Header",
		"propertyName": "items",
		"index": 3
	},
	{
		"operation": "insert",
		"name": "AdLink",
		"values": {
			"layout": {
				"column": 0,
				"row": 2,
				"colSpan": 12,
				"rowSpan": 1
			},
			"bindTo": "AdLink",
			"caption": {
				"bindTo": "Resources.Strings.AdLinkCaption"
			},
			"enabled": true
		},
		"parentName": "Header",
		"propertyName": "items",
		"index": 4
	},
	{
		"operation": "insert",
		"name": "IsArchive",
		"values": {
			"layout": {
				"column": 12,
				"row": 2,
				"colSpan": 12,
				"rowSpan": 1
			},
			"bindTo": "IsArchive",
			"caption": {
				"bindTo": "Resources.Strings.IsArchiveCaption"
			},
			"enabled": true
		},
		"parentName": "Header",
		"propertyName": "items",
		"index": 5
	},
	{
		"operation": "insert",
		"name": "RentDate",
		"values": {
			"layout": {
				"column": 0,
				"row": 3,
				"colSpan": 12,
				"rowSpan": 1
			},
			"bindTo": "RentDate",
			"caption": {
				"bindTo": "Resources.Strings.RentDateCaption"
			},
			"enabled": true
		},
		"parentName": "Header",
		"propertyName": "items",
		"index": 6
	},
	{
		"operation": "insert",
		"name": "Price",
		"values": {
			"layout": {
				"column": 0,
				"row": 4,
				"colSpan": 12,
				"rowSpan": 1
			},
			"bindTo": "Price",
			"caption": {
				"bindTo": "Resources.Strings.PriceCaption"
			},
			"enabled": true
		},
		"parentName": "Header",
		"propertyName": "items",
		"index": 7
	},
	{
		"operation": "insert",
		"name": "Discount",
		"values": {
			"layout": {
				"column": 0,
				"row": 5,
				"colSpan": 12,
				"rowSpan": 1
			},
			"bindTo": "Discount",
			"caption": {
				"bindTo": "Resources.Strings.DiscountCaption"
			},
			"enabled": true
		},
		"parentName": "Header",
		"propertyName": "items",
		"index": 8
	},
	{
		"operation": "insert",
		"name": "Vzamen",
		"values": {
			"layout": {
				"column": 0,
				"row": 6,
				"colSpan": 12,
				"rowSpan": 1
			},
			"bindTo": "Vzamen",
			"caption": {
				"bindTo": "Resources.Strings.VzamenCaption"
			},
			"enabled": true
		},
		"parentName": "Header",
		"propertyName": "items",
		"index": 9
	},
	{
		"operation": "insert",
		"name": "Rieltcom",
		"values": {
			"layout": {
				"column": 0,
				"row": 7,
				"colSpan": 12,
				"rowSpan": 1
			},
			"bindTo": "Rieltcom",
			"caption": {
				"bindTo": "Resources.Strings.RieltcomCaption"
			},
			"enabled": true
		},
		"parentName": "Header",
		"propertyName": "items",
		"index": 10
	},
	{
		"operation": "insert",
		"name": "Description",
		"values": {
			"layout": {
				"column": 0,
				"row": 8,
				"colSpan": 24,
				"rowSpan": 1
			},
			"bindTo": "Description",
			"caption": {
				"bindTo": "Resources.Strings.DescriptionCaption"
			},
			"enabled": true
		},
		"parentName": "Header",
		"propertyName": "items",
		"index": 11
	},
	{
		"operation": "insert",
		"name": "GeneralInfoTab",
		"values": {
			"caption": {
				"bindTo": "Resources.Strings.GeneralInfoTabCaption"
			},
			"items": []
		},
		"parentName": "Tabs",
		"propertyName": "tabs",
		"index": 0
	},
	{
		"operation": "insert",
		"name": "PropertyCon",
		"values": {
			"itemType": 2
		},
		"parentName": "GeneralInfoTab",
		"propertyName": "items",
		"index": 0
	},
	{
		"operation": "insert",
		"name": "group",
		"values": {
			"itemType": 15,
			"caption": {
				"bindTo": "Resources.Strings.groupCaption"
			},
			"items": [],
			"controlConfig": {
				"collapsed": false
			}
		},
		"parentName": "GeneralInfoTab",
		"propertyName": "items",
		"index": 1
	},
	{
		"operation": "insert",
		"name": "group_gridLayout",
		"values": {
			"itemType": 0,
			"items": []
		},
		"parentName": "group",
		"propertyName": "items",
		"index": 0
	},
	{
		"operation": "insert",
		"name": "State",
		"values": {
			"layout": {
				"column": 0,
				"row": 0,
				"colSpan": 12,
				"rowSpan": 1
			},
			"bindTo": "State",
			"caption": {
				"bindTo": "Resources.Strings.StateCaption"
			},
			"enabled": true
		},
		"parentName": "group_gridLayout",
		"propertyName": "items",
		"index": 0
	},
	{
		"operation": "insert",
		"name": "Street",
		"values": {
			"layout": {
				"column": 12,
				"row": 0,
				"colSpan": 12,
				"rowSpan": 1
			},
			"bindTo": "Street",
			"caption": {
				"bindTo": "Resources.Strings.StreetCaption"
			},
			"enabled": true
		},
		"parentName": "group_gridLayout",
		"propertyName": "items",
		"index": 1
	},
	{
		"operation": "insert",
		"name": "Areastate",
		"values": {
			"layout": {
				"column": 0,
				"row": 1,
				"colSpan": 12,
				"rowSpan": 1
			},
			"bindTo": "Areastate",
			"caption": {
				"bindTo": "Resources.Strings.AreastateCaption"
			},
			"enabled": true
		},
		"parentName": "group_gridLayout",
		"propertyName": "items",
		"index": 2
	},
	{
		"operation": "insert",
		"name": "HouseNumber",
		"values": {
			"layout": {
				"column": 12,
				"row": 1,
				"colSpan": 12,
				"rowSpan": 1
			},
			"bindTo": "HouseNumber",
			"caption": {
				"bindTo": "Resources.Strings.HouseNumberCaption"
			},
			"enabled": true
		},
		"parentName": "group_gridLayout",
		"propertyName": "items",
		"index": 3
	},
	{
		"operation": "insert",
		"name": "City",
		"values": {
			"layout": {
				"column": 0,
				"row": 2,
				"colSpan": 12,
				"rowSpan": 1
			},
			"bindTo": "City",
			"caption": {
				"bindTo": "Resources.Strings.CityCaption"
			},
			"enabled": true
		},
		"parentName": "group_gridLayout",
		"propertyName": "items",
		"index": 4
	},
	{
		"operation": "insert",
		"name": "Housing",
		"values": {
			"layout": {
				"column": 12,
				"row": 2,
				"colSpan": 12,
				"rowSpan": 1
			},
			"bindTo": "Housing",
			"caption": {
				"bindTo": "Resources.Strings.HousingCaption"
			},
			"enabled": true
		},
		"parentName": "group_gridLayout",
		"propertyName": "items",
		"index": 5
	},
	{
		"operation": "insert",
		"name": "CityArea",
		"values": {
			"layout": {
				"column": 0,
				"row": 3,
				"colSpan": 12,
				"rowSpan": 1
			},
			"bindTo": "CityArea",
			"caption": {
				"bindTo": "Resources.Strings.CityAreaCaption"
			},
			"enabled": true
		},
		"parentName": "group_gridLayout",
		"propertyName": "items",
		"index": 6
	},
	{
		"operation": "insert",
		"name": "Fraction",
		"values": {
			"layout": {
				"column": 12,
				"row": 3,
				"colSpan": 12,
				"rowSpan": 1
			},
			"bindTo": "Fraction",
			"caption": {
				"bindTo": "Resources.Strings.FractionCaption"
			},
			"enabled": true
		},
		"parentName": "group_gridLayout",
		"propertyName": "items",
		"index": 7
	},
	{
		"operation": "insert",
		"name": "Landmark",
		"values": {
			"layout": {
				"column": 0,
				"row": 4,
				"colSpan": 12,
				"rowSpan": 1
			},
			"bindTo": "Landmark",
			"caption": {
				"bindTo": "Resources.Strings.LandmarkCaption"
			},
			"enabled": true
		},
		"parentName": "group_gridLayout",
		"propertyName": "items",
		"index": 8
	},
	{
		"operation": "insert",
		"name": "group1",
		"values": {
			"itemType": 15,
			"caption": {
				"bindTo": "Resources.Strings.group1Caption"
			},
			"items": [],
			"controlConfig": {
				"collapsed": false
			}
		},
		"parentName": "GeneralInfoTab",
		"propertyName": "items",
		"index": 2
	},
	{
		"operation": "insert",
		"name": "group1_gridLayout",
		"values": {
			"itemType": 0,
			"items": []
		},
		"parentName": "group1",
		"propertyName": "items",
		"index": 0
	},
	{
		"operation": "insert",
		"name": "PlotArea",
		"values": {
			"layout": {
				"column": 0,
				"row": 0,
				"colSpan": 12,
				"rowSpan": 1
			},
			"bindTo": "PlotArea",
			"caption": {
				"bindTo": "Resources.Strings.PlotAreaCaption"
			},
			"enabled": true
		},
		"parentName": "group1_gridLayout",
		"propertyName": "items",
		"index": 0
	},
	{
		"operation": "insert",
		"name": "group2",
		"values": {
			"itemType": 15,
			"caption": {
				"bindTo": "Resources.Strings.group2Caption"
			},
			"items": [],
			"controlConfig": {
				"collapsed": false
			}
		},
		"parentName": "GeneralInfoTab",
		"propertyName": "items",
		"index": 3
	},
	{
		"operation": "insert",
		"name": "group2_gridLayout",
		"values": {
			"itemType": 0,
			"items": []
		},
		"parentName": "group2",
		"propertyName": "items",
		"index": 0
	},
	{
		"operation": "insert",
		"name": "ObjectType",
		"values": {
			"layout": {
				"column": 0,
				"row": 0,
				"colSpan": 12,
				"rowSpan": 1
			},
			"bindTo": "ObjectType",
			"caption": {
				"bindTo": "Resources.Strings.ObjectTypeCaption"
			},
			"enabled": true
		},
		"parentName": "group2_gridLayout",
		"propertyName": "items",
		"index": 0
	},
	{
		"operation": "insert",
		"name": "IsSewerage",
		"values": {
			"layout": {
				"column": 12,
				"row": 0,
				"colSpan": 12,
				"rowSpan": 1
			},
			"bindTo": "IsSewerage",
			"caption": {
				"bindTo": "Resources.Strings.IsSewerageCaption"
			},
			"enabled": true
		},
		"parentName": "group2_gridLayout",
		"propertyName": "items",
		"index": 1
	},
	{
		"operation": "insert",
		"name": "IsAsphaltedRoad",
		"values": {
			"layout": {
				"column": 0,
				"row": 1,
				"colSpan": 12,
				"rowSpan": 1
			},
			"bindTo": "IsAsphaltedRoad",
			"caption": {
				"bindTo": "Resources.Strings.IsAsphaltedRoadCaption"
			},
			"textSize": 0,
			"labelConfig": {
				"visible": true
			},
			"enabled": true
		},
		"parentName": "group2_gridLayout",
		"propertyName": "items",
		"index": 2
	},
	{
		"operation": "insert",
		"name": "IsWaterSupply",
		"values": {
			"layout": {
				"column": 12,
				"row": 1,
				"colSpan": 12,
				"rowSpan": 1
			},
			"bindTo": "IsWaterSupply",
			"caption": {
				"bindTo": "Resources.Strings.IsWaterSupplyCaption"
			},
			"enabled": true
		},
		"parentName": "group2_gridLayout",
		"propertyName": "items",
		"index": 3
	},
	{
		"operation": "insert",
		"name": "IsGasSupply",
		"values": {
			"layout": {
				"column": 0,
				"row": 2,
				"colSpan": 12,
				"rowSpan": 1
			},
			"bindTo": "IsGasSupply",
			"caption": {
				"bindTo": "Resources.Strings.IsGasSupplyCaption"
			},
			"enabled": true
		},
		"parentName": "group2_gridLayout",
		"propertyName": "items",
		"index": 4
	},
	{
		"operation": "insert",
		"name": "IsPledged",
		"values": {
			"layout": {
				"column": 12,
				"row": 2,
				"colSpan": 12,
				"rowSpan": 1
			},
			"bindTo": "IsPledged",
			"caption": {
				"bindTo": "Resources.Strings.IsPledgedCaption"
			},
			"enabled": true
		},
		"parentName": "group2_gridLayout",
		"propertyName": "items",
		"index": 5
	},
	{
		"operation": "insert",
		"name": "IsDeposit",
		"values": {
			"layout": {
				"column": 0,
				"row": 3,
				"colSpan": 12,
				"rowSpan": 1
			},
			"bindTo": "IsDeposit",
			"caption": {
				"bindTo": "Resources.Strings.IsDepositCaption"
			},
			"enabled": true
		},
		"parentName": "group2_gridLayout",
		"propertyName": "items",
		"index": 6
	},
	{
		"operation": "insert",
		"name": "IsMortgage",
		"values": {
			"layout": {
				"column": 12,
				"row": 3,
				"colSpan": 12,
				"rowSpan": 1
			},
			"bindTo": "IsMortgage",
			"caption": {
				"bindTo": "Resources.Strings.IsMortgageCaption"
			},
			"enabled": true
		},
		"parentName": "group2_gridLayout",
		"propertyName": "items",
		"index": 7
	},
	{
		"operation": "insert",
		"name": "IsBargaining",
		"values": {
			"layout": {
				"column": 0,
				"row": 4,
				"colSpan": 12,
				"rowSpan": 1
			},
			"bindTo": "IsBargaining",
			"caption": {
				"bindTo": "Resources.Strings.IsBargainingCaption"
			},
			"enabled": true
		},
		"parentName": "group2_gridLayout",
		"propertyName": "items",
		"index": 8
	},
	{
		"operation": "insert",
		"name": "IsExchange",
		"values": {
			"layout": {
				"column": 12,
				"row": 4,
				"colSpan": 12,
				"rowSpan": 1
			},
			"bindTo": "IsExchange",
			"caption": {
				"bindTo": "Resources.Strings.IsExchangeCaption"
			},
			"enabled": true
		},
		"parentName": "group2_gridLayout",
		"propertyName": "items",
		"index": 9
	},
	{
		"operation": "insert",
		"name": "IsNetSales",
		"values": {
			"layout": {
				"column": 0,
				"row": 5,
				"colSpan": 12,
				"rowSpan": 1
			},
			"bindTo": "IsNetSales",
			"caption": {
				"bindTo": "Resources.Strings.IsNetSalesCaption"
			},
			"enabled": true
		},
		"parentName": "group2_gridLayout",
		"propertyName": "items",
		"index": 10
	}
]/**SCHEMA_DIFF*/,
		attributes: {},
		methods: {
			showInfo: function() {
			                var test = this.get("Id");
			                this.showInformationDialog(test);
			        }			
		},
		rules: {},
		userCode: {}
	};
});

Кнопки на карточке нету....

Что вы имели в виду под "TestButton - добавил в переменные.", какие переменные?

А в остальном повторюсь, код верный, кнопка должна быть на странице SFPropertyType5Page, учтите что она будет не на всех страницах этого раздела, а только на странице, соответствующего типа.
Проверить какой номер типа у вашей страницы, на которой вы смотрите результат, можно, перейдя в дизайнер страницы, тогда в адресной строке отобразится что-то вроде этого:
http://ваш-сайт/0/Nui/ViewModule.aspx#SectionDesigner/Document/Page/UsrDocumentType4Page

Так же попробуйте почистить кеш браузера и перезайти на сайт.
Если проблему не получится устранить, обратитесь в службу поддержки support@terrasoft.ru, и предоставьте им доступ к вашему сайту. Тогда специалист посмотрит ваш конкретный случай, так как, по коду, все верно.

"Щиголь Максим" написал:Что вы имели в виду под "TestButton - добавил в переменные.", какие переменные?

LocalizableString

Кнопки нету.

"Щиголь Максим" написал:А в остальном повторюсь, код верный, кнопка должна быть на странице SFPropertyType5Page, учтите что она будет не на всех страницах этого раздела, а только на странице, соответствующего типа.

Я в курсе этого. Все точно совпадает.
Это можно понять по линку самой записи
0/Nui/ViewModule.aspx#SectionModuleV2/SFPropertySection/SFPropertyType5Page/edit/75472f5b-57b3-44e9-8c27-001b82b0aab2

Я так понял что придется писать в саппорт.

Да, пишите в саппорт с предоставлением доступа. А в LocalizableString нет смысла добавлять TestButton, если вы не используете значение этой локал. строки как Resources.Strings.TestButton где-нибудь в коде.

"Щиголь Максим" написал:

Да, пишите в саппорт с предоставлением доступа. А в LocalizableString нет смысла добавлять TestButton, если вы не используете значение этой локал. строки как Resources.Strings.TestButton где-нибудь в коде.


Спасибо, написал в саппорт.

Вопрос отправил, но был не тот пакет саппорта) Оплатили, жду.

Пока вопрос другого плана:
Как добавить параметр в процесс?
Нашел статью: http://academy.terrasoft.ua/documents/docs/technic/BPMS/7.6.0/BPMonline…

Но у себя нигде не могу найти где добавлять параметры. В дизайнере процессов такого не нашел. А в конфигурации если нажать на процесс опять открывается дизайнер.
Плиз хелп.

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

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

У меня оказалось все свернуто)
Большое спасибо!

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

Ответ такой:
Проблема возникает из-за того, что в добавляемом элементе неверно указан parentName контейнер, он не существует при открытии из грида, Вам необходимо модифицировать страницу в которую Вы добавили кнопку, таким образом, чтобы она отображалась в обоиз режимах в контейнере с ActionButtons

Суть в том что как раз при создании записи кнопка и не нужна.

Какой мне использовать parentName в моём случае?

Я так понял, ваш последний комментарий, о попытках создания кнопки, следующим образом:

{
        "operation": "insert",
                "parentName": "LeftContainer",
                "propertyName": "items",
                "name": "TestButton",
                "values": {
                        "itemType": Terrasoft.ViewItemType.BUTTON,
                        "caption": "test method 2",
                        "click": {"bindTo": "showInfo"}
                }
},     

От сюда вопрос: в какой схеме вы добавляете код?
Если в схеме редактирования страницы, то у нее "parentName": "LeftContainer" есть.
Если в схеме секции, то там есть подобный контейнер, называется он "SeparateModeActionButtonsLeftContainer".

Посмотреть названия контейнеров можно через Inspect element в браузере, значения атрибута id в div'ах контейнеров составляются как "название схемы" + "имя контейнера" + "Container".

Ну или в родительских схемах страницы и секции есть конечно же объявление этих контейнеров.

Согласно этой инструкции
http://academy.terrasoft.ru/documents/?product=SDK&ver=7.6.0
Как добавить кнопку на страницу редактирования существующей записи

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

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

"Татаровская Дарья" написал:нужно добавлять изменения в замещающем модуле раздела и в замещающем модуле страницы редактирования.
Вы по-моему только на странице редактирования сделали?

Ну посути да, SFPropertyType5Page
А больше у меня замещающих схем с нужным типом и нет.

просто в той инструкции, что вы пользовались, написано что вам необходимо внести изменения в замещающем модуле раздела и в замещающем модуле страницы.
Вы же только в странице получается изменения внесли
Пункты 1-5 в инструкции вашей посмотрите

Цифра 5 в типе, подсказывает что у вас есть еще 4 вариации страниц для данного раздела, плюс схема секции обязательно должна быть тоже. Если раздел совсем новый, то схема секции должна быть в ваших custom пакетах, если раздел типовой, то можно создать замещающую схему и изменить в ней только то что вам нужно.
Подробнее про замещение схем:
https://www.youtube.com/watch?v=cA-WmZKpuGg
http://academy.terrasoft.ru/documents/docs/technic/SDK/7.6.0/ModuleSubs…
Или воспользоватся мастером раздела, после сохранения изменений, он сам создаст замещающие схемы для внесенных изменений в визуальный вид.

"Щиголь Максим" написал:

Цифра 5 в типе, подсказывает что у вас есть еще 4 вариации страниц для данного раздела, плюс схема секции обязательно должна быть тоже. Если раздел совсем новый, то схема секции должна быть в ваших custom пакетах, если раздел типовой, то можно создать замещающую схему и изменить в ней только то что вам нужно.

Подробнее про замещение схем:

https://www.youtube.com/watch?v=cA-WmZKpuGg

http://academy.terrasoft.ru/documents/docs/technic/SDK/7.6.0/ModuleSubst...

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

Страница не новая, кнопка нужна имеено для этой схемы.

Что то совсем запутался.

Какие мне надо внести изменения в замещающую схему раздела? Что бы у меня была кнопка?

Два варианта вставки кода кнопки уже были написаны выше. Если пользуетесь способом добавления через секцию "diff", убедитесь что соответствующий контейнер есть на странице. Посмотрите в это в developer tools вашего браузера, т.к. описано выше. Или посмотрите родительскую схему вашей схемы страницы, и ее код.
В идеальном случае, если вы свои типы страниц создавали через мастер раздела,

то в вашей схеме "SFPropertyType5Page" в качестве родительской должна стоять "BaseModulePageV2", или схема, у которой родительской стоит "BaseModulePageV2"

которая в свою очередь наследуется от базовой схемы карточки "BasePageV2"

в ней то и объявлен "LeftContainer",

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

{
        "operation": "insert",
                "parentName": "LeftContainer",
                "propertyName": "items",
                "name": "TestButton",
                "values": {
                        "itemType": Terrasoft.ViewItemType.BUTTON,
                        "caption": "test method 2",
                        "click": {"bindTo": "showInfo"}
                }
}

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

BaseModulePageV2 стандартна, и ее изменить нелязя.
Я так понимаю мне надо создать для нее замещающую схему? И в ней уже внести данный блок. Верно?
Или же надо создать замещающую схему для BasePageV2? В ней как раз содержатся кнопки сохранить и т.д
в BasePageV2 уже есть:

				{
					"operation": "insert",
					"name": "LeftContainer",
					"parentName": "ActionButtonsContainer",
					"propertyName": "items",
					"values": {
						"itemType": Terrasoft.ViewItemType.CONTAINER,
						"wrapClass": ["left-container-wrapClass"],
						"items": []
					}
				},

Так как же уменя называется контейнер, подскажите плиз:
http://cs629430.vk.me/v629430418/2257b/M9ERHTvJsl4.jpg

У вас это CombinedModeActionButtonsCardLeftContainer, т.к. страница открывается в комбинированном режиме.
И этот контейнер относится к схеме секции а не страницы. Следовательно и добавлять код вам нужно в схеме: "SFPropertySection".

Если бы вы страницу объекта недвижимости открыли как-нибудь из лукапа, на странице где он выведен как поле-справочник, нажали бы "добавить", то на той странице, ваша тестовая кнопка, добавленная в "LeftContainer", была бы.

А так, добавляйте в схему SFPropertySection:

{
	"operation": "insert",
	"parentName": "CombinedModeActionButtonsCardLeftContainer",
	"propertyName": "items",
	"name": "TestButton",
	"values": {
		"itemType": Terrasoft.ViewItemType.BUTTON,
		"caption": "test method сombined",
		"click": {
			"bindTo": "showInfo"
		}
	}
}

Ок, допустим кнопка появилась. Только это не разместит ли кнопку в разделе? А не на карточке записи?
И как мне тогда мне по нажатию на нее получить ID записи?
Ведь с раздела то это не сделать:

var test = this.get("Id");

Виктор,

попробуйте

this.get("ActiveRow");

получилось! большое спасибо!

Добрый день. Пробовал отобразить результат этого кода http://academy.terrasoft.ua/documents/docs/technic/SDK/7.6.0/AddButtonT…
Но вместо основного контакта хочу кнопку ответственного.
Я так понимаю, что в функции проверки я должен написать Owner вместо PrimaryContact. Но так не работает. Кнопка есть, но не реаоирует ни затемнение ни переход.

Что я делаю не так? Подскажите пожалуйста?

Там еще пропустил в первой функции .value
var primaryId = this.get("GridData").get(activeRow).get("PrimaryContact").value;

Извиняюсь, но вопрос снят. Заработало.

Здравствуйте!
Добавил кнопку на страницу контрагента по этой статье http://academy.terrasoft.ua/documents/docs/technic/SDK/7.6.0/AddButtonT…

Теперь делаю похожую в карточке контакта - кнопка будет вызывать бизнесс-процес отправки некоторого письма на Email контакта.
Я сделал первые 5 пунктов, а вот 6) меня озадачил.
Нету для контакта страници редактирования (такой как для контрагента)

И что я должен выбирать в качестве Родительский объект? в этом случае?

попробуйте "Схема отображения карточки контакта"

Здравствуйте!
Создал кнопку которая будет запускабь бизнес-процесс UsrSendEmailToContact и передавать в него id контакта из карточки которого была нажата кнопка.
Создал два замещающих клиентских модуля

define("ContactSectionV2", [],
    function() {
        return {
            // Название схемы объекта страницы редактирования.
            entitySchemaName: "Contact",
            // Коллекция методов модели представления страницы редактирования.
            methods: {
                // Метод-обработчик нажатия кнопки.
                onOpenPrimaryContactClick: function() {
                    var activeRow = this.get("ActiveRow");
                    if (activeRow) {
                        // Определение идентификатора основного контакта.
                        var primaryId = this.get("GridData").get(activeRow).get("Id").value;
                        if (primaryId) {
                            // Формирование строки адреса.
                            var requestUrl = "https://forvatercrm.bpmonline.com/0/ServiceModel/ProcessEngineService.svc/UsrSendEmailToContact/Execute?ContactId=" + primaryId;
                            // Публикация сообщения и переход на страницу редактирования
                            // основного контакта.
                            this.sandbox.publish("PushHistoryState", {
                                hash: requestUrl
                            });
                        }
                    }
                }
                // Метод проверяет, заполнено ли поле [Основной контакт] страницы.
 
            },
            diff: [
                // Метаданные для добавления на страницу пользовательской кнопки.
                {
                    // Указывает на то, что выполняется операция добавления элемента на страницу.
                    "operation": "insert",
                    // Мета-имя родительского элемента управления, в который добавляется кнопка.
                    "parentName": "CombinedModeActionButtonsCardLeftContainer",
                    // Указывает на то, что кнопка добавляется в коллекцию элементов управления
                    // родительского элемента (мета-имя которого указано в parentName).
                    "propertyName": "items",
                    // Мета-имя добавляемой кнопки.
                    "name": "MainContactButton",
                    // Дополнительные свойства элемента.
                    "values": {
                        // Тип добавляемого элемента - кнопка.
                        itemType: Terrasoft.ViewItemType.BUTTON,
                        // Привязка заголовка кнопки к локализуемой строке схемы.
                        caption: {bindTo: "Resources.Strings.StartProcessOnButtonClick"},
                        // Привязка метода-обработчика нажатия кнопки.
                        click: {bindTo: "onOpenPrimaryContactClick"},
                        // Привязка свойства доступности кнопки.
 
                        // Настройка расположения поля.
                        "layout": {
                            "column": 1,
                            "row": 6,
                            "colSpan": 1
                        }
                    }
                }
            ]
        };
    });

и

define("ContactPageV2", [],
    function() {
        return {
            // Название схемы объекта страницы редактирования.
            entitySchemaName: "Contact",
            // Коллекция методов модели представления страницы редактирования.
            methods: {
                // Метод-обработчик нажатия кнопки.
                onOpenPrimaryContactClick: function() {
                    // Определение идентификатора основного контакта.
                    var primaryId = this.get("Id").value;
                    if (primaryId) {
                        // Формирование строки адреса.
                        var requestUrl = "https://forvatercrm.bpmonline.com/0/ServiceModel/ProcessEngineService.svc/UsrSendEmailToContact/Execute?ContactId=" + primaryId;
                        // Публикация сообщения и переход на страницу редактирования
                        // основного контакта.
                        this.sandbox.publish("PushHistoryState", {
                            hash: requestUrl
                        });
                    }
                }
            },
            diff: [
                // Метаданные для добавления на страницу нового элемента управления - пользовательской кнопки.
                {
                    // Указывает на то, что выполняется операция добавления элемента на страницу.
                    "operation": "insert",
                    // Мета-имя родительского элемента управления, в который добавляется кнопка.
                    "parentName": "LeftContainer",
                    // Указывает на то, что кнопка добавляется в коллекцию элементов управления
                    // родительского элемента (мета-имя которого указано в parentName).
                    "propertyName": "items",
                    // Мета-имя добавляемой кнопки.
                    "name": "MainContactButton",
                    // Дополнительные свойства элемента.
                    "values": {
                        // Тип добавляемого элемента - кнопка.
                        itemType: Terrasoft.ViewItemType.BUTTON,
                        // Привязка заголовка кнопки к локализуемой строке схемы.
                        caption: {bindTo: "Resources.Strings.OpenPrimaryContactButtonCaption"},
                        // Привязка метода-обработчика нажатия кнопки.
                        click: {bindTo: "onOpenPrimaryContactClick"},
                        // Привязка свойства доступности кнопки.
 
                        // Настройка расположения поля.
                        "layout": {
                            "column": 1,
                            "row": 6,
                            "colSpan": 1
                        }
                    }
                }
            ]
        };
    });

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

Николай,

Во вложении пример замещающей страницы редактирования контрагента.
Добавлена кнопка, по кнопке запускается процесс. В процесс передается Id записи.
accountpagev2.txt

Олег здравствуйте. Если делать это в схеме где ничего нет (пробовал на тестовой версии BPM online) - то ваш метод работает.
Если же пробую добавить в свою робочую схему - после нажатия на кнопку начинается вечная загрузка процесса. В чем может быть загвоздка? Причем консоль никаких ошибок не выдает...

Без деталей трудно сказать. Приведите пример вашей реализации.

Здравствуйте! Кнопку получилось создать. Но она не отображается если в карточку контакт заходить из раздела контакти. Если же зайти из раздела Контрагент (наример по ответственному) то кнопка отображается и нажатие работает. Что нужно еще добавить чтобы появилась кноака после захода из раздела контакты. Спасибо.

Странно!

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

Здравствуйте! Вот код который содержится в "Схеме отображения карточки контакта". Там 3700 строчек кода. Поэтому высылаю только ту часть которая отвечает за новую кнопку.

define('ContactPageV2', ['ContactPageV2Resources', 'GeneralDetails', 'ProcessModuleUtilities'],
function(resources, GeneralDetails, ProcessModuleUtilities) {
	return {
		entitySchemaName: 'Contact',
		details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
		diff: /**SCHEMA_DIFF*/[
	{
		"operation": "merge",
		"name": "Name",
		"values": {
			"layout": {
				"column": 4,
				"row": 0,
				"colSpan": 20,
				"rowSpan": 1
			}
		}
	},
 
	{
                    // Указывает на то, что выполняется операция добавления элемента на страницу.
                    "operation": "insert",
                    // Мета-имя родительского элемента управления, в который добавляется кнопка.
                    "parentName": "LeftContainer",
                    // Указывает на то, что кнопка добавляется в коллекцию элементов управления
                    // родительского элемента (мета-имя которого указано в parentName).
                    "propertyName": "items",
                    // Мета-имя добавляемой кнопки.
                    "name": "MainContactButton",
                    // Дополнительные свойства элемента.
                    "values": {
                        // Тип добавляемого элемента - кнопка.
                        itemType: Terrasoft.ViewItemType.BUTTON,
                        // Привязка заголовка кнопки к локализуемой строке схемы.
                        caption: {bindTo: "Resources.Strings.StartProcessSendEmail"},
                        // Привязка метода-обработчика нажатия кнопки.
                        click: {bindTo: "procStartByClick"},
                        // Привязка свойства доступности кнопки.
                        //enabled: {bindTo: "isAccountPrimaryContactSet"},
                        // Настройка расположения поля.
                        "layout": {
                            "column": 1,
                            "row": 6,
                            "colSpan": 1
                        }
                    }
                },
	{
		"operation": "move",
		"name": "NotesAndFilesTab",
		"parentName": "Tabs",
		"propertyName": "tabs",
		"index": 2
	}
]/**SCHEMA_DIFF*/,
		attributes: {},
		methods: {
                procStartByClick: function() {
				var activeRowId = this.get("Id");
				var args = {
					sysProcessName: "Process3",
					parameters: {UsrContactId: activeRowId }
				};
				ProcessModuleUtilities.runProcess(args.sysProcessName, args.parameters, this);
				}
            	},
		rules: {},
		userCode: {}
	};
});

Вот так выгдядит карточка если зайти из раздела контакты:

Вот так выглядит карточка если например зайти на нее с раздела звонки

Добрый день. Проблема заключается в том, что карточка может открываться в двух режимах: separated mode и combined mode. За отображение кнопок действий (и не только) в первом режиме, отвечает карточка редактирования, за второй же - схема секции. При открытии карточки из раздела, первоначально карточка открывается в combined mode (по этой причине кнопка и отсутствует). Если же обновить страницу или перейти в карточку по ссылке - открывается separated mode.
Для исправления данного поведения необходимо добавить кнопку так же в секцию указав родительским элементом CombinedModeActionButtonsCardLeftContainer.

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

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

Нравится

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