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

Отвечает ли требованием безопасности (напр, настройка протокола TLS 1.2) BPMOnline SD?

Заранее большое спасибо.

С уважением,

Гюнель

Нравится

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

Здравствуйте.
Не совсем прозрачна формулировка вопроса. Если имеется в виду возможность работы BPM'online с использованием шифрования по протоколу TLS 1.2, то "да", такая возможность есть.

А в bpm'online 7.x уже нет?

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

"Александр Зубков" написал:Здравствуйте.
Есть.

Мне ТП ответила:

"TLS является развитием SSL. Возможность использования TLS включена в Roadmap функциональности bpm'online. Эта функциональность запланирована на версию 7.10. Однако Roadmap может быть изменен. Крайний срок реализации TLS в bpm'online - версия 7.11"

Очень ждем 7.11 и TLS

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

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

На даний момент бачу два варіанти вирішення задачі:
1) Створити динамічну підгрупу "Новые". Для цієї підгрупи в позиції назви динамічно показувати кількість нових звернень;
2) На головній сторінці добавити кнопку за прикладом кнопки вхідних email-ів і зав"язати на ній схожий функціонал, тільки не для email-ів, а для нових пов"язаних звернень.

Який з цих варіантів є більш прийнятним ?
Можливо знайдуться ще якісь варіанти ?

Нравится

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

Здравствуйте.
Если нужный функционал должен выглядеть так, как Вы описали, то самое простое (не требующее конфигурирования) решение - это описанное Вами в п.1 (настроить соответствующую динамическую группу с просмотром количества записей в строке итогов).

Почав з варіанту (2).
Відразу зіткнувся з необхідністю розмістити зображення на кнопці.
Вибрав png-файл 16x16 (в інших розмірах відображається лише лівий верхній сегмент від зображення), підтягнув його на кнопку і тепер маю наступне:
- коли кнопка активна (Включить [x]), то на кнопці проявляється зображення з файлу;
- коли кнопка неактивна, то на кнопці пусто - тільки жовтий фон.

І як це лікувати ?

"Котенко Александр" написал:настроить соответствующую динамическую группу с просмотром количества записей в строке итогов

Цей варіант не зовсім підходить, бо він передбачає необхідність зайти в групу.
Замовник хоче, щоб на групу не треба було заходити, але щоб кількість нових пов"язаних звернень відображалася десь безпосередньо перед очима, - це і має спонукати замовника зайти на групу для роботи з цими зверненнями.

Варіант (1) в моєму викладі передбачає постійне оновлення кількості звернень в позиції назви групи, а не в ітогах.

"Ігор Андрусенко" написал:
- коли кнопка активна (Включить [x]), то на кнопці проявляється зображення з файлу;

- коли кнопка неактивна, то на кнопці пусто - тільки жовтий фон.

А если поместить кнопку в групу контролов и включать-выключать активность у группы, то такое же поведение?

Я її розмістив поміж кнопками
UnreadEmailCountButton і NewRemindingsCountButton
в групі NavigationButtonsControlLayout.
Включенні-виключення групи дає той же самий ефект.

Я так розумію, що є якийсь секрет в "приготуванні" файлу-зображення для кнопки, який заствляє зображення вести себе правильно, бо параметри самої кнопки співпадають з аналогічними параметрами "правильних" кнопок.

Да, сss стили :)
Заходите в консоль, далее на кнопку с лупой ("обзор элементов"), тыкайте на вашу кнопку, и посмотрите что там за стили применяются в момент нажатия. Вполне возможно, что position -161px какой нибудь устанавливается.
Там можно сразу и подредактировать и проверить эффект. Когда добьетесь своего, запоминаете название Ccs класса (вроде .base-text-edit .on-hover) который вы редактировали, созадете свой модуль, во вкладку less копируете исправленный класс, и подключаете его в define страницы: "имяМодуля!css".

А и да, еще в Diff потом в кнопку в свойство "controlConfig" нужно добавить "classes".
Я так делал, когда нужно было поменять поведения правой кнопки в текстовом контроле:

controlConfig: {
 
				"classes": ["lookup-edit-right-icon-custom"],
 
			}

Це в дизайнері сторінки ?

css подключается в дизайнере страницы, да. А создается в элементе с типом "модуль" во вкладке LESS.

но не спешите, сначала отладьте все в консоли:

Ох, простите, мои рекомендации относительно 7.х. У вас, я так понимаю, 5.х.... Тогда, к сожалению, тут вам не помогу :(

З файлу SolutionResources.xml витягнув зображення для кнопки непрочитаних email-ів (UnreadEmailCountButton) в коді Base64.
Розкодував код у файл image.png
Виявилось, таки правда, - хитро приготований файл для іконки.
По його прикладу приготував свій файл для нових пов'язаних звернень 16x64.
Ось така організація:

Игорь, с таким форматом файла кнопка заработала как надо?

На сторінці [MainPage] створив нову кнопку [NewServiceRequestLinkedButton].
Добавив лічильник нових пов'язаних звернень в SQL-функцію [fn_GetContactCounters],
в [MainPageEventsProcessSchema].[PageLoadCompleteScriptTask] добавив код обробки для новоствореної кнопки у змінній [remindingTimerScript]:

PageContainer_NewServiceRequestLinkedButton.
	setEnabled(userCounters.newIncidentsLinkedCount > 0);
PageContainer_NewServiceRequestLinkedButton.
	setCaption(userCounters.newIncidentsLinkedCount.toString());
if (userCounters.newIncidentsLinkedCount && userCounters.newIncidentsLinkedCount > 0) { 
	PageContainer_NewServiceRequestLinkedButton.setButtonStyle('yellow');
} else {
	PageContainer_NewServiceRequestLinkedButton.setButtonStyle('blue');											   
}

На даний момент маю ось такий результат:
Якщо є нові пов'язані звернення:

І якщо немає:

То есть решение было и в правильной картинке, и в выставлении Enabled, и в выставлении стиля?

Тепер ще треба до кнопки прив'язати функціонал переходу в розділ [Обращения] і забезпечити, щоб активною ставала динамічна група.

"Зверев Александр" написал:То есть решение было и в правильной картинке, и в выставлении Enabled, и в выставлении стиля?

Так. Без правильної картинки при відсутності потрібних звернень картинка взагалі не відображалася.
При чому зображення не відображалося вже в самому дизайнері.

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

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

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

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

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

Как можно узнать каким именно объектам данный сервис привязан?

Заранее большое спасибо.

Нравится

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

я обычно узнаю, пытаясь повторить это удаление в SQL Server Management Studio.
Тогда в тексте ошибке будет название ограничения.
По этому названию нахожу, что мешает удалению (в последней строке поставьте название ограничения):

SELECT
OBJECT_NAME (f.parent_object_id) AS [Table],
ept.value AS [Table description],
COL_NAME (fc.parent_object_id, fc.parent_column_id) AS [Column],
epc.value AS [Column description],
OBJECT_NAME (f.referenced_object_id) AS [Referenced table],
ept_ref.value AS [Referenced table description],
COL_NAME (fc.referenced_object_id, fc.referenced_column_id) AS [Referenced Column],
epc_ref.value AS [Referenced Column description],
ix.name AS [Unique referenced table],
[Unique type referenced table] =
CASE
WHEN ix.is_primary_key = 1 THEN 'Primary key'
WHEN ix.is_unique_constraint = 1 THEN 'Unique constraint'
WHEN ix.is_unique = 1 THEN 'Unique index'
END,
delete_referential_action_desc AS [Delete referential action],
update_referential_action_desc AS [Update referential action]
FROM sys.foreign_keys AS f
INNER JOIN sys.foreign_key_columns AS fc ON f.object_id = fc.constraint_object_id
INNER JOIN sys.indexes as ix ON (f.referenced_object_id = ix.object_id)
AND (f.key_index_id = ix.index_id)
LEFT JOIN sys.extended_properties AS epc ON epc.minor_id = fc.parent_column_id
AND epc.major_id = fc.parent_object_id AND epc.Name = 'MS_Description'
LEFT JOIN sys.extended_properties AS ept ON ept.minor_id = 0
AND ept.major_id = fc.parent_object_id AND ept.Name = 'MS_Description'
LEFT JOIN sys.extended_properties AS epc_ref
ON epc_ref.minor_id = fc.referenced_column_id
AND epc_ref.major_id = fc.referenced_object_id AND epc_ref.Name = 'MS_Description'
LEFT JOIN sys.extended_properties AS ept_ref ON ept_ref.minor_id = 0
AND ept_ref.major_id = f.referenced_object_id AND ept_ref.Name = 'MS_Description'
WHERE f.name = 'FKpeg4kcj9DjjyMAlGPzQ78EpM';

Ну, и на живой базе это лучше не делать
Может, есть более простой способ?

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

Можно выводить исключение SQL со связями, препятствующими удалению, прямо в bpm'online.

Инструкция прилагается ниже.

vyvod_sql_preduprezhdeniya_v_bpmonline.docx

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

Здравствуйте , есть несколько объектов Entity (родитель Базовый Объект) в которых есть каскадное \ связанное обновление реализованное на событиях. Скажите можно ли инициализировать изменения в одном из них, так чтобы для низ лежащих не проверялись права для того кто инициировал изменение в родителе.

Или вообще инициировать изменение или сохранение объекта Entity из под другого логина например?.

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

Предметно:

Есть лист согласования который согласует заявление на отпуск, в котором должны поставить визы руководители и отдел кадров. У заявление на отпуск в детали есть записи указанных дней отпуска (Персональные дни), для каждого сотрудника (Контакт). В этих днях, есть кол-во использованных дней, которое по закрытие заявления рассчитываются. Права на изменение и добавление есть у отдела кадров, у сотрудника только на чтение, для того чтобы формировать заявление. Если лист согласование завизирван всеми участниками успешно то меняется заявление (изменяет состояние), и далее заявление на уровне объект (Entity) меняет те дни которые указанны в детали. И получается: чтобы всё прошло успешно - необходимо выдавать права на изменение на всё это хозяйство - всем кто должен подписать отпуск. Что не есть хорошо.

пример изменения по событие в entity

if (daysCount == daysUsed  &&  (daysUsed > 0)) {
   Entity.SetColumnValue("FreeDayStatusId", Terrasoft.Configuration.FreeDayStatusConst.used);
}

Я понимаю можно было написать update, или сделать на уровне SQL Server триггером, в первом случае придется воротить много одинаковых update со всех мест которые меняют объекты, во втором нагрузка на БД а не на IIS и условия изменения в данных не позволяют использовать триггер бд.

Нравится

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

Если вместо UserConnection использовать UserConnection.AppConnection.SystemUserConnection, то права будут игнорироваться.

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

Как можно сделат так что бы, при нажатие кнопки "Сервис" на карточки активности, открылся справочник "Сервис" с филтрацией с полем "Тип обращения"? (прик. файл)

Заранее большое спасибо.

Нравится

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

Активность по инциденту?
Если да, то аналогично этому, но сначала получаем значение IncidentId у задачи. Если оно заполнено, то вытягиваем тип этого обращения при помощи функции GetEntityTypedColumnValue и по этому типу и фильтруем.

В обработчике события ServiceEdit процесса страницы карточки задача добавила следующий код:

Page.ServiceEdit.PrepareLookupFilter += delegate(object sender, LookupEditEventArgs e) {
/*var typeOfServiceRequestIncidentId = (Guid)Terrasoft.Core.Configuration.SysSettings.GetValue(UserConnection, "TypeOfServiceRequestIncident");
var typeOfServiceRequestServiceCallId = (Guid)Terrasoft.Core.Configuration.SysSettings.GetValue(UserConnection, "TypeOfServiceRequestServiceCall");
var typeOfServiceRequestMassIncidentId = (Guid)Terrasoft.Core.Configuration.SysSettings.GetValue(UserConnection, "TypeOfServiceRequestMassIncident");*/
var currentTypeId = Page.DataSource.ActiveRow.GetTypedColumnValue("SubTypeId");
//currentTypeId = currentTypeId == typeOfServiceRequestMassIncidentId ? typeOfServiceRequestIncidentId : currentTypeId;
//if (currentTypeId == typeOfServiceRequestIncidentId || currentTypeId == typeOfServiceRequestServiceCallId) {
e.Filters.Add(new Dictionary {
{"comparisonType", FilterComparisonType.Equal},
{"leftExpressionColumnPath", "TypeOfServiceRequest"},
{"useDisplayValue", false},
{"rightExpressionParameterValues", new object [] {currentTypeId}}
});
};

Но к сожалению не зарабола.. (( Где я ошиблась?

Такой код нужно размещать на Init, а не в обработчике нажатия.

Начинает выдавать следующую ошибку при выборе справочника "Сервисы" на карточки активности: (прик. файл)

Date: 05.08.2015 15:12:11
Date (UTC): 05.08.2015 10:12:11

Exception Message: Значение с именем "SubTypeId" не найдено
Exception Type: Terrasoft.Common.ItemNotFoundException
Exception Source: Terrasoft.Core

Значит, у Вас в объекте «Активность» нет поля «SubTypeId» или оно не так называется.

Но вам же надо не тип активности, а тип обращения, по которому эта активность.
Вычитайте Id обращения, а потом с помощью функции GetEntityTypedColumnValue получите её тип.

Что-то у меня не получилась(( Не могли бы пожалуйста если не трудно подробно объяснит куда и что нужно добавит?

Заранее большое спасибо.

Но я же не знаю структуры Вашей базы и как называются поля.
Что-то вроде:

var serviceRequestId = Page.DataSource.ActiveRow.GetTypedColumnValue("ServiceRequestId");
var subTypeId = Terrasoft.Configuration.CommonUtilities.GetEntityTypedColumnValue<Guid>(UserConnection, "ServiceRequest", "SybType.Id", serviceRequestId);
Показать все комментарии

Добрый день!

Engagement Center 7.6
стандартный процесс - создание обращение через CTI-панель по входящему звонку
В процессе есть параметры ContactID и AccountID
Звонит какой-то пользователь в системе( Supervisor, допустим) другому пользователю.
У этого Supervisor заполнен Контрагент-Наша компания.

Сам процесс на входе как-то получает значения параметров ContactID и AccountID ( звонящий пользователь и его контрагент).
Где это происходит, в каком месте, скажите, пожалуйста?

Нравится

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

Добрый день!

Вся функциональность запуска процессов в CTI панели выполнена в отдельном пакете CTIProcessActions
Цель данного блока - дать возможность операторам колл центра, при обработке входящих обращений, запускать преднастроенные процессы обработки.
В системе можно настроить перечень процессов, которые будут отображаться в CTI панели. Так же можно указать группу пользователей, которые будут иметь возможность запускать процессы из CTI.

Настройка процессов для CTI панели
Перечень процессов, который отображается в cti панели настраивается в справочнике "Действие cti панели". В справочнике можно добавлять/удалять кнопки запуска процессов, указывать текст кнопки, сам процесс для запуска и порядок расположения.

Обязательное условие для корректного запуска процесса из cti панели - наличие параметров ContactId, AccountId, PhoneNumber. В эти параметры передаются данные контрагента или контакта по звонку. В процессе можно использовать эти данные для быстрого поиска обращений по абоненту или созданию новой записи с данными из cti панели.
ContactId – принимает идентификатор контакта в звонке, тип данных – справочник, справочник контактов
AccountId – принимает идентификатор контрагента в звонке, тип данных – справочник, справочник контрагентов
PhoneNumber – принимает номер абонента в CTI панели, строка, 250 символов

Отображение процессов для пользователей
Зачастую процессы нужны только пользователям, которые являются сотрудникаци КЦ. Что бы настроить отображение процессов только для нужной группы сотрудников в системе создана группа "Операторы КЦ". Только пользователи, которые включены в эту группу будут видеть кнопки запуска процессов в cti панели.
Если необходимо изменить группу, для которой нужно отображать процессы, это можно сделать в системных настройках. Задать другую группу для отображения процессов можно в настройке "Группа операторов КЦ".

Передача параметров реализована на CTI панеле. Когда пользователь "кликает" по нужному процессу, система передает описанные выше параметры в процесс.

"Передача параметров реализована на CTI панеле. Когда пользователь "кликает" по нужному процессу, система передает описанные выше параметры в процесс."

Расскажите подробнее, пожалуйста, где именно в пакете CTIProcessActions реализована функциональность передачи параметров в процесс.

В itil transitions при добавлении действия в CTI-панель происходит почему-то только передача параметра-контакта, а его контрагент почему-то не передается в параметр.
Хотелось бы понять почему.

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

После ответа на звонок мы идентифицируем либо контрагента либо контакта. И далее панель, при запуске процесса, передает идентифицированную запись. Т.е. либо контакт либо контрагент. Если вы хотите получить контрагента идентифицированного контакта, то лучше его вычитать из самого контакта.

В Engagement Center у вас все же идентифицируется и контакт, и его контрагент. По крайней мере, подставляется и контакт, и его контрагент. Где же в таком случае происходит идентификация контрагента?

Дарья, идентификация Контакта и Контрагента производится процессом "ContactIdentification", который находится в пакете "OperatorCustomerEngagementCenter". В рамках данного процесса сначала производится поиск Контакта, а затем из найденной карточки контакта считывается Контрагент, что видно на скриншоте.

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

Елена, спасибо.
Посмотрите, на схему его теперь, пожалуйста.

В самом начале, идет ветвление:

Если ни определен ни контакт, ни контрагент, то открывается форма поиска клиента: и там уже пользователь либо создает новый контакт, либо выбирает существующий контакт, и из определенной карточки контакта считывается контрагент ( это то, о чем пишите вы - я не про эту ветку подпроцесса спрашивала)

Если же определен либо Контакт, либо Контрагент, то происходит сразу же выход из-под процесса
( эта стрелка самая верхняя - в ней условия [#Контакт#] != Guid.Empty || [#Контрагент#] != Guid.Empty).
Как вы видите, в этом ветке не происходит никакого считывания контрагента.
После создается обращение по процессу - в котором заполнены и контакт, и контрагент.
Вопрос - где в данном случае происходит определение контрагента? Полагаю, что и контрагент, и контакт передаются как входящие параметры в процесс.
Это возвращает нас к моему первоначальному вопросу:
"Расскажите подробнее, пожалуйста, где именно в пакете CTIProcessActions реализована функциональность передачи параметров в процесс." Где именно, в каком сервисе, каком пакете это определяется?

Дарья, процесс определения Контакта и Контрагента происходит в CTI-панели при входящем звонке, далее эти параметры передаются в процессы.

Ниже привожу код функции, которая определяет параметры в CTI-панели и зашита в коде объекта.

getActionProcessParameters: function() {
var parameters = {
PhoneNumber: this.getLastAbonentNumber()
};
var subscriberKey = this.get("IdentifiedSubscriberKey");
if (!subscriberKey) {
return parameters;
}
var subscriberCollection = this.get("IdentifiedSubscriberPanelCollection");
var subscriberPanel = subscriberCollection.get(subscriberKey);
switch (subscriberPanel.get("Type")) {
case CtiConstants.SubscriberTypes.Contact:
case CtiConstants.SubscriberTypes.Employee:
parameters.ContactId = subscriberPanel.get("Id");
break;
case CtiConstants.SubscriberTypes.Account:
parameters.AccountId = subscriberPanel.get("Id");
break;
default:
break;
}
return parameters;
},

Спасибо. Можете сказать, в каком именно объекте зашита эта функция? Название сервиса?

Дарья, данная функция находится в объекте CtiPanel.

Добрый день!
Про engagement center поняла - спасибо.
по аналогии открыла конфигурацию ITIL transitions 7.5
нашла в объекте CTIPanel эту функцию.
Функция есть и она имеет вид

getActionProcessParameters: function() {
var parameters = {
PhoneNumber: this.getLastAbonentNumber()
};
var subscriberKey = this.get("IdentifiedSubscriberKey");
if (Ext.isEmpty(subscriberKey)) {
return parameters;
}
var subscribers = this.get("IdentifiedSubscribers");
var subscriber = subscribers.get(subscriberKey);
switch (subscriber.SubscriberType) {
case CtiConstants.SubscriberTypes.Contact:
case CtiConstants.SubscriberTypes.Employee:
parameters.ContactId = subscriber.Id;
break;
case CtiConstants.SubscriberTypes.Account:
parameters.AccountId = subscriber.Id;
break;
default:
break;
}
return parameters;
}

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

Но почему-то в ITIL Transitions в процессе при этом будет заполнен только параметр контакт, в результате процесс пойдет по верхней ветке (т.к. там условие заполненности контакта или контрагента), но при этом создается обращение только с заполненным контактом.

Что не так в этой стандартной функции в определении параметров для ITIL?
Может быть исправлено это было в более новых сборках? Я сейчас рассматриваю 7.5.0.1054

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

CTIPanel определяет только ИЛИ контакт ИЛИ контрагент и передает их значения в бизнес-процесс.

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

Case.BaseCasePage

onEntityInitialized: function() {
if (this.isAddMode() || this.isCopyMode()) {
this.setCaseNumber();
}
this.Terrasoft.SysSettings.querySysSettingsItem(this.statusDefSysSettingsName, function(value) {
this.set("StatusDefSysSettingsValue", value);
}, this);
this.updateOriginals();
var contact = this.get("Contact");
if (contact && !this.get("Account")) {
var account = contact.Account;
if (account) {
this.set("Account", account);
}
}
this.set("PreviousStatus", this.get("Status"));
this.callParent(arguments);
},

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

Потрібно створити фільтр, який би гарантував пусту вибірку.
Я собі так уявляю, що фільтр має реалізовувати умову типу 0=1.
Але всі методи на створення фільтрів так чи інакше одним з атрибутів мають поле.

Як правильно реалізувати фільтр ?

Нравится

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

Может, такое сработает?

esq.CreateIsNullFilter("Id");

А [Id] ні за яких умов не стане Guid.Empty() ?

Оно же первичный ключ. Кроме того, фильтр проверяет не Guid.Empty (из нулей), а Null.

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

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

Заранее большое спасибо.

Нравится

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

В обработчике события Init процесса страницы карточки надо дописать код вроде:

Page.ContactEdit.PrepareLookupFilter += delegate (object sender, LookupEditEventArgs e) {
        if (!Page.AccountEdit.Value.Equals(Guid.Empty)) {
                var filters = e.Filters;
                filters.Add(new Dictionary<string, object> {
           {"comparisonType", FilterComparisonType.Equal},
           {"leftExpressionColumnPath", "Account.Id"},
           {"useDisplayValue", false},
           {"rightExpressionParameterValues", new object[] {(Guid)Page.AccountEdit.Value}}});
 
        }
};

Большое спасибо. Заработала.

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

На разделе «Контрагент» ест 2 детали:
1. «Карьера контакта»
2. «Недавние Звонки»

На детали «Недавние Звонки» есть поле «Сотрудники» привязанный к справочнику «Карьера контакта». Но почему-то при нажатие на данное поле справочник открывается с пустым значением (реестром). Хотя на детали «Карьера контакта» фильтруется контакты связанных с соответствующему Контрагенту. Где я не правильно настроила? Прощу помочь.

Заранее большое спасибо.

Нравится

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

Пустой реестр отображаться может из-за неправильного или слишком жёсткого условия фильтрации.
Пожалуйста, уточните, что по чему фильтруется, покажите код наложениям фильтра.

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

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

Есть ли ограничение в количестве динамических групп?

С уважением,

Нравится

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