По результатам голосования Сообщества Creatio команда разработчиков спланировала сроки реализации улучшений в инструментах фильтрации продуктов Creatio. Рада вам сообщить, что в виду вашего вовлечения и активного участия в голосовании, поставки абсолютного большинства фич запланированы уже на третий и четвертый квартал текущего года. Ура! Команда пока ищет техническое решение для задачи №3 «Возможность отфильтровать записи из одной или нескольких динамических групп». Возможность и сроки поставки мы анонсируем немного позже.

Спасибо всем, кто принял участие в голосовании. Вы всегда можете поделиться вашими идеями по улучшению продуктов Creatio в разделе «Идеи» на площадке Creatio Community. Команда разработки продуктов обязательно их рассмотрит. Читайте идеи других участников сообщества и участвуйте в обсуждениях.

Вот рейтинг улучшений инструментов фильтрации в продуктах Creatio по версии Сообщества:

 

Нравится

Поделиться

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

Добрый день!

Возникла необходимость загрузки не всей входящей почты из почтового ящика MS Outlook, а по условию (фильтру), например, только от определённых отправителей или наоборот исключить загрузку почты от списка отправителей.

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

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

Нравится

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

Не совсем понятно, что значит «почты из почтового ящика MS Outlook». Это может быть или корпоративный Exchange-сервер Вашей организации, или веб-почта Outlook.com (бывший Hotmail).

Только в старых версиях системы: 3.Х, 5.Х и первые версии 7.Х интегрировались с почтовой программой на локальном компьютере, а сейчас 7.Х работает с сервером напрямую по протоколам IMAP/SMTP или MS Exchange.

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

Как выбрать нужную папку, описано в статье:

chapter_imap_synchronization_yahoo_folders_select.png

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

Зверев Александр,

 Добрый день! Спасибо за ответ!

Поясню ситуацию: есть корпоративный почтовый сервер MS Exchange, на котором хранится почта пользователей. В этой почте очень много лишних писем, которые нет смысла загружать в CRM, и соответственно есть переписка с клиентами, которую хотелось бы загружать в CRM.

На сколько я знаю, правила MS Outlook, которые пользователь создает для распределениям почты по папкам, работают только на стороне клиента, т.е. если мой Outlook не запущен, то все письма будут скапливаться в папке "входящие", до тех пор пока не запустится клиент Outlook и не отработаются правила.

Вручную переносить почту по папкам нет никакой возможно, это нужно автоматизировать.

Соответственно вопрос: можно ли как-то модифицировать стандартную процедуру загрузки почты, чтоб была возможность настраивать различные фильтры, например, загружать только ту почту, чьи адреса совпадают с адресами клиентов в базе CRM.. или просто загружать только почту с адресов, которые хранятся в некотором списке.

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

Вот и вот информация, как настраиваются правила на уровне сервера Exchange:

You can use mail flow rules (also known as transport rules) to identify and take action on messages that flow through the transport pipeline in your Exchange 2016 and Exchange 2019 organization. Mail flow rules are similar to the Inbox rules that are available in Outlook and Outlook on the web (formerly known as Outlook Web App). The main difference is mail flow rules take action on messages while they're in transit, and not after the message is delivered to the mailbox. Mail flow rules contain a richer set of conditions, exceptions, and actions, which provides you with the flexibility to implement many types of messaging policies.

По поводу возможности доработок, нужно изучать код в схеме процесса LoadExchangeEmailsProcess и вызываемой из неё логике схемы ExchangeUtility.

Зверев Александр,

Зверев Александр пишет:
Вот и вот информация, как настраиваются правила на уровне сервера Exchange:

Спасибо за информацию, будем изучать!

 

Зверев Александр пишет:
По поводу возможности доработок, нужно изучать код в схеме процесса LoadExchangeEmailsProcess и вызываемой из неё логике схемы ExchangeUtility.

Т.е. доработать эти процессы можно самостоятельно или с помощью сторонних разработчиков (партнёров террасофт)? Эти процессе не закрыты от модификации?

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

Учтите, что замещать можно не всё (например, модули специально запрещено), да и часть логики сделана вообще в ядре и недоступна для просмотра и правок, судя по:

using Terrasoft.ExchangeApi.Interfaces;
using Terrasoft.Sync.Exchange;

В конфигурации этих схем нет.

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

Всем доброго времени суток!
Подскажите, есть ли возможность определить роли текущего пользователя в мобильном приложении? Если делать запрос то выдает ошибку - Uncaught Error: [ERROR][Ext.data.Store#setModel] Model with name "SysUserInRole" does not exist.
В зависимости от вхождения в роль нужно делать фильтрацию в справочном поле.
Кто нибудь сталкивался с похожими случаями?
Заранее благодарен!

Нравится

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

Мобильное приложение не загрузило метаданные модели SysUserInRole.

Добавьте в манифест вот такую секцию:

ApplicationRequiredModels: ["SysUserInRole"]

Кривонос Максим,

 Благодарю, сработало.

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

Добрый день!

Внутри CRM есть большое число позиций изделий из сплавов металлов. В сплав может входить от двух до четырех металлов.  

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

Есть ли способ найти только те позиции, где требуемый металл находится на первом месте?
(Например: АРбуз, АРка, АРгон. Но не: бАРжа, кАРтон, сАРай) 

Нравится

5 комментариев
Лучший ответ

Вариантов много я бы посмотрел в сторону

1) Искать начинающиеся на #Арб

2) или изменить структуру хранения данных о составе металла

3) а лучше всего, создать свой фильтр в котором вы обработаете вашу строку с указанием сплава. (Например разобьете в массив со списком металлов и его отфильтруете)

В расширенных фильтрах

 

Варфоломеев Данила,

Спасибо за совет, но строка с указанием сплава имеет вид - #Наименование сплава# (#Металл1##Металл2##Металл3##Металл4#) Например: Мельхиор (CuNi)

Вариантов много я бы посмотрел в сторону

1) Искать начинающиеся на #Арб

2) или изменить структуру хранения данных о составе металла

3) а лучше всего, создать свой фильтр в котором вы обработаете вашу строку с указанием сплава. (Например разобьете в массив со списком металлов и его отфильтруете)

А что мешает искать по «(Cu»?

Зверев Александр,

Спасибо за совет, хорошая идея!

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

Добрый день!

Еще одна идея для маркетплейса: Справочник фильтров применяемых к разделам системы для ролей/пользователей.

Список полей:

Раздел/Деталь/Справочник (короче таблица в любом ее проявлении);

Пользователь/Роль (SysAdminUnit)

Фильтр (фильтр, со всеми возможностями как в дин.группе).

 

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

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

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

Передали данное пожелание команде разработки для анализа возможности внедрения такой возможности в будущих версиях продукта.

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

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

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


 

Нравится

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

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

Михаил, не уверен, что получится именно то, что хочет автор. У Вас найдёт где есть или тот, или тот тип адреса.

Лучше так:

 

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

Хочу дополнительно по определенным сложным условиям фильтровать Результат в активности.

Единственным способом мне видится lookupListConfig filters. 

Вопрос - как корректно вызвать родительские фильтры, чтобы не копипастить их в свой код?

Нравится

1 комментарий
Лучший ответ

Все зависит от того, каким образом реализованы родительские фильтры.

Не так давно уже обсуждали подобную тему здесь.

Если бы родительские фильтры были вынесены в отдельный метод, тогда можно было бы просто Ваш метод унаследовать от родительского и в нём вызвать callParent.

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

Все зависит от того, каким образом реализованы родительские фильтры.

Не так давно уже обсуждали подобную тему здесь.

Если бы родительские фильтры были вынесены в отдельный метод, тогда можно было бы просто Ваш метод унаследовать от родительского и в нём вызвать callParent.

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

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

Здравствуйте. *bpm'sales
Есть ли возможность реализовать на практике следующее:
1. В форме фильтрации отчета, раздела аналитика, сделать поле выбора значений из справочника который выглядит следующим образом - 

Но при открытии окна выбора открывалось окно Множественного выбора, например как тут
2. Передавать Id выбранных записей в отчет.

Есть идеи?

Нравится

5 комментариев
Лучший ответ

Доброе утро. На сколько мне известно в базовой логике данная задача не реализована. Вам надо посмотреть в сторону замещения и расширения модуля ReportFilterModule. На данный момент реализована передача фильтра с помощью фильтрации записей в разделе.

var config = [

          {

                name: 'FormingMethod',

                dataValueType: 'FormingMethod'

            }

]

Доброе утро. На сколько мне известно в базовой логике данная задача не реализована. Вам надо посмотреть в сторону замещения и расширения модуля ReportFilterModule. На данный момент реализована передача фильтра с помощью фильтрации записей в разделе.

var config = [

          {

                name: 'FormingMethod',

                dataValueType: 'FormingMethod'

            }

]

Солонко Олег Иванович,

Можете детальней описать что нужно менять? Схему карточки выбора записи из справочника?

Фильтрация по множественному выбору записей в разделе — это то, что есть сейчас. Подробнее описывал в соседней теме.

Зверев Александр,
 

создание раздела под 1 отчет, это не подходит. Было бы неплохо схему фильтров подредактировать, но мало знаний что бы туда тянуть руки.

Как вариант, можно смотреть на создание карточки параметров отчёта в интерфейсе 5.Х. Там включение множественного выбора включатся одной галочкой. Но тогда нужно будет разбираться, как данные из 5.Х-карточки передаются в отчёт.

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

Вопрос

Можно ли, работая в коммуникационной панели, настроить фильтр по входящим, обработанным письмам за определенную дату?

Ответ

В приложении не реализованы массовые действия с письмами в коммуникационной панели. Как обходное решение, можно создать справочник на основании объекта "Activity" и уже в нём настроить необходимый фильтр.

Нравится

Поделиться

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

Добрый день,

Возможно ли отфильтровать справочное поле внутри модального окна? Я попробовал обычным путем через атрибуты, но это не сработало, бпм даже не зашла в реализацию "lookupListConfig". В справочнике просто отображались абсолютно все значения

 

После решил попробовать заполнить справочник вручную нужными значениями

//attributes
"RIBDocType": {
    "dataValueType": Terrasoft.DataValueType.ENUM,
    "type": Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
    "caption": "RIBDocType"
},
"documentTypeList": {
    "dataValueType": Terrasoft.DataValueType.ENUM,
    "type": Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
    "isCollection": true
}

//diff
{
	"operation": "insert",
	"parentName": "Header1",
	"propertyName": "items",
	"name": "RIBDocType",
	"values": {
		"bindTo": "RIBDocType",
		"caption": "Тип документа",
		"classes": {"wrapperClass": ["base-edit"]},
		"layout": {"column": 0, "row": 3, "colSpan": 24},
		"textSize": "Default",
		"contentType": Terrasoft.ContentType.ENUM,
		"labelConfig": {
			"visible": true
		},
		"controlConfig": {
			"className": "Terrasoft.ComboBoxEdit",
			"list": {
				"bindTo": "documentTypeList"
			},
			"change": {
				"bindTo": "onMyValueChange"
			},
			"prepareList": {
				"bindTo": "prepareDocumentTypeList"
			}
		}
	},
	"index": 3
}

//methods

onRender: function() {
	if (!this.get("documentTypeList")) {
		this.set("documentTypeList", this.Ext.create("Terrasoft.Collection"));
	}
	
},

prepareDocumentTypeList: function(filter, list) {
	if (list === null) {
		return;
	}
	list.clear();
	var columns = {};
	var value1 = {
		displayValue: "Type1",
		value: "e8670398-603b-43ca-820d-03e5b03fc275"
	};
	var value2 = {
		displayValue: "Type2",
		value: "14fcef3a-7d9e-4737-810f-52d57db3673a"
	};
	var value3 = {
		displayValue: "Type3",
		value: "672606f8-da25-40bd-a4ef-95c958331743"
	};
	columns[1] = value1;
	columns[2] = value2;
	columns[3] = value3;
	list.loadAll(columns);
	console.log(list);
},

onMyValueChange: function(val) {
	if (val && val.displayValue) {
		console.log("you pick: ", val.displayValue);
	}
},

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

 

Нравится

4 комментария
Лучший ответ

Сериков Асхат Кайратович,

Вот, например, код страницы с проекта. Если в attributes добавить lookupListConfig для поля Contact, всё подтянется

/*jshint ignore: start*/
define("UsrSchema", [],
	function() {
		return {
			mixins: {},
			messages: {},
			attributes: {},
			details: {},
			diff: /**SCHEMA_DIFF*/[
				{
					"operation": "insert",
					"name": "mainBoxContainer",
					"values": {
						"id": "mainBoxContainer",
						"itemType": Terrasoft.ViewItemType.CONTAINER,
						"items": []
					}
				},
				{
					"operation": "insert",
					"name": "mainBoxContainerGrid",
					"parentName": "mainBoxContainer",
					"propertyName": "items",
					"values": {
						"itemType": Terrasoft.ViewItemType.GRID_LAYOUT,
						"items": []
					}
				},
				{
					"operation": "insert",
					"parentName": "mainBoxContainerGrid",
					"propertyName": "items",
					"name": "Contact",
					"values": {
						"bindTo": "Contact",
						"caption": "Контакт",
						"contentType": Terrasoft.ContentType.ENUM,
						"layout": {
							"column": 0,
							"row": 0,
							"colSpan": 24
						}
					},
				}
			]/**SCHEMA_DIFF*/,
			methods: {
				init: function() {
					this.callParent(arguments);
				},
 
				getLookupQuery: function(filter, column) {
					var esq = this.callParent(arguments);
					var lookupListConfig = this.getLookupListConfig(column);
					if (lookupListConfig) {
						this.Terrasoft.each(lookupListConfig.columns, function(column) {
							if (!esq.columns.contains(column)) {
								esq.addColumn(column);
							}
						}, this);
					}
 
					var schemaColumn = this.getColumnByName(column);
					if (schemaColumn.lookupListConfig && schemaColumn.lookupListConfig.filter) {
						esq.filters.addItem(schemaColumn.lookupListConfig.filter());
					}
 
					return esq;
				},
				getLookupListConfig: function(columnName) {
					var schemaColumn = this.getColumnByName(columnName);
					if (!schemaColumn) {
						return null;
					}
					var lookupListConfig = schemaColumn.lookupListConfig;
					if (!lookupListConfig) {
						return null;
					}
					var excludedProperty = ["filters", "filter"];
					var config = {};
					this.Terrasoft.each(lookupListConfig, function(property, propertyName) {
						if (excludedProperty.indexOf(propertyName) === -1) {
							config[propertyName] = property;
						}
					});
					return config;
				}
			}
		};
	});
/*jshint ignore: end*/

 

1) Я бы попробовал 

columns[value1.value] = value1;
columns[value2.value] = value2;
columns[value3.value] = value3;

+ в каждом объекте продублировал 

var value1 = {
	displayValue: "Type1",
        name: "Type1",
	value: "e8670398-603b-43ca-820d-03e5b03fc275"
};

чисто на всякий случай

2) Если это своё модальное окно, не унаследованное от basePage, то придётся копировать логику из getLookupQuery (BasePageV2). Там как раз таки и идёт перебор аттрибутов на фильтры, доп колонки и т.п.

Варфоломеев Данила,

Спасибо, да не наследованное, пойду пробовать 

Сериков Асхат Кайратович,

Вот, например, код страницы с проекта. Если в attributes добавить lookupListConfig для поля Contact, всё подтянется

/*jshint ignore: start*/
define("UsrSchema", [],
	function() {
		return {
			mixins: {},
			messages: {},
			attributes: {},
			details: {},
			diff: /**SCHEMA_DIFF*/[
				{
					"operation": "insert",
					"name": "mainBoxContainer",
					"values": {
						"id": "mainBoxContainer",
						"itemType": Terrasoft.ViewItemType.CONTAINER,
						"items": []
					}
				},
				{
					"operation": "insert",
					"name": "mainBoxContainerGrid",
					"parentName": "mainBoxContainer",
					"propertyName": "items",
					"values": {
						"itemType": Terrasoft.ViewItemType.GRID_LAYOUT,
						"items": []
					}
				},
				{
					"operation": "insert",
					"parentName": "mainBoxContainerGrid",
					"propertyName": "items",
					"name": "Contact",
					"values": {
						"bindTo": "Contact",
						"caption": "Контакт",
						"contentType": Terrasoft.ContentType.ENUM,
						"layout": {
							"column": 0,
							"row": 0,
							"colSpan": 24
						}
					},
				}
			]/**SCHEMA_DIFF*/,
			methods: {
				init: function() {
					this.callParent(arguments);
				},
 
				getLookupQuery: function(filter, column) {
					var esq = this.callParent(arguments);
					var lookupListConfig = this.getLookupListConfig(column);
					if (lookupListConfig) {
						this.Terrasoft.each(lookupListConfig.columns, function(column) {
							if (!esq.columns.contains(column)) {
								esq.addColumn(column);
							}
						}, this);
					}
 
					var schemaColumn = this.getColumnByName(column);
					if (schemaColumn.lookupListConfig && schemaColumn.lookupListConfig.filter) {
						esq.filters.addItem(schemaColumn.lookupListConfig.filter());
					}
 
					return esq;
				},
				getLookupListConfig: function(columnName) {
					var schemaColumn = this.getColumnByName(columnName);
					if (!schemaColumn) {
						return null;
					}
					var lookupListConfig = schemaColumn.lookupListConfig;
					if (!lookupListConfig) {
						return null;
					}
					var excludedProperty = ["filters", "filter"];
					var config = {};
					this.Terrasoft.each(lookupListConfig, function(property, propertyName) {
						if (excludedProperty.indexOf(propertyName) === -1) {
							config[propertyName] = property;
						}
					});
					return config;
				}
			}
		};
	});
/*jshint ignore: end*/

 

Варфоломеев Данила,

Спасибо

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