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

rules: {
"Offering": {
"FiltrationAmountByProduct": {
"ruleType": BusinessRuleModule.enums.RuleType.FILTRATION,
//"autocomplete": true,
"autoClean": true,
"baseAttributePatch": "Price",
"comparisonType": Terrasoft.ComparisonType.EQUAL,
"type": BusinessRuleModule.enums.ValueType.ATTRIBUTE,
"attribute": "Amount"
}
}
}

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

Нравится

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

Мария,

такой функционал, действительно, можно реализовать с помощью правила.

Для решения проблемы попробуйте раскомментировать параметр "autocomplete" - он ведь как раз и отвечает за обратную фильтрацию.

А также ознакомьтесь со статьей на эту тему: https://academy.terrasoft.ru/documents/technic-sdk/7-9/primer-primeneni…

спасибо за помощь :smile:, по этой статье и делали, с полями, которые являются оба справочниками такое получилось, а в этом случае, если раскомментировать autocomplete в итоге вообще все поля очищаются :sad:

Попробуйте сделать по аналогии с этим примером: https://academy.terrasoft.ru/documents/technic-sdk/7-9/dobavlenie-vychi…

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

Коллеги, день добрый.

Подскажите, пожалуйста, как можно решить такую задачу.

Есть Активность, в которой Автор и Исполнитель отличаются. Как только Исполнитель завершает задачу Автору должно выводиться уведомление (в коммуникационной панели во вкладке уведомлений) о том, что конкретная задача завершена.

Сделал бизнес-процесс, который добавляет Уведомление по сигналу изменения состояния Активности. Само уведомление в панели появляется, но счётчик не меняется.

Попробовал создать отдельного провайдера (по аналогии с DocumentNotificationProvider и ForecastNotificationProvider), но словил ошибку 400. Подозреваю, что на один раздел может быть только один провайдер уведомлений.

Получилось отловить ошибку, которая выдаётся в консоли:

Сервер обнаружил ошибку при обработке запроса. Сообщение об исключении: "Значение не может быть неопределенным.

Имя параметра: type". Дополнительные сведения см. в журналах сервера. Трассировка стека исключений:
в System.Activator.CreateInstance(Type type, BindingFlags bindingAttr, Binder binder, Object[] args, CultureInfo culture, Object[] activationAttributes)
в System.Activator.CreateInstance(Type type, Object[] args)
в Terrasoft.Configuration.RemindingsHelper.GetResult(Guid sysAdminUnitId, NotificationProviderType type, DateTime date, String methodName)
в Terrasoft.Configuration.RemindingsHelper.GetCount(Guid sysAdminUnitId, NotificationProviderType type, DateTime date)
в Terrasoft.Configuration.RemindingsHelper.GetRemindersCounter(Guid sysAdminUnitId, String dueDate)
в Terrasoft.Configuration.RemindingsHelper.GetPopupConfigResponse(Guid sysAdminUnitId, String dueDate)
в SyncInvokeGetPopupConfig(Object , Object[] , Object[] )
в System.ServiceModel.Dispatcher.SyncMethodInvoker.Invoke(Object instance, Object[] inputs, Object[]& outputs)
в System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin(MessageRpc& rpc)
в System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage5(MessageRpc& rpc)
в System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage11(MessageRpc& rpc)
в System.ServiceModel.Dispatcher.MessageRpc.Process(Boolean isOperationContextSet)

 

Нравится

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

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

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

Так же убедитесь, что в таблице NotificationProvider существует запись для нового провайдера.

"Попробовал создать отдельного провайдера (по аналогии с DocumentNotificationProvider и ForecastNotificationProvider), но словил ошибку 400."
- Скорее всего могли быть допущены ошибки в созданном провайдере.
Но если уже есть базовый провайдер уведомлений по Активностям, то нет смысла создавать новый(только если хотите использовать другой тип уведомлений).

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

Запись для нового провайдера тоже добавлял.

Я как раз и хочу добавить провайдер уведомлений по Активностям с типом "Уведомления" (базовый работает с напоминаниями).

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

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

Так а в чем проблема была, решили?

Сомневаюсь, что логи за 2017 год сейчас сохранились.

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

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

При отправке письма через BPM (интеграция с почтовым ящиком), письма сохраняются в исходящих в BPM, но в исходящих в почтовом ящике их нет.
Есть ли какие то стандартные пути добавления данного функционала?
Если нужно доработка, подскажите пожалуйста что примерно нужно сделать?

Нравится

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

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

В приложении bpm’online синхронизация отправленных писем с почтовым сервером не предусмотрена. Все отправленные письма сохраняются только в приложении.

Но есть нюанс: при использовании Exchange или Gmail отправленные письма будут попадать на сервер, так как этот функционал реализован со стороны почтовых серверов.

Возможно ли реализовать данный функционал на стороне BPM (просматривая функционал IMAP, не нашел подходящих функций)? Если да подскажите пожалуйста направления куда копать)
Или данный функционал может быть реализован только на стороне почтового сервера?

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

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

Добрый день! 

Что нужно сделать на стороне сервера, чтобы отправленная из BPMOnline почта сохранялась на почтовом сервере? 

Это зависит от того, какой сервер. Смотрите документацию по нему.

Хорошо, а каком направлении смотреть? Что на сервере должно быть настроено чтобы сохранялись отправленные письма? 

Смотрите в направлении сервера и его настроек.

Пробовал использовать почтовые серверы mail.ru и yandex.ru. Ни там, ни там отправленные письма не отобразились. Ума не приложу что надо настроить? Ни когда с этим не сталкивался.

Система bpm'online работает с почтой по тем же протоколам, что и другие почтовые клиенты. Например, Windows Mail или Thunderbird. Если в них настроить подключение к тому же почтовому серверу и тоже отправленные на сервере не сохраняются, лучше спрашивать в службе поддержки самой почты.

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

Руслан, в таком случае Вы можете использовать не Яндекс, а другой почтовый сервис, который поддерживает желаемую функциональность. Или поднять у себя собственный POP3/SMTP/IMAP-сервер и настроить так, как хотите.

Добрый вечер. Подскажите, возможно вы уже решили вопрос описанный выше: "При отправке письма через BPM (интеграция с почтовым ящиком), письма сохраняются в исходящих в BPM, но в исходящих в почтовом ящике их нет."? Нужна такая функция не с Exchange или Gmail.

Юлия, на текущей конфигурации приложения, к сожалению, синхронизировать отправленные письма из системы через smtp в папку "Отправленные" на почтовом ящике возможности нет.

Исходящая почта из Creatio не отображается в почтовом клиенте в связи с тем, что приложение только синхронизируется с почтой на загрузку писем. Данная особенность настраивается на стороне почтового сервера. Например, при интеграции с Exchange, используется протокол EWS, который поддерживает функциональность передачи исходящих писем между клиентом и почтовым сервером. У Gmail их специалисты настроили эту возможность отдельно со своей стороны.



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

Александр, спасибо!

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

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

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

Если создать view sql (объект - представление в бд), и настроить итоги через него, это решит данный вопрос?
Есть ли другие варианты?

Нравится

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

Здравствуйте.
Подскажите каким образом можно реализовать, чтобы при нажатии на раздел "База знаний", в текущей вкладке загружалась ссылка на сторонний сайт.

Пока у меня идея такая: при инициализации секции, создавать окно с с тем ресурсом (но это не то что требуется)
Но надо, чтобы просто когда кликнули на раздел, в этой же вкладке пошла загрузка страницы (обычный клик по ссылке).

Нравится

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

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

Необходимо заместить KnowledgeBaseSectionV2:

define("KnowledgeBaseSectionV2", [], function() {
	return {
		entitySchemaName: "KnowledgeBase",
		attributes: {},
		methods: {
			init: function() {
				window.location.href = "http://bpmonline.com";
			}
		},
		diff: /**SCHEMA_DIFF*/[]/**SCHEMA_DIFF*/
	};
});

После нажатия на раздел будет осуществлен переход по ссылке http://bpmonline.com.

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

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

Версия 7.10.

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

К примеру, кнопку, на которую добавлен вызов функции? Или создать свой контрол, генерирующий свой html-код?

Если да, то можно ли посмотреть примеры (хотя бы пример с кнопкой)?

Нравится

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

Вот здесь, например есть инструкция по созданию своего контрола: http://www.community.terrasoft.ru/forum/topic/25285#comment-67717

Можно ли такое же сделать для мобильного приложения?

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

Ext.define("...вью...", {
    config: {
       refreshButton: {
            id: 'usr_order_refresh_btn',
            cls: "x-button-primary-blue",
            text: 'Обновить'
        }
    },
    showRefreshButton: function (isShow) {
        var navigationPanel = this.getNavigationPanel(); /*компонент в котором нужно отобразить контрол*/
        var refreshButton = this.getRefreshButton();
        if (isShow) {
            this._refreshButton = navigationPanel.addButton(refreshButton);
        } else {
            navigationPanel.removeButton(refreshButton);
        }
        return this._refreshButton;
    }
});
Ext.define("...контроллер...", {
    initializeView: function (view) {
        this.callParent(arguments);
        var btn = view.showRefreshButton(true);
        btn.on("tap", this.onRefreshButtonTap, this);
    },
    onRefreshButtonTap: function() {
        /* сабж  */
    }
});

Ещё раз большое спасибо!

Два вопроса ещё есть:

1. Где-нибудь можно найти список компонентов? Вот, например, есть MobileOpportunityEditPage, можно ли кнопку добавить не на навигационную панель, а допустим прямо между колонками - как на картинке (не обязательно именно так, дизайн может быть любым.. вопрос в возможности)?

2. А если речь идёт именно о своём элементе? Допустим, просто вывести блок html.

Могу сказать, в принципе, чтобы было понятно: началось всё с идеи добавить туда canvas, для того, чтобы клиент мог подписать договор "на экране планшета". В браузерной версии всё по кр.мере понятно - там делается контрол по инструкции из комментария выше, и в нужное место на странице добавляется блок с канвасом. Далее делаются обработчики для него, и всё такое. А вот можно ли повторить это в приложении...

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

Ext.define("...контроллер...", {
	onLoadRecord: function(loadedRecord, callback) {
		  this.callParent([loadedRecord, function() {
				 var panelItems = this.getView().getPanel().getItems();
				  /* собственно здесь хранятся панели и детали страницы*/
				 var primaryColumnSet = panelItems.first(),
                                      control = this.getOurCustomControl(loadedRecord);
				 primaryColumnSet.add(control); //если добавляем в конце панели
                                 primaryColumnSet.insert(index, control); //в определенное место
		  }
	},
	getOurCustomControl: function(record) {
 
	}
}

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

Например, если я заменяю в showRefreshButton функцию this.getNavigationPanel() на this.getPanel().getItems().first() и далее addButton на add - то блок появляется на странице, но не виден из-за отсутствия текста в нём (а при addButton ошибка).

А например, this.getItems().first() - работает как getNavigationPanel.

onLoadRecord: function(loadedRecord, callback) {
      this.callParent([loadedRecord, function() {
         var panelItems = this.getView().getPanel().getItems();
          /* собственно здесь хранятся панели и детали страницы*/
         var primaryColumnSet = panelItems.first(),
              control = this.getOurCustomControl(loadedRecord);
         primaryColumnSet.add(control); //если добавляем в конце панели
      }]);
    },
    getOurCustomControl: function(record) {
		return '<div id="testDiv"></div>';
    },

В таком случае вываливается ошибка.

sencha-touch-all-debug.js:86794 Uncaught Error: [ERROR][Ext.Container#factoryItem] Invalid config, must be a valid config object

допустим так:

onLoadRecord: function(loadedRecord, callback) {
      this.callParent([loadedRecord, function() {
         var panelItems = this.getView().getPanel().getItems();
          /* собственно здесь хранятся панели и детали страницы*/
         var primaryColumnSet = panelItems.first(),
              control = this.getOurCustomControl(loadedRecord);
         control .on("tap", function () {
                        Terrasoft.MessageBox.showMessage("hello world");
         }, this);
         primaryColumnSet.add(control); //если добавляем в конце панели
      }]);
    },
    getOurCustomControl: function(record) {
                return Ext.create('Ext.Button', {
                      xtype: "button",
                      cls: "x-button x-button-link",
                      text: "?"
                    });
    }
}

Огромное спасибо! Теперь понял))

И всё-таки в качестве завершающего аккорда - можно ли вывести туда свой html код? Можно конечно сгенерить пустой блок и поставить туда через innerHTML, допустим такой код:

<div id="myDiv" style="width: 100%; height: 150px; background-color: #eee">Мой блок</div>

или тот же канвас, с которого всё начиналось:

<canvas id="myCanvas" width='350' height='150' style="background-color: #eee; border: 1px solid #ccc;"></canvas>

Но насколько правильно так поступать в данном случае? И будет ли это работать на всех видах устройств?

return Ext.create("Ext.Toolbar", {
            id: 'myCanvas-toolbar',
            html: "<canvas id="myCanvas" width='350' height='150' style="background-color: #eee; border: 1px solid #ccc;"></canvas>",
            height: '60px'
        })

Спасибо!!

Работает, больше вопросов наверно не имею)

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

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

Версия 7.10.

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

Рассмотрим ситуацию на примере страницы Контакта. У нас есть схема MobileContactPreviewPage, я на её основе создал свою UsrMobileContactPreviewPage и внутри Ext.define("ContactPreviewPage.Controller", {}); добавил метод (нашёл в других схемах):

initializeView: function(){
                this.callParent(arguments);
                console.log("initialized");
        }

Далее подключил свою схему с созданным методом в MobileApplicationManifestDefaultWorkplace.
Правильно ли я понял, что этот метод - и есть аналог onEntityInitialized? По крайней мере очень на то похоже, я попробовал внутри него обратиться к элементу DOM по id - и получил нужный элемент.

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

В браузерной версии для этого используются удобные методы this.get("Column") и this.set("Column",data). В мобильной, как мне удалось найти, можно писать бизнес-правила, но может быть можно и по другому их добавлять?

В принципе, по текущим бизнес-задачам возможно, что подставлять данные придётся внутри initializeView, после инициализации страницы, поэтому вопросы в целом связаны.

Нравится

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

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

onLoadRecord: function (loadedRecord, callback) {

/*loadedRecord - собственно сама запись*/

this.callParent(arguments);

/* после вызова родителя запись доступна во всем контроллере через this.record
и уже ей можно делать get и set
*/
}

Огромное спасибо!

Но есть вопрос:

loadedRecord, как я понял, работает только внутри функции? Например, сделал я кнопку, по инструкции из соседней темы, в функции-обработчике добавил:

onRefreshButtonTap: function(loadedRecord) {
        console.log(loadedRecord);
        loadedRecord.set("Probability",90, true)
 },

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

Если не потерялся scope, то - this.record.set

Спасибо!

Работает.

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

Добрый день, коллеги!

В локальной среде разработки (7.10) создал отдельный пакет, в его зависимости добавил пакет UIv2.

С помощью мастера разделов создал в этом пакете новый раздел. После выгрузки пакета с помощью WorkSpaceConsole и его успешной загрузки в тестовую среду (on-cloud) пытаюсь открыть созданный раздел. В консоли отладчика в браузере получаю такую ошибку:

user: Supervisor/7f3b869f-34f3-4f20-ab4d-7480a5fdf647
file: https://xyz.bpmonline.com/0/configuration/b58905880bd3ab7635160eaf12f09e...
line: 21689
column: 29
message: Uncaught TypeError: Cannot read property 'extendParent' of undefined
date: Thu Jun 01 2017 13:02:22 GMT+0300 (RTZ 2 (зима))
stack: TypeError: Cannot read property 'extendParent' of undefined

Вот как выглядит ошибка в отладчике

Вот как выглядит JS-объект, на котором происходит ошибка из-ха того, что поле schemaStructure undefined

Прежде чем задавать этот вопрос, ознакомился с постом на схожую тему https://community.terrasoft.ru/forum/topic/25523

проверил данные в БД, все необходимые записи в таблицах есть.

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

Заранее благодарен за ответ.

Нравится

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

Андрей,

проверьте всё ли в порядке с наследованием пакетов на той среде, где Вы загрузили новый раздел. Не отличается ли наследование с продуктовой средой :wink:

Алла, проверил, проблем с наследованием пакетов нет. Полагаю, что если такие проблемы были бы, система не сообщила бы об успешной установке пакетов. Ошибка в чем-то другом.

Алла, проверил, проблем с наследованием пакетов нет. Полагаю, что если такие проблемы были бы, система не сообщила бы об успешной установке пакетов. Ошибка в чем-то другом.

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

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

Илья, спасибо за ответ.

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

Здравствуйте,
Сложно в таком случае подсказать в чем проблема, если это не иерархия и не проблема кеширования. Напишите в поддержку с предоставлением доступа к сайту, что бы они посмотрели в чем там дело.
support@terrasoft.ru

Здравствуйте.
По-моему необходимо перегрузить приложение в IIS
Если есть возможность, проверьте на "чистом" приложении локально, а затем попросите поддержку перезагрузить сайт вручную

Роман, добрый день!

Ошибка воспроизводится на разных серверах, рестарт IIS, перезапуск процесса w3wp не помогают. Пока обошел ошибку тем, что создал вручную новый клиентский модуль - наследника от "Базовая схема раздела (NUI)". С ним ошибок нет. Жду развернутого ответа от поддержки.

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

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

Добрый день. Подскажите, пожалуйста. Добавили чек-бокс на деталь продукта. Как проставить ему true для всех прошлых записей? То есть у нас есть раньше этого чек-бокса не было и теперь для прошлых продуктов у этого чек-бокса не стоит галочка. А надо, чтобы стояла.

Нравится

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

Вам необходимо выполнить Update в базе данных устанавливающий значение 1 для всех записейв данной детали.

Или написать маленький бизнес-процесс

Или написать маленький бизнес-процесс

Спасибо!

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

Добрый день!
Необходимо вызвать планировщик задач из бизнес процесса на запуск другого бизнес процесса в определенное время. В первом бизнес процессе идет обработка объекта с определенным id, есть ли какой либо способ через планировщик передать это id вызванному в указанное время бизнес процессу, для последующей работы с объектом?

Нравится

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

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

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

qrtz_with_param.txt

Здравствуйте, Олег!
Как я поняла, этот метод запустит бизнес процесс сразу после создания джобы. Или там есть какой то анализ параметра starttime в словаре, как даты запуска процесса?

"Родионова Ольга Валентиновна" написал:запустит бизнес процесс сразу после создания джобы

в случае ScheduleImmediateProcessJob, да. всё, что в параметрах - кидается в процесс.

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

В своё время суппорт террасофта кидал мне такое решение

string userName = ....; //- Имя пользователя, от которого запускается бп
var userConnection = ....;
string schedulerJobGroupName = "MyProcessGroup";//- Любое имя группы триггеров
string jobProcessName = "MyBusinessProcess"; //- Название процесса, который нужно запустить
string schedulerJobName = "MyJobName"; //- Любое имя
int startOffset = 100; //- Количество секунд до старта
IDictionary<string, string> parameters = new Dictionary<string, string>();
parameters["Param1"] = ....;
 
var job = AppScheduler.CreateProcessJob(schedulerJobName, schedulerJobGroupName, jobProcessName, userConnection.Workspace.Name, userName, parameters);
var trigger = new SimpleTriggerImpl(schedulerJobName + "Trigger", schedulerJobGroupName, DateTime.UtcNow.AddSeconds(startOffset));
AppScheduler.Instance.ScheduleJob(job, trigger);

Если вам не подойдёт, посмотрите в VisualStudio параметры создания триггера

new Quartz.Impl.Triggers.SimpleTriggerImpl(...)

Там куча вариантов. И единоразовый, и с повторениями, и который запускается в определённое время и повторяется с определённым интервалом.

Буду пробовать. Большое спасибо!

Коллеги, добрый день!

Для установки параметров запуска бизнес-процессов по расписанию через пользовательский интерфейс, мы выпустили соответствующее дополнение к bpm'online. Надеюсь, будет полезным:)

Подробнее здесь https://marketplace.terrasoft.ru/app/extended-business-process-scheduler

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