Вопрос

Добрый день.

Стоит задача из таблицы детали достать все записи по полю UsrSchoolName1Id равные Id раздела(this.get("Id")).

И посчитать количество записей по UsrPositionStaffId равной 07D2E5FA-1B0F-4B54-90AB-CCE23678ECFD.

Мой код:

isAccountPrimaryContactSet: function() {
var message = "";
var esq = Ext.create("Terrasoft.EntitySchemaQuery", {
    rootSchemaName: "UsrEntity1DetailStaff"
});
esq.addColumn("Id");
esq.addColumn("UsrPositionStaffId");
esq.addColumn("UsrSchoolName1Id");
var esqFirstFilter = esq.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL,"UsrSchoolName1Id", this.get("Id"));
var esqSecondFilter = esq.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL,"UsrPositionStaffId", "07e2e5fa-1b0f-4b54-90ab-cce23678ecfd");
esq.filters.logicalOperation = Terrasoft.LogicalOperatorType.AND;
esq.filters.add("esqFirstFilter", esqFirstFilter);
esq.filters.add("esqSecondFilter", esqSecondFilter);
esq.addAggregationSchemaColumn("UsrPositionStaffId", Terrasoft.AggregationType.COUNT, Terrasoft.AggregationEvalType.ALL);
esq.getEntityCollection(function (result) {
    if (!result.success) {
        this.showInformationDialog("Ошибка запроса данных");
        return;
    }
    result.collection.each(function (item) {
        message += "Количество младших сотрудников: " + item.get("UsrPositionStaffId") + "\n";
    });
    this.showInformationDialog(message);
}, this);
 
 
 
}

Фото моей таблицы:

 

 

 

 

После нажатия кнопки данный код выводит следующую ошибку в консоли:

 

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

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

Насколько я понимаю, то в колонках "UsrPositionStaffId" и "UsrSchoolName1Id" Вам нужно убрать в конце "Id".

Alex Zaslavsky пишет:

Насколько я понимаю, то в колонках "UsrPositionStaffId" и "UsrSchoolName1Id" Вам нужно убрать в конце "Id".

 

Ошибка ушла теперь просто возвращает пустое поле. 

Казанцев Андрей Юрьевич,

я, честно говоря, ниразу не использовал AggregationSchemaColumn, я обычно пишу:

if (!result.success) {
  this.showInformationDialog("Ошибка запроса данных");
    return;
  }
this.showInformationDialog(result.collection.collection.length);

Это так, чисто протестить сколько записей я получил.

Alex Zaslavsky пишет:

Казанцев Андрей Юрьевич,

я, честно говоря, ниразу не использовал AggregationSchemaColumn, я обычно пишу:


 
if (!result.success) {
  this.showInformationDialog("Ошибка запроса данных");
    return;
  }
this.showInformationDialog(result.collection.collection.length);

Это так, чисто протестить что я получил.

Тут пока проблема не в агрегации, а фильтрации. Для отладки закоментировал  часть кода:

var message = "";
var esq = Ext.create("Terrasoft.EntitySchemaQuery", {
    rootSchemaName: "UsrEntity1DetailStaff"
});
esq.addColumn("UsrPositionStaff");
esq.addColumn("UsrSchoolName1");
var esqFirstFilter = esq.createColumnFilterWithParameter("UsrSchoolName1",Terrasoft.ComparisonType.EQUAL,"UsrSchoolName1", "77250D61-1612-4D2B-BE38-361AF1E27E59");
esq.filters.logicalOperation = Terrasoft.LogicalOperatorType.AND;
esq.filters.add("esqFirstFilter", esqFirstFilter);
esq.getEntityCollection(function (result) {
    if (!result.success) {
        this.showInformationDialog("Ошибка запроса данных");
        return;
    }
    result.collection.each(function (item) {
        message += "Количество младших сотрудников: " + item.get("UsrSchoolName1") + "\n";
    });
    this.showInformationDialog(message);
}, this);

Все id для js приводите к нижнему регистру те использовать вместо 

"77250D61-1612-4D2B-BE38-361AF1E27E59"

нужно

"77250d61-1612-4d2b-be38-361af1e27e59"

Для решение вашей проблемы посмотрите через профайлер sql запросов какой запрос идет в базу это поможет вам понять что не так с запросом и почему он не возвращает записей

Метод createColumnFilterWithParameter содержит 3 параметра, а у Вас 4:

createColumnFilterWithParameter(comparisonType, columnPath, paramValue)

Попробуйте написать вот так:

esq.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL,"UsrSchoolName1", "77250d61-1612-4d2b-be38-361af1e27e59")

Казанцев Андрей Юрьевич,

так что в итоге, все получилось?

Григорий Чех пишет:

Большое спасибо за подсказку с профайлером. Айди через get сделал.

Alex Zaslavsky пишет:

Спасибо и тебе Алекс. А то я с постоянным использованием  sql запросах в поддержке. Везде пихал за место объектов название запросов в базе.

Алла Савельева пишет:

Да, Алла ваш способ заработал. Хотя я все делал по примерам с академии.

У меня теперь такая проблема. Я не могу синхронно вывести подсчет.

Сам код подгружается так:

 onEntityInitialized: function() {
            	this.callParent(arguments);
            	  this.methodChain();
            },
	numberOfDetail: function(IdDetail) {
var esq = Ext.create("Terrasoft.EntitySchemaQuery", {
    rootSchemaName: "UsrEntity1DetailStaff"
});
esq.addColumn("UsrPositionStaff","UsrPositionStaff");
esq.addColumn("UsrSchoolName1","UsrSchoolName1");
var esqFirstFilter = esq.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL,
"UsrSchoolName1", this.get("Id"));
var esqSecondFilter = esq.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL,"UsrPositionStaff", IdDetail);
esq.filters.logicalOperation = Terrasoft.LogicalOperatorType.AND;
esq.filters.add("esqFirstFilter", esqFirstFilter);
esq.filters.add("esqSecondFilter", esqSecondFilter);
esq.addAggregationSchemaColumn("UsrPositionStaff", Terrasoft.AggregationType.COUNT,"detailOfNumber",
Terrasoft.AggregationEvalType.NONE);
esq.getEntityCollection(function (result) {
    if (!result.success) {
        this.showInformationDialog("Ошибка запроса данных");
        return;
    }
    result.collection.each(function (item) {
 
        return item.get("detailOfNumber");
    });
}, this);
},
methodChain: function(){
 this.showInformationDialog("Младших учителей:" + this.numberOfDetail("07D2E5FA-1B0F-4B54-90AB-CCE23678ECFD") + "\n"+
"Старших учителей:" + this.numberOfDetail("019EF537-F8F1-4C01-BA2B-4B17D1285231") + "\n" +
"Ведущих учителей:" + this.numberOfDetail("F02850E9-264A-4D57-B64C-7409F0A84322") + "\n");
 
 
}

 

return в асинхронном обработчике плохая идея вам нужно вызывать methodChain втом же месте где вы получили(вычитали данные) те после 

(result.success)

для каждого элемента коллекции или после их перебора /(это смотря что вам нужно). Как вариант можно создать свои виртуальные колонки (атрибуты) вычитать туда нужные вам данные а потом в обработчике (например по нажатию кнопки) брать оттуда данные.

Григорий Чех пишет:
return в асинхронном обработчике плохая идея вам нужно вызывать methodChain втом же месте где вы получили(вычитали данные) те после 

Задача в том чтобы при открытии страницы выходило это окно. 

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

Добрый день! Подскажите, можно ли штатными средствами или настройками отобразить одновременно несколько календарей сотрудников (контактов)? Если дорабатывать - то какой подход?

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

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

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

Сделайте свою деталь с редактируемым реестром или со своей страницей добавления (Назвать можно Графики работы или  Календари) и подключить ее к контакту/сотруднику.

Создание детали описано тут и тут

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

Добрый день.

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

Как мне поймать это изменение?

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

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

Казанцев Андрей Юрьевич,

Все верно - обычно данная задача решается именно через свойство dependencies атрибутов.

Вот ещё один пример с Академии.

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

Также можно использовать событийные процессы.

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

Нашел ответ здесь через подписку на событие:https://community.terrasoft.ru/articles/ne-srabatyvaet-metod-pri-podpis…
Но если есть и другие методы, через переопределение чего либо напишите пожалуйста.

Казанцев Андрей Юрьевич,

Все верно - обычно данная задача решается именно через свойство dependencies атрибутов.

Вот ещё один пример с Академии.

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

Также можно использовать событийные процессы.

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

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

Как можно сделать что бы страница редактирования была как в детали "деталь со страницей редактирования", а страница добавления была как в "детали с выбором из справочника", что бы при выборе записи она не появлялась в списке когда снова войти в выбор для добавления?

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

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

Переопределите обработчик нажатия на кнопку [+] добавления новой записи. Обычно она называется AddRecordButton. Обработчик кнопки реализуйте аналогично примера на Академии. В методе openDocumentLookup накладывайте нужные фильтры, чтобы уже добавленная запись в списке выбора не появлялась.

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

 

Так же для добавления можно создать свою мини карточку детали тут

Переопределите обработчик нажатия на кнопку [+] добавления новой записи. Обычно она называется AddRecordButton. Обработчик кнопки реализуйте аналогично примера на Академии. В методе openDocumentLookup накладывайте нужные фильтры, чтобы уже добавленная запись в списке выбора не появлялась.

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

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

 

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

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

Заместить SectionActionsDashboard"

и

		{
			"operation": "remove",
			"name": "CallMessageTab"			
		},
		{
			"operation": "remove",
			"name": "EmailMessageTab"
		},
		{
			"operation": "remove",
			"name": "SocialMessageTab"
		},
		{
		   "operation": "remove",
		    "name": "TaskMessageTab"
		}

 

Вам нужно переопределить методы getSectionPublishers и getExtendedConfig в SectionActionsDashboard.

Посмотрите пример добавления нового канала в ActionDashboard и реализацию SectionActionsDashboard в пакетах TaskMessagePublisher, EmailMessagePublisher, CallMessagePublisher и SocialMessagePublisher.

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

 

Заместить SectionActionsDashboard"

и

		{
			"operation": "remove",
			"name": "CallMessageTab"			
		},
		{
			"operation": "remove",
			"name": "EmailMessageTab"
		},
		{
			"operation": "remove",
			"name": "SocialMessageTab"
		},
		{
		   "operation": "remove",
		    "name": "TaskMessageTab"
		}

 

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

Добрый день.

По нажатию кнопки должно изменяться справочное.

Как это реализовать.  Простой this.set("UsrStatusSchools",'f7afb09b-83bc-4c44-a2cc-d3ce69d695eb');

Не проходит.

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

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

this.set("Based", {value: "6f5a3e78-d653-4448-9c36-c73993a84668", displayValue: "Устава"});

this.set("Based", {value: "6f5a3e78-d653-4448-9c36-c73993a84668", displayValue: "Устава"});

Спасибо!

this.loadLookupDisplayValue("lookupname", id);

 

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

Коллеги, посоветуйте, пожалуйста, лучшие практики реализации Double Opt-In в bpm'online.

Желательно, без использования рассылок bpm'online marketing, чтобы не использовать лицензированные "активные контакты", которые так и не подпишутся на рассылки.

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

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

Для начала бы всем присутствующим знать, что такое «Double Opt-In». Если речь об этом:

Image: a graphic depicting the two steps of the double opt-in process: the signup form, and the opt-in confirmation email.

То это довольно похоже на стандартные механизмы раздела кампаний в bpm'online marketing с добавлениями из лендинга и триггерными рассылками:

 

section_campaigns_landing_condition_flow.png

Естественно, потребуются те самые лицензии на активные контакты.

Без них можно только отправлять почту прямо из системы по SMTP в рамках логики БП, что мало масштабируемо и нагружает систему.

 

Зверев Александр пишет:
То это довольно похоже на стандартные механизмы раздела кампаний в bpm'online marketing с добавлениями из лендинга и триггерными рассылками:

Да, очень похоже. Но пока непонятны некоторые моменты:

- как отлавливать завершение кампании Double Opt-In, чтобы в карточке контакта уже отметить, что он прошёл подписку до конца?
- как унифицировать это решение, чтобы не копировать в каждом landing page, где контакт может подписаться? 

Для этого служит элемент «Выход из кампании». Там отмечают не в карточке, но на детали:

Всем контактам, которые по переходу или согласно настроенным условиям группы попали на этот шаг, на вкладке [Аудитория] в колонке [Текущий шаг] будет установлено значение “Достигли цели”

Движок кампаний поддерживает ветвления, можно попробовать добавить в одной кампании несколько разных элементов «Добавить из лендинга».

Возникли ещё 2 вопроса:

1. Минимальный период запуска кампании - 15 минут, что слишком долго, чтобы выслать клиенту письмо с подтверждением подписки (большинство не дождётся, и не ответит)
2. Процесс, кажется, не отлавливает изменения в детали Campaign participant. По крайней мере, ни разу за день процессы (реальный и тестовый) не сработали, хотя, участники добавлялись и даже дошли до цели:
 

Процесс не запустится по событию на объекте, если добавление или изменение делается не при помощи механизмов EntitySchemaQuery, а посредством классов Insert/Update или напрямую в базе. Вероятно, для этой детали происходит именно так.

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

Процесс не запустится по событию на объекте, если добавление или изменение делается не при помощи механизмов EntitySchemaQuery, а посредством классов Insert/Update или напрямую в базе. Вероятно, для этой детали происходит именно так.

Интересно, а как тогда люди на bpm'online реализуют такой механизм Double Opt-In? 

Если логика простая — можно на триггере в базе. Или по таймеру проверять новые записи, которые ещё не обработаны. Или из того же триггера запустить через веб-сервис БП с Id нужной записи в параметре. Или найти то место в коде, где произошло добавление на деталь в обход ESQ (если дело действительно в этом) и добавить вызов нужной логики.

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

На страницу выведено поле с датой и временем, нужно передать в него время из справочника при изменении значения в выпадающем списке. Стандартные js способы new Data(dataCode) не работает

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

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

Добрый день!

А что именно "стандартное" не работает? Какой тип у dataCode? Возможно просто напросто вы не можете создать дату? Так как значение устанавливается просто. Например:

//...
attributes: {
	"SomeDate": {
		"dataValueType": this.Terrasoft.DataValueType.DATE_TIME,
		"type": this.Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
		"dependencies": [{
			columns: ["Type"],
			methodName: "setSomeDate"
		}]
	},
	"Type": {
		"lookupListConfig": {
			columns: ["CreatedOn"]
		}
	}
},
//...
methods: {
	setSomeDate: function () {
		var value = (this.get("Type") || {}).CreatedOn || null;
		this.set("SomeDate", value);
	}
}
//...

И Вам, наверное, стоит заглянуть в консоль, там скорее всего ошибка, которая прояснит ситуацию

Добрый день!

А что именно "стандартное" не работает? Какой тип у dataCode? Возможно просто напросто вы не можете создать дату? Так как значение устанавливается просто. Например:

//...
attributes: {
	"SomeDate": {
		"dataValueType": this.Terrasoft.DataValueType.DATE_TIME,
		"type": this.Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
		"dependencies": [{
			columns: ["Type"],
			methodName: "setSomeDate"
		}]
	},
	"Type": {
		"lookupListConfig": {
			columns: ["CreatedOn"]
		}
	}
},
//...
methods: {
	setSomeDate: function () {
		var value = (this.get("Type") || {}).CreatedOn || null;
		this.set("SomeDate", value);
	}
}
//...

И Вам, наверное, стоит заглянуть в консоль, там скорее всего ошибка, которая прояснит ситуацию

Лопатин Константин Николаевич,

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

Пробовал this.set("dataColume", new Date(); - не работает, хотя в js даёт текущую дату и время. Так же пробовал из другого поля скопировать дату this.set("date", new Date(this.get("date2").toString()))

И

this.set("date1", this.get("date2"))

Prime Source,

А в каком методе Вы это делаете? По событию? Запрос может быть к базе какой-то выполняете? Контекст верный? Вариант с

this.set("SomeDate", new Date());

очень даже рабочий. Тяжело помочь, когда не видишь полной картины

Лопатин Константин Николаевич,

define("PsPPsPApprovalPuRequests1Page", [], function() {
	return {
		entitySchemaName: "PsPApprovalPuRequests",
		attributes: {
			"PsPDateTimeApproval": {
				dataValueType: Terrasoft.DataValueType.FLOAT,
				dependencies: [
					{
						columns: ["PsPsPMatchResult"],
						methodName: "approvalDate"
					}
				]
			}
		},
		modules: /**SCHEMA_MODULES*/{}/**SCHEMA_MODULES*/,
		details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
		businessRules: /**SCHEMA_BUSINESS_RULES*/{
			"PsPsPMatchResult": {
				"b7a163a0-228d-4005-bfd3-3d19229a6328": {
					"uId": "b7a163a0-228d-4005-bfd3-3d19229a6328",
					"enabled": true,
					"removed": false,
					"ruleType": 0,
					"property": 1,
					"logical": 0,
					"conditions": [
						{
							"comparisonType": 3,
							"leftExpression": {
								"type": 3,
								"value": "CurrentUserContact",
								"dataValueType": 10
							},
							"rightExpression": {
								"type": 1,
								"attribute": "PsPApprovalMan"
							}
						},
						{
							"comparisonType": 1,
							"leftExpression": {
								"type": 1,
								"attribute": "PsPsPMatchResult"
							}
						}
					]
				}
			},
			"PsPComent": {
				"e39449ef-895f-4341-8133-2e773a4dec7d": {
					"uId": "e39449ef-895f-4341-8133-2e773a4dec7d",
					"enabled": true,
					"removed": false,
					"ruleType": 0,
					"property": 1,
					"logical": 0,
					"conditions": [
						{
							"comparisonType": 3,
							"leftExpression": {
								"type": 3,
								"value": "CurrentUserContact",
								"dataValueType": 10
							},
							"rightExpression": {
								"type": 1,
								"attribute": "PsPApprovalMan"
							}
						}
					]
				}
			}
		}/**SCHEMA_BUSINESS_RULES*/,
		methods: {
			approvalDate: function() {
				var matchResult = this.get("PsPsPMatchResult");
				if (matchResult) {
					var esq = this.Ext.create("Terrasoft.EntitySchemaQuery", {rootSchemaName: "PsPMatchResult"});
					//esq.addColumn("PsPTimeLimit", "PsPTimeLimit");
					debugger;
					esq.getEntity(matchResult.value, function(result) {
						if (!result.success) {
							// обработка/логирование ошибки, например
							this.showInformationDialog("Ошибка запроса данных");
							return;
						}
						this.set("PsPDateTimeApproval", new Date());
					}, this);
				}
			}
		},
		dataModels: /**SCHEMA_DATA_MODELS*/{}/**SCHEMA_DATA_MODELS*/,
		diff: /**SCHEMA_DIFF*/[
			{
				"operation": "insert",
				"name": "PsPApprovalMan",
				"values": {
					"layout": {
						"colSpan": 12,
						"rowSpan": 1,
						"column": 0,
						"row": 1,
						"layoutName": "Header"
					},
					"bindTo": "PsPApprovalMan"
				},
				"parentName": "Header",
				"propertyName": "items",
				"index": 0
			},
			{
				"operation": "insert",
				"name": "PsPsPMatchResult",
				"values": {
					"layout": {
						"colSpan": 12,
						"rowSpan": 1,
						"column": 0,
						"row": 2,
						"layoutName": "Header"
					},
					"bindTo": "PsPsPMatchResult",
					"labelConfig": {
						"caption": {
							"bindTo": "Resources.Strings.PsPsPMatchResultLabelCaption"
						}
					},
					"enabled": true,
					"contentType": 5
				},
				"parentName": "Header",
				"propertyName": "items",
				"index": 1
			},
			{
				"operation": "insert",
				"name": "PsPComent",
				"values": {
					"layout": {
						"colSpan": 12,
						"rowSpan": 1,
						"column": 0,
						"row": 3,
						"layoutName": "Header"
					},
					"bindTo": "PsPComent"
				},
				"parentName": "Header",
				"propertyName": "items",
				"index": 2
			},
			{
				"operation": "insert",
				"name": "PsPDateTimeApproval27fcf723-04c0-4c5d-86d1-e4ef52f8b467",
				"values": {
					"layout": {
						"colSpan": 12,
						"rowSpan": 1,
						"column": 0,
						"row": 0,
						"layoutName": "Header"
					},
					"bindTo": "PsPDateTimeApproval",
					"enabled": false
				},
				"parentName": "Header",
				"propertyName": "items",
				"index": 3
			}
		]/**SCHEMA_DIFF*/
	};
});

 

Лопатин Константин Николаевич,

attributes: {
	"PsPTimeLimit": {
		dataValueType: Terrasoft.DataValueType.FLOAT,
		dependencies: [
			{
				columns: ["PsPProcurementType"],
				methodName: "calculateTimeLimit"
			}
		]
	}
},
methods: {
	onEntityInitialized: function() {
		this.callParent(arguments);
		this.calculateTimeLimit();
		this.calculateDepartment();
	},
	calculateTimeLimit: function() {
		var recordId = this.get("PsPProcurementType");
		var esq = this.Ext.create("Terrasoft.EntitySchemaQuery", {rootSchemaName: "PsPProcurementType"});
		esq.addColumn("PsPTimeLimit", "PsPTimeLimit");
		if (recordId) {
			esq.getEntity(recordId.Id, function(result) {
				if (!result.success) {
					// обработка/логирование ошибки, например
					this.showInformationDialog("Ошибка запроса данных");
					return;
				}
				var timeLimit = result.entity.get("PsPTimeLimit").toString();
				this.set("PsPTimeLimit", {
					displayValue: new Date(timeLimit)
				});
			}, this);
		}
	}
}

Это из базы уже

Prime Source,

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

this.set("PsPTimeLimit", { displayValue: new Date(timeLimit) });

Вы где подсмотрели?

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

Лопатин Константин Николаевич,

Спасибо, тип изменил и все заработало, нужно больше спать)))

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

Добрый день!

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

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

П.С. На всякий случай уже пробовал условие с использованием роли "Текущий пользователь = Системный администратор" - не прокатило :(

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

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

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

Вот ссылки на Академию: Механизм блокировки полей страницы редактирования и Как полностью заблокировать поля страницы редактирования.

Добрый день. Вам подойдет способ проверки прав доступа на операцию. Без кода сделать не получится. Загляните в эту тему: https://community.terrasoft.ru/questions/kak-ubrat-deistvie-kopirovatiz…

Дмитрий А.,

А есть решение другое, как для аналитика, а не программиста?

Семенов Михаил,

Посмотрите это расширение

оно позволяет делегировать права пользователя/роли другому пользователю.

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

не совсем понимаю как это расширение поможет. У меня основная идея отказаться от администрирования по колонкам (ради одной колонки настраивать почти сотню остальных как то не очень)

Семенов Михаил пишет:

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

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

Вот ссылки на Академию: Механизм блокировки полей страницы редактирования и Как полностью заблокировать поля страницы редактирования.

Спасибо, есть с чем потренироваться)

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

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

Хотим сделать чтобы в редактируемом реестре записи отображались как ссылки для удобного перехода, нашел что для этого необходимо добавить признак useLinks: true для DataGrid и метод-обработчик linkClicked, но это почему-то не меняет ситуацию, строки отображаются как обычно... ошибок в консоли нет

Код DataGrid:

{
    "operation": "merge",
    "name": "DataGrid",
    "values": {
        "className": "Terrasoft.ConfigurationGrid",
        "generator": "ConfigurationGridGenerator.generatePartial",
        "generateControlsConfig": {"bindTo": "generatActiveRowControlsConfig"},
        "changeRow": {"bindTo": "changeRow"},
        "unSelectRow": {"bindTo": "unSelectRow"},
        "onGridClick": {"bindTo": "onGridClick"},
        "activeRow": {"bindTo": "ActiveRow"},
        "selectedRows": {"bindTo": "SelectedRows"},
        "activeRowActions": [
            {
                "className": "Terrasoft.Button",
                "style": this.Terrasoft.controls.ButtonEnums.style.TRANSPARENT,
                "tag": "save",
                "markerValue": "save",
                "imageConfig": {"bindTo": "Resources.Images.SaveIcon"}
            },
            {
                "className": "Terrasoft.Button",
                "style": Terrasoft.controls.ButtonEnums.style.TRANSPARENT,
                "tag": "card",
                "markerValue": "card",
                "imageConfig": {"bindTo": "Resources.Images.CardIcon"}
            },
            {
                "className": "Terrasoft.Button",
                "style": this.Terrasoft.controls.ButtonEnums.style.TRANSPARENT,
                "tag": "cancel",
                "markerValue": "cancel",
                "imageConfig": {"bindTo": "Resources.Images.CancelIcon"}
            },
            {
                "className": "Terrasoft.Button",
                "style": this.Terrasoft.controls.ButtonEnums.style.TRANSPARENT,
                "tag": "remove",
                "markerValue": "remove",
                "imageConfig": {"bindTo": "Resources.Images.RemoveIcon"}
            }
        ],
        "initActiveRowKeyMap": {"bindTo": "initActiveRowKeyMap"},
        "activeRowAction": {"bindTo": "onActiveRowAction"},
        "multiSelect": false,
        "useLinks": true,
        "primaryColumnName": "Id",
        "sortColumnIndex": null,
        "listedZebra": true,
        "type": "listed"
    }
}

 

Посмотрите, пожалуйста, может я что-то упустил

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

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

Добрый день!

Я бы Вам рекомендовал посмотреть в сторону метода addColumnLink в GridUtilitiesV2. Так же можно изучить поподробнее как формируются ссылки в FileDetailV2

Добрый день!

Я бы Вам рекомендовал посмотреть в сторону метода addColumnLink в GridUtilitiesV2. Так же можно изучить поподробнее как формируются ссылки в FileDetailV2

Обрати внимание на флаг showValueAsLink (и выше тебе уже ответили в системе множество примеров, потрать немного времени и разберись)

ПРимер использования ниже

{
    "operation": "insert",
    "name": "UsrURLpage",
    "values": {
        "layout": {
            "colSpan": 12,
            "rowSpan": 1,
            "column": 0,
            "row": 3,
            "layoutName": "Header"
        },
        "labelConfig": {},
        "enabled": true,
        "bindTo": "UsrURLpage",
        "showValueAsLink": true,
        "href": {
            "bindTo": "UsrURLpage",
            "bindConfig": {"converter": "getUsrURLpageLink"}
        },
        "controlConfig": {
            "className": "Terrasoft.TextEdit",
            "linkclick": { bindTo: "onUsrURLpageLinkClick"}
        }
    },
    "parentName": "Header",
    "propertyName": "items",
    "index": 6
}

 

Переопределил метод addColumnLink, спасибо Константину за наводку:

addColumnLink: function(item, column) {
    this.callParent(arguments);
 
    var columnPath = column.columnPath;
    if (columnPath === "UsrProduct") {
        item["on" + columnPath + "LinkClick"] = function() {
            var value = this.get(columnPath);
            return {
                caption: item.values.UsrProduct.displayValue,
                target: "_self",
                title: item.values.UsrProduct.displayValue,
                url: "/0/Nui/ViewModule.aspx#CardModuleV2/ProductPageV2/edit/" + item.values.UsrProduct.value
            };
        };
    }
}

При переходе по ссылке появились ошибки в консоли, видимо не мог поставить фокус при переходе, просто убрал фокус на это поле:

focusActiveRowControl: function(columnName) {
    if (!columnName || columnName === "UsrProduct") {
        return;
    }
    var activeRow = this.getActiveRow();
    activeRow.set("Is" + columnName + "Focused", true);
    this.currentActiveColumnName = columnName;
}

 

Всем спасибо за помощь...)

 

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