Вопрос

Добрый день!

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

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

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

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

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

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

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

Есть корпоративная почта, права к которой настроены только для учетки Supervisor. Создал бизнес-процесс который при определенных условиях (Пользователь добавляет в деталь запись) должен отправлять письмо с корпоративной почты. Вот когда пользователь добавляет запись, БП запускается под этим пользователем, но так как у пользователя доступа к корпоративной почте нет, БП ломается.
Как сделать так, чтобы процесс запускался всегда под учеткой Supervisor?

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

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

Как вариант, чтобы в вашем бизнес процессе кодом стартовал новый (второй) бизнес процесс уже от имени супервизора. 

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

Есть два справочника, Города (базовый) и Районы (Custom). В справочнике районов при добавлении записей, заполняется поле Город. Но возник вопрос, как в карточке редактирования (например в контактах), при выборе города проживания, наложить фильтр на справочник Районов? 

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

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

Добрый день!
Можно при помощи бизнес правил: кодом или редактором 

Спасибо за помощь. Все работает как надо.

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

Доброго дня, коллеги!

Стоит следующая задача - необходимо считать и отправить данные из объекта на удаленный веб-сервис. Удаленный веб-сервис принимает данные в формате XML. Подскажите пожалуйста, каким образом лучше всего это реализовать - используя бизнес-процессы, DataService или каким-либо другим способом? Заранее благодарю за развернутые ответы. 

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

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

Добрый день!
Бизнес процесс, в котором скрипт С# с использованием HttpWebRequest.
Пример:

var request = (HttpWebRequest)WebRequest.Create(serviceAddress);
request.Method = "POST";
byte[] byteArray = Encoding.UTF8.GetBytes(postData);
request.ContentType = "application/x-www-form-urlencoded";
request.ContentLength = byteArray.Length;
request.Timeout = timeout * 1000;
using (var dataStream = request.GetRequestStream())
{
    dataStream.Write(byteArray, 0, byteArray.Length);
    dataStream.Close();
}
var resp = (HttpWebResponse)request.GetResponse();

Где postData - строка XML

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

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

Подскажите, а есть ли какой-нибудь аналог такой конструкции:

esq.addMacrosColumn(Terrasoft.QueryMacrosType.PRIMARY_DISPLAY_COLUMN, "PrimaryDisplayColumnValue");

на бекенде, для указания в коде задания-сценария бизнес-процесса?

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

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

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

Добрый день!
У Entity есть поле PrimaryDisplayColumnValue

Использую вот такую конструкцию:

var esqLookup = new EntitySchemaQuery(UserConnection.EntitySchemaManager, objectId);
var idLookup = esqLookup.AddColumn("Id"); //Id
//var idLookupName = esqLookup.GetPrimaryDisplayColumn();
var lookup= esqLookup.GetEntity(UserConnection, new Guid(guidCode.ToString()));
 
var lookupId = lookup.GetTypedColumnValue<Guid>(idLookup.Name);
var lookupName = lookup.PrimaryDisplayColumnValue;

И получаю в lookupName пустоту. При этом значение id вытаскивается верное.

Можно при помощи GetPrimaryDisplayColumnName:

entitySchemaQuery = new EntitySchemaQuery(typeSchema);
var typePrimaryColumnName = entitySchemaQuery.AddColumn(typeSchema.GetPrimaryColumnName()).Name;
var typeDisplayColumnName = entitySchemaQuery.AddColumn(typeSchema.GetPrimaryDisplayColumnName()).Name;

 

Смородинов Денис,

А Entity Вы получаете?

Попробуйте таким образом:

EntitySchema entitySchema = userConnection.EntitySchemaManager.GetInstanceByName(entityName);
Entity entity = entitySchema.GetEntity(userConnection, idValue);
var primaryColumnValue = entity.PrimaryColumnValue;
var primaryDisplayColumnValue = entity.PrimaryDisplayColumnValue;

 

Зверев Александр пишет:
typeSchema

А можно уточнить вопрос? typeSchema - это то, что у меня в скобках ?

var esqLookup = new EntitySchemaQuery(UserConnection.EntitySchemaManager, objectId);

У ESQ есть несколько разных конструкторов. В моём примере typeSchema — переменная типа EntitySchema. Получить схему по названию можно так:

var manager = UserConnection.EntitySchemaManager;
var schema = manager.GetInstanceByName("Dashboard");

 

Смородинов Денис,

А у вашего объекта установлена колонка для отображения?

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

Добрый день!

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

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

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

Добрый день!
Нужно на странице объявить атрибут:

"OrgStructureUnit": {
	"lookupConfig": {
		"hierarchical": true
	},
	"lookupListConfig": {
		"columns": ["FullName", "Head", "Parent.Head"]
	}
},

И ваш справочник должен поддерживать иерархичность: иметь ссылку Parent на себя.
Подробнее можно посмотреть на странице EmployeePage

Сидоров Александр В.,

Попробовал в карточке "Сотрудник" сделать кастомное поле, которое ссылается туда же, что и поле "Подразделение".
Выбор система предлагает делать в виде дерева. Это заработало. 
Только в результате в поле указывается не "FullName", а "Name".
Требуется ли прописывать дополнительный код или FullName должно заполняться сразу?

Вот пример кода (по сути тут указаны все те же настройки, что и для коробочного поля):
"UsrDep": {
                    "lookupConfig": {
                        "hierarchical": true
                    },
                    "lookupListConfig": {
                        "columns": ["FullName", "Head", "Parent.Head"]
                    }
                }

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

Добрый день, Коллеги! 

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

Необходимо в реестр справочника, например Статусы обращения, вывести значения колонки IsFinal аналогично методу setSubtitleColumns согласно SDK

https://academy.terrasoft.ru/documents/technic-sdkmob/7-12/sdk-reestra

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

 

 

 

 

 

Пример необходимой реализации, колонка контакт:

 

 

 

 

 

 

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

Попытки задания Subtitle через дополнительный модуль, подключённый в манифесте для раздела Case, не дал результата. Что-то делаю не так.

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

Спасибо!

 

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

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

Примеры использования этого свойства есть в «коробке» в схемах MobileLookupGridPageConfig, MobileLookupGridOpportunityPageConfig, MobileCaseMessageHistoryModuleConfig и MobileCaseMessageHistoryModuleConfig. Судя по названию, вторая схема как раз может использоваться для окна выбора из справочника. Её код:

Terrasoft.sdk.LookupGridPage.setSubtitleColumns("Opportunity", ["Account"]);

 

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

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

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

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

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

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

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");
				}
			}
		}
	};
});

 

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

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

Сталкивался с подобной проблемой. Пришлось заместить данные методы на странице редактирования (в моем случае) InvoiceSectionV2

			/**
			 * @inheritdoc Terrasoft.BaseViewModel#onLookupDataLoaded
			 * @override
			 */
			onLookupDataLoaded: function(config) {
				this.callParent(arguments);
				this.mixins.LookupQuickAddMixin.onLookupDataLoaded.call(this, config);
			},
			getLookupListConfig: function() {
				return this.mixins.LookupQuickAddMixin.getLookupListConfig.apply(this, arguments);
			},
 
			/**
			 * @inheritdoc Terrasoft.BaseViewModel#getLookupQuery
			 * @override
			 */
			getLookupQuery: function(filterValue, columnName) {
				var esq = this.callParent(arguments);
				this.applyColumnsOrderToLookupQuery(esq, columnName);
				var filterGroup = this.getLookupQueryFilters(columnName);
				esq.filters.addItem(filterGroup);
				return esq;
			},
			/**
			 * Applies order information to lookup entity schema query.
			 * @protected
			 * @param {Terrasoft.EntitySchemaQuery} esq Entity schema query.
			 * @param {String} columnName Lookup column name.
			 */
			applyColumnsOrderToLookupQuery: function(esq, columnName) {
				var lookupColumn = this.getColumnByName(columnName);
				var lookupListConfig = lookupColumn.lookupListConfig;
				if (!lookupListConfig || !lookupListConfig.orders) {
					return;
				}
				var columns = esq.columns;
				this.Terrasoft.each(lookupListConfig.orders, function(order) {
					var orderColumnPath = order.columnPath;
					if (!columns.contains(orderColumnPath)) {
						esq.addColumn(orderColumnPath);
					}
					var sortedColumn = columns.get(orderColumnPath);
					var direction = order.direction;
					sortedColumn.orderDirection = direction ? direction : Terrasoft.OrderDirection.ASC;
					var position = order.position;
					sortedColumn.orderPosition = position ? position : 1;
					this.shiftColumnsOrderPosition(columns, sortedColumn);
				}, this);
			},
			/**
			 * Shift columns order position.
			 * @private
			 * @param {Array} columns Entity columns.
			 * @param {Object} sortedColumn Entity sorting column.
			 */
			shiftColumnsOrderPosition: function(columns, sortedColumn) {
				var sortedColumnOrderPosition = sortedColumn.orderPosition;
				if (Ext.isNumber(sortedColumnOrderPosition)) {
					columns.each(function(column) {
						if (column !== sortedColumn && Ext.isNumber(column.orderPosition) &&
							column.orderPosition >= sortedColumnOrderPosition) {
							column.orderPosition += 1;
						}
					});
				}
			},

 

Спасибо, все получилось!

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

У нас есть раздел "Конфигурации", в котором хранится техника сотрудников. При заполнении раздела использовали импорт данных. Необходимо было уникальное поле, которого у нас не было, и мы добавили в эксель файл поле номер "КЕ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 комментарий

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

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