Добрый день, коллеги!
При добавлении контактов в динамическую группу фильтр сохраняется в ContactFolder в поле SearchData. На фронте для получения данных по этому фильтру есть метод Terrasoft.deserialize

esq.filters.add(Terrasoft.deserialize(item.get("SearchData")))

Есть ли какой то способ получить этот фильтр для передачи в запрос на бэке?

Нравится

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

Под этим методом по сути находится ext.decode
https://stackoverflow.com/questions/21929569/newbie-what-does-ext-decod…

А пример использования в бэке, можете посмотреть хоть в том же QueuesService в методе AddFolderEntityQueueItems:

byte[] searchData = folderEntity.GetBytesValue("SearchData");
string serializedFilter = Encoding.UTF8.GetString(searchData, 0, searchData.Length);

Большое спасибо, Максим! Все получилось :smile:

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

Добрый день.
У нас приобретено bpmonline ITIL service on-site - 5 (количество лицензий для сотрудников компании).
Какое количество пользователей портала может пользоваться порталом? Какие это лицензии: конкурентные или нет?

Нравится

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

Добрый день!

Вообще, для портала используются отдельные лицензии - Service Portal on-site. Если их нет - нет и возможности пользоваться порталом.

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

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

Добрый день, подскажите, пожалуйста, можно ли сделать активную ссылку в списке менеджеров(как при выборе во всплывающем окне, но должен оставаться именно списком), чтобы при нажатие на неё происходил переход в карточку менеджера?
И можно ли сделать так, чтобы у менеджера отображалось к каким сделкам привязан этот сотрудник (за какие активности ответственен)?

Нравится

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

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

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

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

В выпадающем списке в базовой версии нет ссылок. Для решения измените тип поля на "Выбор из справочника".

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

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

В лиде есть деталь. Деталь стандартная, при нажатии на "+" открывается карточка создания.
задача состоит в том, чтобы из детали можно было открыть карточку редактирования по ссылке,а не через выбор пункта "изменить". например, как сделано с деталью Контакты в контрагенте. Делаю по аналогии, но у меня не работает. также в детали выведено поле UsrName и при клике на него нужно открыть объект UsrStructure.

есть особенность -объект детали был создан через конфигурацию,а не через мастер разделов. но у него есть страница редактирования,которая настраивается через деталь.

пробовала и через linkClicked и через on[ColumnName]LinkClick. первый вообще не вызывается. Второй тоже, но для него я знаю почему - так как в Terrasoft.configuration.ModuleStructure нет моей сущности.
var entitySchemaConfig = Terrasoft.configuration.ModuleStructure[entitySchemaName];

подскажите, пожалуйста, как я могу реализовать эту задачу?

Нравится

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

"Zaitova Liubov" написал:подскажите, пожалуйста, как я могу реализовать эту задачу?

Можно поковыряться в GridUtilitiesV2, метод addColumnLink. Метод вызывается при формировании любого грида, ссылку можно сделать принудительно, для конкретной детали

"Варфоломеев Данила" написал:
Zaitova Liubov пишет:

подскажите, пожалуйста, как я могу реализовать эту задачу?

Можно поковыряться в GridUtilitiesV2, метод addColumnLink. Метод вызывается при формировании любого грида, ссылку можно сделать принудительно, для конкретной детали


я рассматривала метод addColumnLink. в нем есть следующая строка
var entitySchemaConfig = Terrasoft.configuration.ModuleStructure[entitySchemaName];
но моей сущности нет в этой коллекции Terrasoft.configuration.ModuleStructure, потому что я создавала ее через конфигурацию,а не через мастер.

"Zaitova Liubov" написал:var entitySchemaConfig = Terrasoft.configuration.ModuleStructure[entitySchemaName];

Шаг 1: Нафиг выкинуть все методы террасофта
Шаг 2: Костыли. Я к примеру хочу в детали адрес контрагента лепить ссылку на поле "адрес":

addColumnLink: function(item, column) {
	var columnPath = column.columnPath;
	var onColumnLinkClickName = "on" + columnPath + "LinkClick";
	var profileColumns = this.getProfileColumns();
	var profileColumn = profileColumns[columnPath];
	var isProfiledLinkColumn =
		profileColumn && (profileColumn.type === Terrasoft.GridCellType.LINK);
	var isLinkColumn = this.getIsLinkColumn(this.getGridEntitySchema(), column);
	if ((isProfiledLinkColumn || isLinkColumn) && !this.getIsEditable()) {
		var referenceSchemaName = column.referenceSchemaName;
		var schemaConfig = Terrasoft.configuration.ModuleStructure[referenceSchemaName];
		var scope = this;
		if (column.isLookup && schemaConfig) {
			item[onColumnLinkClickName] = function() {
				var record = this.get(columnPath);
				if (!record) {
					return "";
				}
				var recordId = record.value;
				if (!recordId) {
					return "";
				}
				return scope.createLink.call(this, referenceSchemaName, columnPath,
					record.displayValue, recordId);
			};
		} else {
			var columnIdName = item.primaryColumnName;
			var entitySchemaName = this.getGridEntitySchemaName();
			var entitySchemaConfig = Terrasoft.configuration.ModuleStructure[entitySchemaName];
			if (entitySchemaConfig) {
				item[onColumnLinkClickName] = function() {
					var recordId = this.get(columnIdName);
					if (!recordId) {
						return "";
					}
					var displayValue = this.get(columnPath);
					if (scope.Ext.isEmpty(displayValue)) {
						return "";
					}
					var link =
						LinkColumnHelper.createLink(entitySchemaName, columnPath, displayValue, recordId);
					return link || scope.createLink.call(this, entitySchemaName, columnPath,
						displayValue, recordId);
				};
			}
		}
	}
	/**КОСТЫЛИ**/
	if (columnPath === "Address") {
		var scope = this;
		var columnIdName = item.primaryColumnName;
		var entitySchemaName = this.getGridEntitySchemaName();
		item[onColumnLinkClickName] = function() {
			var recordId = item.get("Id");
			if (!recordId) {
				return "";
			}
			var displayValue = item.get("Address");
			if (scope.Ext.isEmpty(displayValue)) {
				return "";
			}
 
			var editPageName ="AccountAddressPageV2";
			var link = Terrasoft.workspaceBaseUrl + "/Nui/ViewModule.aspx#CardModuleV2/"+editPageName+"/edit/"+recordId;
			return {
				caption: displayValue,
				target: "_self",
				title: displayValue,
				url: link
			};
		};
	}
	if (Ext.isEmpty(item[onColumnLinkClickName])) {
		item[onColumnLinkClickName] = function() {
			return (item.getLinkColumnConfig ? item.getLinkColumnConfig(column) : null);
		};
	}

Шаг 3: Вставить в methods детали.
Результат:
зшс

В чём проблема, то?:smile:

"Варфоломеев Данила" написал:В чём проблема, то?


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

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

"Лапшин Павел Александрович" написал:Переход происходит, но при нажатии на странице "Закрыть" возврат на первую вкладку, а вызов происходит из второй.

Надо разбираться с HistoryState и браузерной строкой. Иногда при переходе по страницам bpm-ка не меняет путь и вот фиг знает, если честно, как система отреагирует на закрытие карточек(PushBackHistoryState событие). Надо тестить)

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

Попытка разобраться с штатной деталью "Связи" чтобы добавить туда новое, собственное поле, например в Активностях.
Расследование работы этой детали:
1) Было определено, что данная деталь работает со специализированными объектами (таблицами):
EntityConnection
в ней непосредственно содержатся записи, которые вкратце, описывают связь сущности c ее зависимостями представленными в виде реплики на некий ColumnUId
который в свою очередь представлен так же в SysEntitySchemaReference
более сложном объекте который в сути и описывает предположительно связи объектов через справочные поля, в частности:
ColumnUId - собственно поле для связи с EntityConnection, хотя в EntityConnection колонка не является ссылкой (FK) что весьма странно, в любом случае других упоминаний ColumnUId найти не удалось.
ColumnName - видимо имя колонки в целевом объекте с которым устанавливается связь
ColumnCaption - видимо заголовок который будет указан для связи в детали
ReferenceSchemaId - это Id из SysSchema, и судя из названия мы как раз тут указываем идентификатор схемы из которой брать поле указанное в ColumnName
SysSchemaId - это тоже Id из SysSchema, и судя по всему оно отражает всё таки к какой сущности принадлежит связь, в нашем случае - то же самое содержится и в самом EntityConnection, но данная таблица судя по всему используется в нескольких механизмах, в т.ч. по-моему и при "сложной настройке колонок" через связи.

2) Изучен исходный код детали и ее зависимостей в частности нас интересует схема EntityConnectionLinksUtilities, а именно вот этот фрагмент:
в котором esq-запросом получаются данные из вышеописанного объекта EntityConnection с некоторыми присоединениями, это так сказать "отправная точка", т.к. вся дальнейшая логика развивается на основе полученных данных.
Вот...
Устанавливаем 2 точки останова, собственно на сам вызов ESQ, чтобы посмотреть что он из себя представляет. Изучаем его и собственно вот его краткая полетная характеристика:

rootSchema: EntityConnection

В запрос добавлено 5-ть колонок:
  • Id
  • SysEntitySchemaUId
  • SysSchemaName, присоединяемая ESQ-query "[VwSysSchemaInWorkspace:UId:SysEntitySchemaUId].Name"
  • ColumnUId
  • Position

А так же мы имеем 2 фильтра:

  • this.Terrasoft.createColumnFilterWithParameter(
            this.Terrasoft.ComparisonType.EQUAL,
            "[VwSysSchemaInWorkspace:UId:SysEntitySchemaUId].Name",
            entitySchemaName
    );

    где например в случае с Активностями, entitySchemaName = "Activity"
  • this.Terrasoft.createColumnFilterWithParameter(
            this.Terrasoft.ComparisonType.EQUAL,
            "[VwSysSchemaInWorkspace:UId:SysEntitySchemaUId].SysWorkspace",
            this.Terrasoft.SysValue.CURRENT_WORKSPACE.value
    );

    не требует дополнительных пояснений

Встал вопрос:
В результирующем объекта такого вот ESQ-запроса, мы наблюдаем результаты вот с такой занимательной структурой

в которой однозначно содержатся данные, которые не запрашивались, по крайней мере явным образом через ESQ
Происхождение объекта ReferenceSchema
было обнаружено в некоем обработчике "createviewmodel"
(я так понимаю это механизм предварительной работы с выборкой до возвращения ее в коллбэк ESQ-запроса)

esq.on("createviewmodel", this.createEntityConnectionViewModel, this);

и вот здесь собственно дальнейшее изучение механизма работы обламывается, т.к. вызовы методов используемые здесь ведут преимущественно в all-combined.js который даже в Pretty print читается очень сложно.

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

В конечном итоге, чтобы расширить "Связи" своим объектом необходимо:
1) В таблице SysEntitySchemaReference обнаружить целевое справочное поле, т.е. поле в объекте с которым устанавливается связь, и там подглядеть его ColumUId.
[проще всего дать полю какое ни будь заведомо уникальное имя, найти, потом переименовать, но можно и отталкиваться в описках и от значения в колонке SysSchemaId это уникальный идентификатор объекта из SysSchema]
1) Добавить Вашу запись в EntityConnection (или у существующей подменить ColumUId, например для подменя связи Лидов(встроенных) на Лиды(кастомные))
для новой записи:
SysEntitySchemaUId - значение колонки UId из SysSchema для объекта для которого вы планируете установить связь.
ColumUId - значение из SysEntitySchemaReference полученное ранее, фактически это реплика на справочное поле в объекте.

Итоговый результат, в детали "Связи" выведенную на карточку схемы объекта указанного в SysEntitySchemaUId будет выведено соответствующее справочное поле этого объекта. А так же со "Связью" начинают работать все встроенные в типовую конфигурацию "механизмы", н/а виджеты "Связи" в миникарточках

PS:
1) Чтобы отключить "стоковую связь" - удаляем соответствующую запись из EntityConnection

Нравится

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

Есть ответы у меня :)

1. Добавить новую запись в таблицу EntityConnection
2. [SysEntitySchemaUId] = C449D832-A4CC-4B01-B9D5-8A12C42A9F89 - Uid схемы объекта ссылочного поля в SysSchema
3. [ColumnUId] - UID ссылочного поля данного объекта в метаданных активности

В личке готов подробно ответить

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

Вопрос следующий.
В Oauth2 если тип авторизации authorization code. Он позразумевает переход по внешней ссылке, разрешение прав для приложения на стороне сервиса и потом происходит переход на callback страницу с code параметром, после этого отправляется code на сервис и получаем заветный access_token.

Поэтому тут несколько вопросов
1) Как сделать callback_url на стороне bpm?
2) Как и куда записывать данные (скажем access_token)

И пара вопросов мимо кассы,
1) В документации очень много оперируеться зависимости модулей (первый параметр для define в js коде), если ли где-то список всех этих модулей и их методов (или все ViewModels реализуют одни и те же методы?)
2) Как получить public URL (или даже content) для attachment file (http://joxi.ru/EA4vGklIwqq0nm), ссылка которая указана там (в Web интерфейсе), являеться доступной только для авторизированого пользовталея который имеет к нему доступ
3) Где посмотреть реальные данные приложения (скажем у меня есть несколько вкладок и в каждой из них есть по 3 файла, я хочу посмотреть где-то данные по этим файлам, и хочу получить по ним info прямо в JS)

Нравится

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

Короче по поводу OAuth2 оказалось все просто, нужно создать C# файл через создание в пакете Исходного кода и вводим следующее

public class TestService
	{
		[OperationContract]
		[WebInvoke(Method = "GET", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
		public string callback(string data)
		{
			var request = HttpContext.Current.Request;
			using (var client = new WebClient())
			{
				var values = new NameValueCollection();
				values["grant_type"] = "authorization_code";
				values["code"] = request["code"];
				values["client_id"] = "CLIENT_ID";
				values["client_secret"] = "SECRET";
				values["redirect_uri"] = "https://SOME_DOMAIN.bpmonline.com/0/rest/TestService/callback";
 
				var response = client.UploadValues("ACCESS_TOKEN_RETRIEVE_DOMAIN", values);
				var responseString = Encoding.Default.GetString(response);
				return responseString;
			}
			return "Error";
		}
	}

На стороне сервиса где авторизируемся создаем приложение указываем https://SOME_DOMAIN.bpmonline.com/0/rest/TestService/callback как REDIRECT_URI и получаем то что и требовалось, после предоставления доступа к сервису переходим в BPM CRM в созданный клас, и видим ACCESS TOKEN информацию

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

1) "первый параметр для define в js коде"
Первый параметр в Define - это название модуля, по которому его потом можно загружать.
http://requirejs.org/docs/api.html#modulename

"если ли где-то список всех этих модулей и их методов"
Списка нету. Все клиентские схемы, добавленные в конфигурации,
объявляются с использованием Define.

"или все ViewModels реализуют одни и те же методы?"
Учитывая что ViewModels обычно используют "базовую" ViewModel,
то базовые методы в них одни и теже. Но также могут содержатся новые,
добавленные в расширяющей ViewModel.

2) Для получения прикрепленных файлов используется конфигурационный сервис FileService.
Пример:
http://bpmonline/0/rest/FileService/GetFile/e9eafee9-c4e4-4793-ad0a-003…
В нём используется userConnection текущего пользователя.
Исходя из этого - скачать файл у неавторизованного пользователя не получится,
даже если у него будет ссылка.

3) Не понял вопрос. Вкладки в браузере? Какие 3 файла? Какую инфу JS хотите видеть?

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

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

Версия 7.10.

Продолжаем постигать тайны разработки.

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

Есть некоторый контрол, занаследованный от GridLayout:

Ext.ns("Terrasoft");
/**
 * @class Terrasoft.controls.UsrTestSchedule
 */

Ext.define("Terrasoft.controls.UsrTestSchedule", {
        extend: "Terrasoft.GridLayout",
        alternateClassName: "Terrasoft.UsrTestSchedule",
});

Есть его генератор:

define("UsrTestScheduleGenerator", ["UsrTestScheduleGeneratorV2Resources", "terrasoft", "ext-base", "UsrTestSchedule"],
        function(resources, Terrasoft) {
                var UsrTestScheduleGenerator = Ext.define("Terrasoft.configuration.UsrTestScheduleGenerator", {
                        extend: "Terrasoft.ViewGenerator",
                        alternateClassName: "Terrasoft.UsrTestScheduleGenerator",
                       
                        item1: function(){
                                return Ext.create("Terrasoft.Label", {
                                                                        "className": "Terrasoft.Label",
                                                                        "itemType": Terrasoft.ViewItemType.LABEL,
                                                                        "caption": "A Panel",
                                                                        "visible": true
                                });
                        },
                       
                        generateUsrTestSchedule: function(config) {
                                var myItems = [
                                                {       "row": 0,
                                                        "rowSpan": 1,
                                                        "column": 0,
                                                        "colSpan": 12,
                                                        "item": this.item1
                                                },
                                                {       "row": 0,
                                                        "rowSpan": 1,
                                                        "column": 12,
                                                        "colSpan": 12,
                                                        "item": {
                                                                "className": "Terrasoft.Label",
                                                                "name": "label2",
                                                                "itemType": Terrasoft.ViewItemType.LABEL,
                                                                "caption": "A panel 2",
                                                                "visible": true,
                                                        }
                                                }
                                        ];
                               
                                var UsrTestScheduleConfig = {
                                        "className": "Terrasoft.UsrTestSchedule",
                                        "id" : "grid-layout-007",
                                        "selectors": { wrapEl: "#grid-layout-007"},
                                        "items": myItems,
                                        "type": "tiled",
                                };
                               
                                return UsrTestScheduleConfig;
                        }
                });

                return Ext.create(UsrTestScheduleGenerator);
});

При создании ориентировались на документацию: https://academy.terrasoft.ru/jscoresdk/#!/api/Terrasoft.controls.GridLayout
и инструкцию https://community.terrasoft.ru/forum/topic/25285#comment-67717
По сути требуется вывести некоторую информацию (при этом для вывода в силу специфика используются собственные контролы, сейчас не о них) внутри набора из грид блоков.

На практике с помощью генератора, приведённого выше, в код добавляются грид блоки в полном соответствии с массивом myItems (см. скриншот), но без внутреннего содержимого, того, что по документации описывается как item: {}. Для примера решили там вывести просто текст внутри контрола Label.

Как правильно в этом случае подключить label и вывести текст? То, что item1 вынесена в функцию - одна из попыток.. не помогло.

Нравится

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

"Смородинов Денис" написал:что по документации описывается как item: {}.

Очень странно. Я бы попробовал как-то так генерировать:

 var myItems = [
	{       
		"layout": {
			"row": 0,
			"rowSpan": 1,
			"column": 0,
			"colSpan": 12
		},
		"className": "Terrasoft.Label",
		"itemType": Terrasoft.ViewItemType.LABEL,
		"caption": "Label1",
		"visible": true
	},
	{       
		"layout": {
			"row": 0,
			"rowSpan": 1,
			"column": 12,
			"colSpan": 12
		},
		"className": "Terrasoft.Label",
		"itemType": Terrasoft.ViewItemType.LABEL,
		"caption": "Label2",
		"visible": true
	}
];

Данила, так не съедает:

user: user/7f3b869f-34f3-4f20-ab4d-7480a5fdf647
file: undefined
line: undefined
column: undefined
message: Cannot read property 'toString' of undefined
date: Mon Jun 12 2017 16:35:57 GMT+0300 (RTZ 2 (зима))
moduleId: SectionModuleV2_UsrSchedulerTest1Section
moduleName: SectionModuleV2

"Иван Тюряков" написал:Данила, так не съедает:

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

generateControl: function(config) {
	debugger;
	var items=[{
		"colSpan": 12,
		"column": 0,
		"row": 0,
		"item": {
			className: "Terrasoft.Container",
			id: "Button-Container",
			items: [{
				className: "Terrasoft.Button",
				style: "blue",
				caption: "TOAST",
				click: {bindTo: config.ButtonClick},
				visible: true,
				enabled: true,
				safeBind: true
			}]
		}
	}, 
	{
		"colSpan": 12,
		"column": 12,
		"row": 0,
		"item": {
			className: "Terrasoft.Container",
			id: "Label-Container",
			items: [{
				className: "Terrasoft.Label",
				caption: config.LabelCaption
			}]
		}
	}];
	var CTRLConfig = {
			"className": "Terrasoft.TmGridControl",
			"id" : "grid-layout-test",
			"selectors": { wrapEl: "#grid-layout-test"},
			"items": items,
			"layout": config.layout
		};
	return CTRLConfig;
}

В странице описываю в diff:

{
	"operation": "insert",
	"parentName": "ContactGeneralInfoBlock",
	"propertyName": "items",
	"name": "MyControl",
	"values": {
		"layout": {
			"colSpan": 12,
			"column": 0,
			"row": 2
		},
		"ButtonClick": "showTestMessage",
		"LabelCaption": "ТЕСТОВЫЙ LABEL",
		"generator": "TmGridControlGenerator.generateControl",
		"visible": true
	}
}

showTestMessage - пустой тестовый метод с дебагером.
В итоге всё нормально генерируется. У меня когнитивный диссонанс: ну вот почему нельзя в items запихивать одну и ту же структуру? Нафига они разворачивают всё в вид:

		"colSpan": 12,
		"column": 0,
		"row": 0,
		"item": {}

????? Хотя в тот же самый контейнер items надо складировать в ином виде. Блин. Ну надо же так придумать.

Данила, всё получилось тоже! Спасибо!!!

Возник следующий вопрос.

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

То есть на странице что-то такого вида в диффе:

{
				"operation": "insert",
				"parentName": "IvanContainer",
				"name": "UsrTestSchedule",
				"propertyName": "items",
				"values": {
					"className": "Terrasoft.UsrTestSchedule",
					"generator": "UsrTestScheduleGenerator.generateControl",
					"items": {"bindTo": "contactsItems"},
					"visible": true
				}
			},

В атрибутах:

"contactsItems":{ 
				dataValueType: Terrasoft.DataValueType.COLLECTION,
				value: this.Ext.create("Terrasoft.Collection"),
				type: Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN
			},

И в методах:

var esq = this.Ext.create("Terrasoft.EntitySchemaQuery", {
					rootSchemaName: "Contact"
				});
				esq.addColumn("Id");
				esq.addColumn("Name");
 
				esq.getEntityCollection(function (result) {
					if (!result.success) {
						console.log("UsrTestScheduleGenerator: wrapContacts: ESQ error -" + result);
						return;
					}
 
					this.set("contactsItems", result.collection);
}, this);

В генераторе соответственно:

generateControl: function(config) {
 
				var UsrTestScheduleConfig = {
					className: "Terrasoft.UsrTestSchedule",
					id: "grid-layout-007",
					selectors: { wrapEl: "#grid-layout-007"},
					items: config.items
				};
 
				return UsrTestScheduleConfig;
			}, 

В этом случае ничего не происходит. Подозреваю, что массив нельзя засунуть в виртуальную колонку. Так ли это?

"Смородинов Денис" написал:А возможно ли динамическое получение данных, и передача их в свой контрол?

Это уже что-то типа ContainerList. Там есть коллекция, которая динамически наполняется и вызывается метод onGetItemConfig при добавлении ряда.
Соответственно возможно сделать, но надо выковыривать методы/реализацию из того, что уже есть)

А я правильно понимаю, что фильтры в разделах работают также?

Если к примеру это всё подставляется на страницу раздела.

"Варфоломеев Данила" написал:Это уже что-то типа ContainerList. Там есть коллекция, которая динамически наполняется и вызывается метод onGetItemConfig при добавлении ряда.
Соответственно возможно сделать, но надо выковыривать методы/реализацию из того, что уже есть)

Данила, вопрос Дениса по сути про механизм bindTo. Строки нормально биндятся и передаются в контрол, а вот с коллекциями проблема:

user: user/7f3b869f-14f3-4d20-ab4d-7480a5fdf647
 file: undefined
 line: undefined
 column: undefined
 message: Cannot read property 'changeMethod' of undefined 
 date: Thu Jun 15 2017 17:48:10 GMT+0300 (RTZ 2 (зима))
 moduleId: SectionModuleV2_UsrSchedulerTest1Section
 moduleName: SectionModuleV2

Я читал где то про ошибку 'changeMethod', что нужно создавать bindConfig и т.п., но не помню даже где видел. Знаете что нибудь про это?

Строка тоже нет. По сути в items отправляется нечто вида:

{bindTo:"contactsItems"}

в виде объекта. И всё.

Так что не биндить, а искать другие методы надо.

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

Коллеги, добрый день.
Порылся в форуме и не нашел решения, пишу в отдельной темой:
Есть bpmonline 7.10
Есть webitel
Есть сотрудники с мобильными телефонами (как андроид так и iphone, оператор Билайн)

Как настроить систему что бы все звонки писались и были видны в bpmonline?
заранее признателен за советы или ссылку на тему в форуме.

Нравится

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

Если звонки проходят через bpm(т.е у вас настроена телефония webitel, закуплены лицензии), то они и так пишутся на вкладку "Звонки" в контакте или контрагенте.

А если не проходят через Webitel, то в мобильном приложении при звонке через него есть возможность зафиксировать результат звонка. По умолчанию только для рабочего места Default.

"Варфоломеев Данила" написал:Если звонки проходят через bpm(т.е у вас настроена телефония webitel, закуплены лицензии)

А как звонки с мобильного и на мобильный пройдут через bpm?

"Варфоломеев Данила" написал:

Если звонки проходят через bpm(т.е у вас настроена телефония webitel, закуплены лицензии), то они и так пишутся на вкладку "Звонки" в контакте или контрагенте.


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

"Варфоломеев Данила" написал:

Если звонки проходят через bpm(т.е у вас настроена телефония webitel, закуплены лицензии), то они и так пишутся на вкладку "Звонки" в контакте или контрагенте.

Уточняю, в данный момент телефония настроена через ip номер манго, через bpm, но мобильные телефоны в этой схеме не участвуют. Точнее участвуют только при настроенной переадресации звонков с ip телефонов на мобильные. В обратную сторону - нет.

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

Я слышал, что у некоторых операторов в России есть такая услуга - дублирование звонка на SIP, то есть, факт и запись разговора будут идти параллельно разговору по мобильному.
Думаю, что точнее вам помогут с этим специалисты из Webitel - они знают все нюансы

"Владимир Соколов" написал:

Я слышал, что у некоторых операторов в России есть такая услуга - дублирование звонка на SIP, то есть, факт и запись разговора будут идти параллельно разговору по мобильному.

Думаю, что точнее вам помогут с этим специалисты из Webitel - они знают все нюансы


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

"Денис Королев" написал:В том то и дело что мобильные звонки не проходят через bpm

Тогда надо уточнять у Webitel, возможно ли как-то оповестить внешнюю систему после совершения вызова(например comagic отправляет http-запрос по указаному адресу с информацией о совершенном звонке).

"Варфоломеев Данила" написал:

Тогда надо уточнять у Webitel, возможно ли как-то оповестить внешнюю систему после совершения вызова(например comagic отправляет http-запрос по указаному адресу с информацией о совершенном звонке).

У webitel есть возможность через WebHooks отправлять http-запросы на события сервера и телефонии.
Здесь задача об отображение звонка в bpm'online и сотрудник использует мобильный телефон. Если сотрудник будет звонить через любой SIP клиент, то такие звонки не проблема отобразить в bpm'online, так как они проходят через Webitel. Но, если сотрудник будет звонить напрямую со своего мобильного номера, то мы это никак не увидем в webitel.

Интересно, за 4 года удалось найти решение этого важного вопроса?

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

Как и ранее, Вы можете выполнять набор номера с мобильного приложения нажатием на изображение  btn_com_workflow_card_call.png, но все звонки осуществляются за счет мобильного оператора(то есть, исходящий звонок будет осуществлен напрямую с локального устройства).



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



Пожелание по реализации зафиксировано и находится на рассмотрении. 

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

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

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

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

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


Нравится

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

Светлана, такая ситуация возникает, если основной записи может соответствовать несколько записей в таблице детали.
В таком случае вывести значение колонки детали в реестре основной записи невозможно, исключение составляют только колонки, по которым можно определить минимальное, максимальное и среднее значение (это даты, целочисленные и дробные значения), а также количество записей детали, связанных с конкретной записью основного раздела.
Однако, в основном разделе по данным детали можно построить exists или not exists фильтры. Более подробно о построении таких фильтров можно почитать на Академии по ссылке https://academy.terrasoft.ru/documents/sales-enterprise/7-9/rasshirenny…

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

Добрый день!

Скажите пожалуйста, как можно организовать список контактов на обзвон(в котором будет видно кому дозвонились, кому нет, кому еще не звонили) и также добавлять комментарии к звонкам. На форму прочитала, что можно делать это в рамках бизнес процесса. Меня интересует как это сделать в рамках маркетинговой компании или в рамках маркетингового мероприятия.

Заранее спасибо за ответ !

Нравится

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

Добрый день. Оксана!

Сейчас пока нельзя связать кампанию с таким объектом как Звонки.

Мы работаем над большим обновлением для кампаний, которые будуть работать по принципу бизнес процессов! Планируем запустить в работу с релизом 7.10.3

Я создам дополнительное пожелание, касательно добавления функциональности звонков в кампаниях.

Приятной работы.

Хорошо , спасибо за ответ!

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

Заранее спасибо за ответ!

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

Настроить обзвон контактов или запланировать выполнение звонка в рамках процесса/кейса не получится.
В рамках первого процесса можно настроить создание активностей с типом “Звонок” для всех целевых контактов. Таким образом для пользователей будет создано напоминание кому необходимо позвонить.
1-ый процесс будет состоять из одного элемента:
- добавить данные в объект [Активности] в режиме “Добавить результат выборки” по объекту [Контакт] (в фильтре указать по каким контактам необходимо выполнить обзовон)

В рамках второго процесса можно настроить вашу бизнес-логику в зависимости от результата активности (созданной первым процессом):
1. Стартовый сигнал по изменению активности (ожидать изменения поля Состояние), где Тип = Звонок
2. Читать данные в активности, где Id = Пункт 1. Id
Далее в зависимости от результата активности – создавать новую или устанавливать комментарий в контакте.

Перед созданием процессов рекомендую ознакомится с документацией, создать несколько простых процессов и проверить результат их выполнения.
Тут вы найдете подробное описание элементов БП: https://academy.terrasoft.ru/documents/technic-bpms/7-10/obzor-funkcion…

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