Вопрос

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

В разделе создал пользовательские фильтры Улица, Дом , Квартира. Значения в фильтре Дом зависят от Улицы, а значения в фильтре Квартира от значения Дом.

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

Как реализовать фильтрацию выпадающего списка в разделе?

Код схемы раздела:

define("VcApartments1Section", ["BaseFiltersGenerateModule", "css!VcMyFilterStyle"], 
function(BaseFiltersGenerateModule) {
	return {
		entitySchemaName: "VcApartments",
		details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
		diff: /**SCHEMA_DIFF*/[
			{
				"operation": "insert",
				"name": "MyFilterGroupContainer",
				"parentName": "LeftGridUtilsContainer",
				"propertyName": "items",
				"index": 0,
				"values": {
					"id": "MyFilterGroupContainer",
					"itemType": this.Terrasoft.ViewItemType.CONTAINER,
					"items": []
				}
			},
			{
				"operation": "insert",
				"name": "MyFilterContainer",
				"parentName": "MyFilterGroupContainer",
				"propertyName": "items",
				"index": 0,
				"values": {
					"id": "MyFilterContainer",
					"itemType": this.Terrasoft.ViewItemType.CONTAINER,
					"items": []
				}
			},
			{
				"operation": "insert",
				"parentName": "MyFilterContainer",
				"propertyName": "items",
				"name": "VcStreetFilter",
				"values": {
					"bindTo": "VcStreetFilter",
					"caption": "Улица"
				}
			},
			{
				"operation": "insert",
				"name": "MyFilterContainer2",
				"parentName": "MyFilterGroupContainer",
				"propertyName": "items",
				"index": 1,
				"values": {
					"id": "MyFilterContainer2",
					"itemType": this.Terrasoft.ViewItemType.CONTAINER,
					"items": []
				}
			},
				{
				"operation": "insert",
				"parentName": "MyFilterContainer2",
				"propertyName": "items",
				"name": "VcHouseFilter",
				"values": {
					"bindTo": "VcHouseFilter",
					"caption": "Дом"
					// "controlConfig": {
					// 	"prepareList": {
	    //                         "bindTo": "VcHouseFilter"
	    //                     }
					// // "contentType": Terrasoft.ContentType.ENUM
					// }
				}
			},
			{
				"operation": "insert",
				"name": "MyFilterContainer3",
				"parentName": "MyFilterGroupContainer",
				"propertyName": "items",
				"index": 2,
				"values": {
					"id": "MyFilterContainer3",
					"itemType": this.Terrasoft.ViewItemType.CONTAINER,
					"items": []
				}
			},
			{
				"operation": "insert",
				"parentName": "MyFilterContainer3",
				"propertyName": "items",
				"name": "VcNameFilter",
				"values": {
					"bindTo": "VcNameFilter",
					"caption": "Квартира"
				}
			}
			]/**SCHEMA_DIFF*/,
		attributes: {
			"VcStreetFilter": {
				"dataValueType": Terrasoft.DataValueType.LOOKUP,
				"type": Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
				isLookup: true,
				caption: "VcStreet",
				referenceSchemaName: "VcStreet"
			},
			"VcHouseFilter": {
				"dataValueType": Terrasoft.DataValueType.LOOKUP,
				"lookupListConfig": {
					// Массив фильтров, применяемых к запросу для формирования данных поля-справочника.
					"filters": [
						function() {
							var filterGroup = Ext.create("Terrasoft.FilterGroup");
							var VcStreetFilter = this.get("VcStreetFilter");
							if (VcStreetFilter && VcStreetFilter.value) {
							filterGroup.add("VcStreetFilter",Terrasoft.createColumnFilterWithParameter
							(Terrasoft.ComparisonType.EQUAL, "[VcHouses:Id].VcStreet", VcStreetFilter.value));
							} else {
								filterGroup.removeByKey("VcStreetFilter");
							}
							return filterGroup;
						}
					]
				},
				"type": Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
				isLookup: true,
				caption: "VcHouse",
				referenceSchemaName: "VcHouses"
			},
			"VcNameFilter": {
				"dataValueType": Terrasoft.DataValueType.LOOKUP,
				"lookupListConfig": {
					// Массив фильтров, применяемых к запросу для формирования данных поля-справочника.
					"filters": [
						function() {
							var filterGroup = Ext.create("Terrasoft.FilterGroup");
							var VcHouseFilter = this.get("VcHouseFilter");
							if (VcHouseFilter && VcHouseFilter.value) {
							filterGroup.add("VcHouseFilter",Terrasoft.createColumnFilterWithParameter
							(Terrasoft.ComparisonType.EQUAL, "[VcApartments:Id].VcHouse", VcHouseFilter.value));
							} else {
								filterGroup.removeByKey("VcHouseFilter");
							}
							return filterGroup;
 
						}
					]
				},
				"type": Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
				isLookup: true,
				caption: "VcName",
				referenceSchemaName: "VcApartments"
			}
		},
		mixins: {
			LookupQuickAddMixin: "Terrasoft.LookupQuickAddMixin"
		},
		methods: {
			onLookupChange: function(newValue, columnName) {
				this.callParent(arguments);
				if (columnName === "VcStreetFilter") {
					this.set("VcStreetFilter", newValue);
					this.onVcStreetFilterChanged();
				}
				if (columnName === "VcHouseFilter") {
					this.set("VcHouseFilter", newValue);
					this.onVcHouseFilterChanged();
				}
				if (columnName === "VcNameFilter") {
					this.set("VcNameFilter", newValue);
					this.onVcNameFilterChanged();
				}
			},
 			// Обновляет грид
			onVcStreetFilterChanged: function() {
				this.reloadGridData();
			},
 
			onVcHouseFilterChanged: function() {
				this.reloadGridData();
			},
 
 			onVcNameFilterChanged: function() {
				this.reloadGridData();
			},
			// Инициализирует фиксированные фильтры
			initQueryFilters: function(esq) {
				this.callParent(arguments);
			// Фильтр по Улице
				var VcStreetFilter = this.get("VcStreetFilter");
 
				if (VcStreetFilter && VcStreetFilter.value) {
					esq.filters.add("VcStreetFilter", this.Terrasoft.createColumnFilterWithParameter(
						this.Terrasoft.ComparisonType.EQUAL, "[VcApartments:Id].VcStreet", VcStreetFilter.value));
				} else {
					esq.filters.removeByKey("VcStreetFilter");
				}
			// Фильтр по Дому
				var VcHouseFilter = this.get("VcHouseFilter");
 
				if (VcHouseFilter && VcHouseFilter.value) {
					esq.filters.add("VcHouseFilter", this.Terrasoft.createColumnFilterWithParameter(
						this.Terrasoft.ComparisonType.EQUAL, "[VcApartments:Id].VcHouse", VcHouseFilter.value));
				} else {
					esq.filters.removeByKey("VcHouseFilter");
				}
			// Фильтр по названию
				var VcNameFilter = this.get("VcNameFilter");
 
				if (VcNameFilter && VcNameFilter.value) {
					esq.filters.add("VcNameFilter", this.Terrasoft.createColumnFilterWithParameter(
						this.Terrasoft.ComparisonType.EQUAL, "[VcApartments:Id].Id", VcNameFilter.value));
				} else {
					esq.filters.removeByKey("VcNameFilter");
				}
			}
		}
	};
});

 

У меня такой же вопрос

0 комментариев
Войдите или зарегистрируйтесь, чтобы комментировать
Вопрос

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

Но теперь при попытке добавить КЕ вручную, номер не генерируется последний, а начинает с первого заполняться (КЕ00000001). 

Подскажите, как можно исправить данную проблему?

У меня такой же вопрос

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

Скорее всего, в Вашей конфигурации в системных настройках есть настройка, которая хранит текущий номер КЕ.

Вам нужно изменить её значение на номер последней КЕ.

Алла Савельева,

Благодарю, нашел нужный SEQUENCE в базе и подправил через alter.

Идрисов Артур Ильдарович,

Всегда рада помочь!smiley

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

Добрый день!

Столкнулся со следующей ошибкой во время билда/ребилда через WorkSpaceConsole, настроенный в VS.

Error: Dependency 'TripUsefulConfigurationService' of package 'Business_Trip_Objects' was not found.

Нашел статью, параметры в консоли и WebConfig значение флага CompileByManagerDependencies совпадает и равняется true.

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

Заранее спасибо!

У меня такой же вопрос

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

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

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

Добрый день! Прошу помочь со следующим кейсом:

В обращении при наступлении события X запускается бизнес-процесс и отправляется email. Необходимо прикрепись к нему все вложения с детали Файлы и ссылки.

Какие есть пути реализации? Заранее спасибо!

У меня такой же вопрос

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

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

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

Добрый день!

Существует следующая необходимость - изменить в уведомлениях по активностям ФИО связанного контакта на номер обращения (потому что все равно на то с кем общаться, главное знать по какому обращению надо сделать задачу и быстро перейти в это обращение). Можно ли вообще осуществить такое изменение в версии 7.13 и выше? Если до, то как это осуществить? Может кто делал что-то подобное?

У меня такой же вопрос

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

Можно попробовать в схеме ActivityNotificationProvider переделать функцию GetBody и остальные, где формируется список колонок.

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

Добрый день.

Возник вопрос, как обозначать обращения в зависимости от их категории.

Сейчас существует по умолчанию 2 категории - Инцидент и Запрос на обслуживание.

Сам вопрос - как настроить нумерацию вида SD000** / IM000**** / C000**** в зависимости от их выбранной категории?

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

 

P.S. Еще один вопрос как создать отдельную сущность Инцидент, по типу Обращения?

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

 

У меня такой же вопрос

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

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

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

Посмотрите это приложение, там реализована похожая задача

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

Всем добрый день. Версия 7.12.

Небольшой эксперимент с деталями. Пытаюсь понять, можно ли добавлять на деталь свои данные, не относящиеся к объектам системы.

Переопределил в схеме детали (схема обычная, наследуется от BaseGridDetailV2) стандартный onGridDataLoaded следующим образом:

onGridDataLoaded: function(response) {
				var newCollection = Ext.create("Terrasoft.Collection");
 
				var startItem = response.collection.collection.items[0];
				startItem.values.Address = "zzzz";
				newCollection.add("zzz", startItem);
 
				var nextItem = startItem;
				nextItem.values.Address = "yyy";
				newCollection.add("yyy", nextItem);
 
				var preloadRowKeys = this.get("PreloadedGridDataRecords") || [];
				var gridData = this.getGridData();
				var preloadGridData = gridData.filter(function(item, key) {
					return preloadRowKeys.indexOf(key) >= 0;
				});
				var isClearGridData = this.get("IsClearGridData");
				if (isClearGridData) {
					if (!gridData.isEmpty() && (response.success || preloadGridData.isEmpty())) {
						gridData.clear();
					}
					this.set("IsClearGridData", false);
				}
				var performanceManagerLabel = this.sandbox.id + "_onGridDataLoaded";
				performanceManager.start(performanceManagerLabel);
				this.afterLoadGridData();
				const isContinueExecution = this.Terrasoft.findValueByPath(response, "errorInfo.response.timedout") &&
						this.getIsFeatureEnabled("UseQueryOptimize") && this.isNotEmpty(this.$CurrentFolder);
				if (!response.success && !isContinueExecution) {
					performanceManager.stop(performanceManagerLabel);
					return;
				}
 
				this.initCanLoadMoreData(newCollection);
				this.prepareResponseCollection(newCollection);
				this.initIsGridEmpty(newCollection);
 
				newCollection = this.clearLoadedRecords(newCollection);
				newCollection.eachKey(function(key, item) {
					gridData.insert(0, key, item);
				});
 
				this.addItemsToGridData(newCollection);
				this.addSelectedRecords(newCollection);
				this._setRecordsCount(newCollection);
				if (!preloadGridData.isEmpty()) {
					this.addItemsToGridData(preloadGridData, this.getAddRowsOptions());
					this.addSelectedRecords(preloadGridData);
				}
				this.onDataChanged();
				performanceManager.stop(performanceManagerLabel);
			},

 

Т.е. создаю собственную коллекцию, в которую два раза подряд добавляю первый элемент возвращаемой по запросу к объекту ContactAddress коллекции response.collection.collection.items[0], в котором также меняю значение колонки Address. В итоге на детали отображается две записи с одинаковым id, при выводе коллекции в консоль тоже всё верно, но на самой детали Address остался без изменений.

Как правильно изменить элемента коллекции? Либо, второй вариант - как добавить в Terrasoft.Collection свой новый элемент (не переопределять результаты запроса, а создать собственный)?

У меня такой же вопрос

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

Пример добавления в Terrasoft.Collection  элементов

var results = this.Ext.create("Terrasoft.Collection");
this.Terrasoft.each(decodedAllowedResults, function(result) {
	var itemId = result.resultId;
	results.add(itemId, {
		id: itemId,
		value: itemId,
		displayValue: result.caption,
	});
}, this);

 

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

Добрый день! 

Подскажите, пожалуйста, как преобразовать дату в текстовую строку так, чтобы не выводилось время? Я использую оператор .ToString() и получается 02.05.2019 0:00:00. Есть ли возможность получить дату без времени?

У меня такой же вопрос

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

В параметрах метода ToString укажите нужный формат даты.

Подробнее посмотрите в статье 1 и статье 2.

Алла Савельева,

Спасибо огромное! Получилось

Немировская Виктория,

Рада, что смогла помочь wink

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

Добрый день!

Создал свой WS с методом GET. Он не требует авторизации в BPM. По прямой ссылке он прекрасно выдает результат в браузере.
При попытке использования его в БП появляется сообщение: 
Ошибка HTTP 401.1 — Unauthorized

Я верно понимаю, что причина кроется именно в настройке самой BPM  для работы с WS, а не в настройке конкретного БП?

У меня такой же вопрос

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

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

Григорий Чех,

Верно ли понимаю, что можно в БП первым действием блок для работы с WS вставить, 
описать WS AuthService.svc/Login в справочнике WS и на первом шаге к нему обращаться так:
https://bpm/ServiceModel/AuthService.svc/Login

Тем самым решая проблему выполнения последующих блоков в рамках данного БП.
Или нужно c# кодом описывать логику дополнительно?

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

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

Добрый день!

Сделал тестовый WS, который возвращает:
{"TestResult":[{"comment":"Programer","name":"Alex"},{"comment":"Manager","name":"Bob"}]}

Пробую данный ответ парсить через БП (этот код реализовывал, отталкиваясь от примеров, которые нашел в сообществе). 
В блоке с кодом C# первой строкой пишу:
var entities = Get<ICompositeObjectList<ICompositeObject>>("WebService1.UsrTestResult_Out");

При выполнении данной строки в entities данные не появляются.
В чем могут быть проблемы?
 

У меня такой же вопрос

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

ICompositeObject  это для случяая когда вы парсите коллекцию полученную из элемента чтение данных в БП

Вам нужно просто выполнить парсинг JSON на C# примеров в интернете как это сделать масса

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

Коллеги, а можно ли в задании-сценарии создавать свой класс? И можно ли в принципе свободно в нем писать свой код или есть большое число ограничений?  Ссылку по описанию данного блока на академии смотрел. Описание так весьма краткое.

Например пробую использовать:

public class SomeClass{
            public string id;
            public string login;
            public string name;
};

При попытке его использования выскакивает ошибка при публикации.

Александр Кулиш,

Свой класс вы можете создать добавив в конфигурации элемент - Исходный код, затем его можно использовать в задании сценарии!

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