Возникла проблема после переезда на новый билд платформы 7.3 с версии 7.3.0.2567 на
более позднюю версию 7.3.0.4021. Проблема заключается в следующем:
При квалификации лида и поиске подобных записей контактов по Name/Phone/Email не удается отобразить коллекцию записей.
Collection приходит но не отображается и возникает ошибка.
Идентифицировал появление ошибки в методе onCollectionDataLoaded в модуле
Terrasoft.controls.Grid.
onCollectionDataLoaded:function(a, b, c){ this.theoreticallyActiveRows=null; if(this.rows.length){ if(!Ext.Object.isEmpty(b)&&this.rendered){ var d =[] , a ={
rows: d };
b.each(function(a){
a =this.getRow(a);
d.push(a) } ,this); if(this.hierarchical&&(b = b.getByIndex(0).get(this.hierarchicalColumnName),
a[this.hierarchicalColumnName]=
b, "listed"===this.type&& b))
b =this.getDomRow(b),
b = parseInt(b.getAttribute("level"),10),
a.rowLevel= b +1;
b =[]; this.renderGrid(b, a); for(var a ="", e =0, f = b.length; e f; e +=1)
a += Ext.DomHelper.createHtml(b[e]);
Ext.Object.isEmpty(c)&&(c ={
mode:"bottom" }); this.addRows(a, c) } }else this.collection=this.collection|| a, this.prepareCollectionData(), this.allowRerender()&&this.reRender() }
Данные методы немного различны между версиями.
Вот данный метод из предыдущей версии из модуля grid.js:
onCollectionDataLoaded:function(collection, newItems, settings){ this.theoreticallyActiveRows=null; if(!this.rows.length){ this.collection=this.collection|| collection; this.prepareCollectionData(); var wrapEl =this.getWrapEl(); if(wrapEl &&this.allowRerender()){ this.reRender(); } return; } if(this.Ext.Object.isEmpty(newItems)||!this.rendered){ return; } var rows =[]; var options ={
rows: rows };
newItems.each(function(item){ var row =this.getRow(item);
rows.push(row); },this); if(this.hierarchical){ var firstItem = newItems.getByIndex(0); var firstItemParent = firstItem.get(this.hierarchicalColumnName);
options[this.hierarchicalColumnName]= firstItemParent; if("listed"===this.type&& firstItemParent){ var firstItemParentDom =this.getDomRow(firstItemParent); var parentLevel = parseInt(firstItemParentDom.getAttribute("level"),10);
options.rowLevel= parentLevel +1; } } var result =[]; this.renderGrid(result, options); var resultHtml =""; for(var i =0, c = result.length; i c; i +=1){
resultHtml += Ext.DomHelper.createHtml(result[i]); } if(Ext.Object.isEmpty(settings)){
settings ={
mode:"bottom" }; } this.addRows(resultHtml, settings); }
Подскажите пожалуйста, в чем может быть проблема? Вчера пол дня потратили на данную оказию.
При необходимости могу предоставить исходные материалы.
Спасибо.
Добрый день! Пример с использованием обратных связей
var servicePact = this.get("ServicePact");
if (!servicePact) {
return;
}
var filtersCollection = this.Terrasoft.createFilterGroup();
filtersCollection.add("ServiceItemByServicePactFilter", this.Terrasoft.createColumnFilterWithParameter(this.Terrasoft.ComparisonType.EQUAL,
"[ServiceInServicePact:ServiceItem].ServicePact", servicePact.value));
return filtersCollection;
выполняет следующий запрос
select * from ServiceItem
where exists(select * from ServiceInServicePact
where ServiceInServicePact.ServiceItemID = ServiceItem.ID and
ServiceInServicePact.ServicePactID = @value)
т.е. показываются только те сервисы, которые есть в этом сервисном договоре.
Подскажите, пожалуйста какое условие фильтрации нужно наложить на схему ServiceCategory, чтобы выполнялся запрос и с обратными связями и с прямыми вот такого вида:
( показывались только те категории сервисов, сервисы которых есть в данном сервисном договоре)
select * from ServiceCategory
where exists(select * from ServiceInServicePact
inner join ServiceItem on ServiceInServicePact.ServiceItemID=ServiceItem.ID
where ServiceItem.CategoryID = ServiceCategory.ID and
ServiceInServicePact.ServicePactID = @value)
Аналогична ли она условию в запросе
select * from ServiceCategory
where exists(select * from ServiceInServicePact
inner join ServiceItem on ServiceInServicePact.ServiceItemID=ServiceItem.ID
where ServiceItem.CategoryID = ServiceCategory.ID and
ServiceInServicePact.ServicePactID = @value) ?
Если такая конструкция неверна, то каким образом можно использовать прямые связи в обратных для получения подобного запроса?
Данная логика является специфичной и у нас нет примеров реализации данного функционала, но вероятнее всего в фильтре, который Вы пытаетесь построить должна быть колонка «[ServiceItem:Category].[ServiceInServicePact: ServiceItem].ServicePact».
Спасибо, Елена!
Думаю, это то, что нужно
Итак, фильтр на объект ServiceCategory
«[ServiceItem:Category].[ServiceInServicePact: ServiceItem].ServicePact».
Насколько я поняла, этот фильтр дает такой запрос
select * from ServiceCategory
where exists (select * from ServiceItem
where ServiceItem.CategoryID= ServiceCategory.ID
and exists (select * from ServiceInServicePact
where ServiceInServicePact.ServiceItemId = ServiceItem.ID
and ServiceInServicePact.ServicePactId = @value))
Елена, скажите, пожалуйста, я правильно поняла действие этого условия
[ServiceItem:Category].[ServiceInServicePact: ServiceItem].ServicePact ?
Не могли бы вы пояснить, какой в результате фильтр в терминах sql накладывается на ServiceCategory,
если применить условие
[ServiceItem:Category].[ServiceInServicePact: ServiceItem].ServicePact
Создаю маленький БП, только с автогенерируемой страницей, в которой всего одна кнопка. Запуская процесс, он странно себя ведет при нажатии на клавишу закрыть. В журнале он пишет что процесс выполняется... но никак повлиять на него нельзя, не запустив автогенерируемую страницу заново из журнала процессов.
Скажите, есть ли возможность убрать эту кнопку, чтоб была лишь та, которую я добавил.
Пробовал изменить на автогенерируемую страницу на вопрос пользователя изменив трактовку задания.
Здесь та же проблема с клавишей закрыть. Но и появилась другая: Кнопка выполнить позже, ничего не делает. Пробовал добавить отображение в расписание, напоминание... и т.д. Но BPM не в какую не демонстрирует уведомление, вообще никаких показателей этому.
Кнопка "Закрыть" создает активность пользователю, который ее нажал. Кнопка "Выполнить позже" запрашивает у пользователя информацию, когда именно пользователь хочет выполнить отложенную активность.
Возможность убрать кнопку "Закрыть" есть (на самом деле она не убирается, а скрывается). Вам необходимо заместить AutoGeneratedPageV2Utilities и прописать логику сокрытия кнопки в замещающую страницу.
Добрый день. Помогите.Как создать сценарий,вписать туда код и просмотреть его результат. Например самое простое: написать код на С# в сценарий,который бы выводил "Hellow world"
Вы можете реализовать бизнес-процесс, в котором будет создан параметр с типом данных "Строка".
В сценарии обратиться к параметру как к переменной и записать в него "Hello World".
С помощью элемента "Изменение данных" или "Добавление данных" Вы можете присвоить значение данного параметра одной из колонок любого объекта с типом "Строка".
каким образом можно организовать деталь, аналогичную Ленте в разделе Обращения, но изначально настроить так, чтобы все комментарии в данной ленте обращения были бы доступны только сотрудникам компании?
В текущей реализации детали Лента в разделах нет возможности управлять правами доступа на отдельные сообщения. Поэтому для реализации подобного функционала необходимо создать отдельную деталь по аналогии с деталью Лента, которая бы работала с отдельной таблицей. Деталь можно отображать/скрывать в зависимости от того, является ли текущий пользователь сотрудником компании.
Добрый день,
Не могли бы вы в краце рассказть нам об основных этапах при создании подобной Детали.
Особенно в части того, как настроить отображение/скрытие данной детали отдельным пользователям или группам.
Деталь Лента является специфической. К сожалению, у нас нет подробной инструкции по ее созданию, ориентироваться следует на существующую логику, реализованную в системе.
Для того, чтобы отображать/скрывать деталь, следует:
1) на странице редактирования раздела, в блоке diff в элементе детали добавить атрибут «visible», отвечающий за отображение/скрытие детали;
2) создать метод, который будет выполнять проверку видимости согласно Вашей бизнес-логике;
3) связать метод с атрибутом.
"Alina_Velichko" написал:Первый, это выполнение экспорта данных из версии Terrasoft 3.x и последующий импорт (используя универсальный импорт записей) в bpm'online 7.6.
интересно, сколько же Excel-файлов необходимо создать, чтобы перенести стандартные данные? И в каждом проекте с нуля делать?
Владимир, система позволяет импортировать таким способом до 10 тысяч записей одним файлом.
Но, естественно, преимущество за вторым вариантом, используя перенос с помощью базовых комманд select/insert.
Делаю в БП страницу редактирования Договора. Мне надо чтобы элемент был выполнен только если на детали Продукты есть хотя-бы одна запись. Пробовал сделать через агрегирующий фильтр:
После чего я вижу:
Пробовал на другие детали, работает как-то выборочно. Например на визу работает, а на активности нет. Поставил зависимости от пакетов:
ContracInOrder, Order, CoreContract, и другие
Пробовал на разных сайтах. Ошибка идентичная.
Данную задачу можно выполнить с помощью элемента "Чтение данных", но интересно почему не работают фильтры и как с ними работать?
Вопрос №2
в БП нужно создать визу в договоре на Контакта у которого
контрагент = Наша компания,
филиал = Контакт текущего пользователя.Филиал
должность = Фин.директор
И когда виза будет подтверждена продолжать БП. Подскажите как это лучше реализовать. Заранее спасибо.
Ничего не указывайте в поле "Считать элемент выполненым, если объект соответствует условиям".
После завершения задачи, используйте элемент "Чтение данных". Считайте количество записей в объекте "Продукт в заказе", где Заказ = Id Вашего заказа.
Используйте условные потоки:
Если количество = 0, тогда возвращаемся к редактированию заказа
Иначе - идем по процессу дальше
Вопрос №2.
1) Используйте элемент "Чтение данных" по объекту "Контакт", с фильтром Контакт = Контакт текущего пользователя
2) Используйте элемент "Чтение данных" по объекту "Контакт", с фильтром Филиал = Чтение данных1.Первый элемент результирующей коллекции.Филиал и Контрагент = Наша компания и Должность = Фин.директор
3) Используйте элемент "Добавить данные" в объекте "Виза договора". Установите визирующим контакта, прочитанного на втором шаге.
4) Используйте "Промежуточный обрабатыващий сигнал" по объекту "Виза договора", событие - изменение записи по Id созданной на предыдущем шаге записи с фильтром Состояние = "Положительная", чтобы отследить изменение состояния в поле "Состояние".
Только учтите, что состояние визы еще может быть "Отрицательным".
1. Я через чтение данных и сделал. Интересовало как работать с агрегирующими фильтрами и работают ли они ?
2. А если будет несколько контактов в должности фин.директор ?
Я пробую записать в объект Виза договора результат выборки по контакту. Но я столкнулся с тем, что колонка визирующий смотрит в объект "Объект администрирования"
1. Как видно из предоставленных Вами скриншотов, фильтры работают некорректно - было предложено альтернативное решение.
2. Полностью с Вами согласен - виза проставляется либо роли, либо пользователю, поэтому объект действительно "Объект администрирования".
Перед элементом "Добавить данные" используйте еще одно чтение данных по объекту "Объект администрирования" с фильтром Контакт = Id контакта с должностью фин. директор.
В случае, если в системе несколько фин. директоров у одного филиала, тогда система выберет первого по указанной Вами сортировке.
Добрый день, Есть деталь, необходимо чтобы на ней отображались лишь записи подходящие под определенные условия (по значениям полей записей), как добавить подобный фильтр?
Олег, фильтрация настраивается путем указания соответствующих masterColumn и detailColumn при добавлении детали на страницу
Вот пример сложного фильтра (на страницу с документом добавляем детали заявок)
define("CorrespondencePageV2", [],
function(){return{
entitySchemaName:"Document",
details:/**SCHEMA_DETAILS*/{
Order:{
schemaName:"OrderDetailV2",
entitySchemaName:"Order",
filter:{
masterColumn:"Id", // Id текущего Document
detailColumn:"[OrderInDocument:Order:Id].Document"// Все Document, которые связаны с Order детали через таблицу OrderInDocument}}}/**SCHEMA_DETAILS*/,
diff:/**SCHEMA_DIFF*/[{"operation":"insert",
"parentName":"HistoryTabContainer",
"propertyName":"items",
"name":"Order",
"values":{"itemType": Terrasoft.ViewItemType.DETAIL}}]/**SCHEMA_DIFF*/};});
Спасибо, добавил filterMethod, работает, только одна проблема как мне сравнивать значение дат.
Необходимо отфильтровывать и выводить только те записи у которых ValidTill больше текущей даты.
Пробовал значение сравнивать с текущей датой в разных форматах (yyyy-mm-dd и dd/mm/yyyy), фильтр не отрабатывает
filterGroup.add("ValidTillGreaterFilter", this.Terrasoft.createColumnFilterWithParameter(this.Terrasoft.ComparisonType.GREATER, "ValidTill", new Date()));
Фильтрация по дате заработала, но теперь не работает базовая фильтрация по Id продукта и значению Product в детали.
Вопрос как добавить в filterMethod условие Id equal Product И (ValidTill > newDate() ИЛИ ValidTill isNull)
Т.е. добавить срази условие И и ИЛИ в один фильтр, т.к. изменение
Вам необходимо создать дополнительную группу фильтров, а существующую filterGroup использовать внутри неё:
productPriceFilter: function(){
var filterGroup =newthis.Terrasoft.createFilterGroup();
filterGroup.logicalOperation=this.Terrasoft.LogicalOperatorType.OR;
filterGroup.add("ValidTillNullFilter", this.Terrasoft.createColumnFilterWithParameter(this.Terrasoft.ComparisonType.IS_NULL, "UsrValidTill"));
filterGroup.add("ValidTillGreaterFilter", this.Terrasoft.createColumnFilterWithParameter(this.Terrasoft.ComparisonType.GREATER, "UsrValidTill", new Date()));
var mainFilterGroup =newthis.Terrasoft.createFilterGroup();
mainFilterGroup.logicalOperation=this.Terrasoft.LogicalOperatorType.AND;
mainFilterGroup.addItem(filterGroup);// добавляете фильтр по Id продуктаreturn mainFilterGroup;},
В bpm’online ITIL service реализована функциональность автоматической отправки email-сообщений по обращениям.
Email-сообщение отправляется клиенту при регистрации, взятии в работу, разрешении, отмене, отклонению по SLA и закрытии его обращения.
Для отправки сообщений выполните предварительную настройку:
• В системной настройке“E-mail службы поддержки” укажите почтовый ящик, который будет использоваться для автоматической отправки email-сообщений
Для автоматического создания обращения по входящему е-mail, в системной настройке “E-mail службы поддержки” укажите почтовый ящик поддержки.
Затем, необходимо ввести пароль от общего ящика и поставить галку в графе «Использовать как общий ящик»
[IMG]http://s020.radikal.ru/i701/1507/9e/17b4df9c6094.jpg[/IMG]
Таким образом, при входящем e-mail на указанный ящик будет автоматически создано новое обращение.
Чтоб все сотрудники могли отправлять письма с общего почтового ящика, необходимо в [Дизайнере системы] перейти к [Доступу по операциям], найти [Доступ к подключению общего почтового ящика]
Добавляем пользователей/группу пользователей которым будет доступен общий почтовый ящик.
Добрый день.
Делаю все также но Обращение не создается.
Письмо продолжает после получения находиться "Не обработанным" в папке "Входящие"
В письме определен Контрагент и Контакт. А Активность/Обращение не подлинковано.
Может есть еще настройки?
Для автоматической регистрации обращения по входящему email для версии продукта 7.6 необходимо выполнение следующих условий:
1. В справочнике «Список почтовых ящиков для регистрации обращений» указать email, при поступлении письма на который, будет формироваться обращение в системе.
2. В системной настройке «E-mail службы поддержки» указать тот же ящик, что указан при выполнении пункта 1. Если Вы в справочнике указали несколько email, то в системной настройке укажите тот ящик, который будет использоваться по умолчанию.
3. В системной настройке «Автоматический запуск процесса "Регистрация инцидента по входящему email"» необходимо проставить признак активности в графе «Значение по умолчанию».
Если данные введены корректно, то их должно быть достаточно для автоматической регистрации обращения по входящему email.
Дополнительно:
Возникают иногда ситуации, что при выполнении вышеуказанных действий регистрация не происходит, в таком случае необходимо настроить в Вашем профиле «Учётные записи почты».
Также через «Управление конфигурацией» проверить корректность или вообще присутствие настроек для Вашего почтового сервера на вкладке «Настроить список почтовых провайдеров». Рис. во вложении.
Скажите а Обращения создаются с категорией "инцидент". Как то можно изменить это в уже созданном Обращении на "Запрос на обслуживание"?
Возможно ли настроить чтоб было "Запрос на обслуживание" при автоматическом создании из письма?
В данный момент - нет, автоматическая регистрация обращения происходит только с категорией "Инцидент".
Система считает, что внутренний сотрудник, как правило, будет создавать обращение на портале, где есть возможность поставить категорию "Запрос на обслуживание".
Плюс БП "Управление инцидентами" реализован только для обращений с категорией "Инцидент".
Но реализация новой логики обязательно будет в дальнейших обновлениях.
Еще добавлю описание принципиального отличия между ними:
• ЗАПРОС НА ОБСЛУЖИВАНИЕ — обращение, поступающее в службу поддержки в рамках нормального функционирования сервиса. Например, запрос на установку нового рабочего места или настройку телефонной линии.
• ИНЦИДЕНТ — событие, которое не является частью стандартной работы сервиса и которое может повлечь за собой прерывание либо ухудшение качества сервиса. Например, запрос на ремонт оборудования или восстановление телефонной связи после сбоев.
Добрый день, Павел! Данный функционал, реализован в 7.7. При регистрации обращения, поле остается пустым, а Вы самостоятельно сможете выбрать "инциндент" это, либо "запрос на обслуживание"
Добрый день, Павел!
Данный функционал, реализован в 7.7. При регистрации обращения, поле остается пустым, а Вы самостоятельно сможете выбрать "инцидент" это, либо "запрос на обслуживание"
Версия bpm online 7.9.1
Почта приходит, письма отображаются, но обращения не регистрируются.
Почтовый провайдер Exchange
В "Журнале процессов" по процессу Регистрация обращения по входящему письму:
Подпись Состояние Дата начала Описание ошибки
Email to support Завершен 04.05.2017 13:58
Завершен 04.05.2017 13:58
Register incident Завершен 04.05.2017 13:58
Настроено все как в видео уроке "Настройка обработки обращений по каналу Email в bpm’online".
Раньше был настроен IMAP, все работало.
Потом необходимо было изменить почтовый ящик.
Сейчас перевели почту на Exchange (по рекомендации техподдержки Террасофт)
Ольга, добрый день!
В версии продукта 7.9.0 и выше есть много нового функционала по работе с нежелательной почтой.
Необходимо проверить активность (письмо) не является ли данное письмо автоответом и не попадает ли оно под параметры указанные в справочнике "Черный список email адресов и доменов для регистрации обращений".
Так же, прошу обратить Ваше внимание, что регистрация обращения происходит только от имени пользователей у которых есть лицензия на продукт Service. Процесс регистрации запускается от имени пользователя, который выполняет синхронизацию с почтой, если не корректно настроена синхронизация (ее может запустить любой пользователь), то есть вероятность что пользователь у которого нет лицензий и запустит процесс, который в свою очередь упадет с ошибкой.
Отправьте тестовое письмо со своего личного или рабочего ящика и проверьте функционал регистрации. И, обязательно, проверьте корректность указанного email в справочнике "Список почтовых ящиков для регистрации обращений".
Есть деталь, добавленная на несколько страниц. Необходимо реализовать разную клиентскую JavaSdcript логику в зависимости от того, на какую странице добавлена деталь. Подскажите, пожалуйста, как это сделать из JS.
Для решения задачи следует:
// Взять информацию о детали
var detailInfo = this.sandbox.publish("GetDetailInfo", null, [this.sandbox.id]) || {};
// Имя карточки, на которой размещена деталь
var cardPageName = detailInfo.cardPageName;
Сообщение GetDetailInfo и метод getDetailInfo доступны в контексте детали, поэтому их можно вызывать в контексте детали:
var detailInfo = this.sandbox.publish("GetDetailInfo", null, [this.sandbox.id])|| {};
var detailInfo = this.getDetailInfo();
В Вашем случае, для того, чтобы узнать название страницы в контексте самой страницы, достаточно прочитать свойство this.name
Код выше это код разметки детали, а не карточки. Если я оттуда вызову this.name я получу имя страницы с разметкой детали. А мне нужно получить имя страницы карточки, на которую добавлена деталь.
Вы не могли бы более подробно объяснить про "контекст детали"? Где именно я должен разместить указанные Вами строки кода, чтобы они оказались "в контексте детали"?
// v7.5
getUsrVacanciesEnabled: function(){
var defaultValues =this.getDefaultValues();if(!Ext.isEmpty(defaultValues)){return defaultValues.some(function(value){return(value.name==="UsrCandidates")})}}// v7.6
getUsrVacanciesEnabled: function(){
var value =this.getDefaultValueByName("UsrCandidates");return(!Ext.isEmpty(value));}