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

Выполняем нумерацию собственного объекта (сметы).

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

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

Подскажите пжлст можно ли это сделать через БП... городить код не хочется).

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

Нравится

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

Из кода изменить настройку можно так, если дело касается общих настроек или значений по умолчанию:

Terrasoft.Core.Configuration.SysSettings.SetDefValue(userConnection, "SettingName", value);

Для текущего пользователя устанавливается так:

Terrasoft.Core.Configuration.SysSettings.SetValue(userConnection, "SettingName", value);

Для конкретного пользователя или группы:

Terrasoft.Core.Configuration.SysSettings.SetDefValue(userConnection, sysAdminUnitId, "SettingName", value);

Во 2-м и 3-м случаях настройка должна быть персональной, иначе словите исключение.

Добрый день!



Можно считать настройку с текущим номером, дальше через элемент "формула" получить этот номер и добавить к нему 1. А дальше номер можно передавать в элементы добавить данные или изменить данные, в зависимости от ситуации. 

Евгений Манько,

Евгений,  а каким элементом процесса записать полученный рассчитаный номер обратно в системную настройку?  Через "изменить объект"? или есть более простой способ?). Спасибо!

Есть готовый элемент GenerateSequenseNumberUserTask, предназначенный именно для этого. Вот разные примеры нумерации.

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

Александр, спасибо! Да, это элемент для нумерации.  Нам нужно не просто пронумеровать объект, а этот получившийся через формулу номер, записать в системную настройку.номевернуть 

Из кода изменить настройку можно так, если дело касается общих настроек или значений по умолчанию:

Terrasoft.Core.Configuration.SysSettings.SetDefValue(userConnection, "SettingName", value);

Для текущего пользователя устанавливается так:

Terrasoft.Core.Configuration.SysSettings.SetValue(userConnection, "SettingName", value);

Для конкретного пользователя или группы:

Terrasoft.Core.Configuration.SysSettings.SetDefValue(userConnection, sysAdminUnitId, "SettingName", value);

Во 2-м и 3-м случаях настройка должна быть персональной, иначе словите исключение.

Бершеда Д. Н. Спасибо!!!)

Бершеда Д. Н.,

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

 

Попытался вот так:

var userConnection = context.UserConnection;

String IDToken = Get<String>("IDToken"); 

Terrasoft.Core.Configuration.SysSettings.SetDefValue(userConnection, "System ID Token", IDToken);

return true;

 

Никакой ошибки не дает, компилируется, но при выполнении процесса этот скрипттаск не отрабатывает - процесс на нем и останавливается.

 

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

 

Версия платформы - текущая. Пробую на триальном 14-дневном сайте.

Добрый день.

Скорее всего вы передаете неправильный код системной настройки.

Пример рабочего скрипт-таска:

string settingCode = "SystemIdToken"; // код системной настройки
string settingValue = "Test2"; // новое значение
Terrasoft.Core.Configuration.SysSettings.SetDefValue(UserConnection, settingCode, settingValue);
return true;

Результат:

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

 Добрый день!

Возник вопрос, как на странице раздела можно изменить значение поля на странице редактирования по нажатии кнопки?

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

 

//Метод-обработчик нажатия кнопки завершить
				doneActivityClick: function(){
					var activeRow = this.get("ActiveRow");
				if (activeRow) {
					var cOwnerId = $("#ActivityPageV2OwnerLookupEdit-link-el").attr('href').split('ViewModule.aspx#CardModuleV2/ContactPageV2/edit/')[1].toUpperCase();
					var esq = this.Ext.create("Terrasoft.EntitySchemaQuery", {
						rootSchemaName: "Activity"
					});
					esq.addColumn("Opportunity.Owner.Id","OpportunityOwnerId");
					esq.addColumn("Opportunity.UsrSaleAgreemAmountPlan", "OpportunityCountAgreem");
					esq.addColumn("Opportunity.UsrSalePriseSum","OpportunityPriseSum");
					esq.addColumn("Opportunity.UsrObjCountPlan","UsrObjCountPlan");
					esq.getEntity(activeRow, function(result) {
										if (!result.success) {
										// обработка/логирование ошибки, например
										this.showInformationDialog("Ошибка запроса данных");
										return;
										}
										var oSumPrise = result.entity.get("OpportunityPriseSum");
										var oOwnerId = result.entity.get("OpportunityOwnerId");
										var oCountAgreem = result.entity.get("OpportunityCountAgreem");
										var oCountObj =result.entity.get("UsrObjCountPlan");
										var mesSumPrise= (oSumPrise<=0)?"Планируемая премия\n":"";
										var mesCountAgreem=(oCountAgreem<=0)?"Планируемое количество договоров\n":"";
										var mesCountOdj= (oCountObj<=0)?"Количество объектов\n":"";
										if (cOwnerId!=oOwnerId.toUpperCase()) {
											this.showInformationDialog("Ответственный по задаче отличается от ответственного по активности");
										}
										else{
											if (oCountAgreem<=0 || oSumPrise<=0|| oCountObj<=0){
												this.showInformationDialog("Заполните поля в продаже:\n"+mesSumPrise+mesCountAgreem+mesCountOdj);
											}
											//завершение задачи
											else{
												var newStatus ={
													displayValue: "Завершена",
													value: "4BDBB88F-58E6-DF11-971B-001D60E938C6"
												};
												var newResult ={
													displayValue: "Реализовано",
													value: "BB360D72-1AD7-4BBC-BADC-AABC0E334A74"
												};
											// как установить в данные поля значения?
												this.set("Status", newStatus);
												this.set("Result", newResult );
												this.set("ButtonEnabled", false);
 
											//сохраняем все изменения
											var cardModuleSandboxId = this.getCardModuleSandboxId();
											var resultMes =	this.sandbox.publish("OnCardAction", "save", [cardModuleSandboxId]);
 
											}
										}
				},this);
 
				}//if(activeRow)
 
				}

 

Нравится

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

Добрый день, Владислав!

Используя this.set() отобразить изменения сразу, Вы можете проверить это добавив обработчик кнопки в котором без проверок измените значения полей, в результате при нажатии на кнопку изменения сразу отобразятся. 

Судя из Вашего кода, значения не меняются так как this содержит другую область видимости.

Потому, рекомендую передать внешний скоуп используя bind:

...
esq.getEntity(activeRow, function(result) {
...
				}.bind(this));
...

 

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

Коллеги, здравствуйте!

Возможно ли закрытие всех полей карточки для пользователя (не создателя) для изменения?

Речь идет о невозможности в том числе изменения данных до сохранения.

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

Хотелось бы для такого пользователя в принципе закрыть доступ на поля (сделать их неактивными, например, повесить "замок").

Возможно ли подобное в стандартном функционале?

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

 

Нравится

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

Здравствуйте, Эрнст!

В базовой логике приложения данная функциональность отсутствует.

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

 

можно использовать вот такой "трюк"

Ext.ComponentMgr.all.each(function(c){
	var cmp = Ext.ComponentMgr.all.map[c];
	if(cmp.className){
		if(cmp.className.indexOf("Edit") !== -1){
			if(cmp.setEnabled){
				cmp.setEnabled(false);
			}
		}
	}
})

выполнение этого кода, сделает все поля карточки недоступными (замок)

можете разместить его например в onEntityInitialized методе схемы

но для какого пользователя выполнять, а для какого нет - это так же задача логики, BPM не предоставляет какой-либо штатной логики для работы с такой информацией в карточках схем, но если плоскость определения кому доступно а кому нет, лежит например в ракурсе, является ли текущий пользователь, пользователем установленным в поле Owner (или другом справочном поле ссылающимся на контакт) то это не составляет труда, если же этот же вопрос рассматривать в ракурсе, является ли текущий пользователь членом какой либо функциональной роли или организационного юнита, то Вам помогут вот эти утилиты  https://community.terrasoft.ru/questions/userutilsmixin-utility-dla-raboty-s-informaciei-o-organizacionnyh-edinicah-roliunity

(только обратите внимание на комментарии в теме)



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

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

Есть обычная страница(карточка) раздела. Есть обычная деталь на этой странице. Нужно динамически при изменении одной записи на детали выводить итоговое значение всех записей детали на главной странице. Мот можно сделать БП который это проделывает, но нужно еще обновление страницы.
Вот есть похожая тема, но тут про реестр https://community.terrasoft.ua/forum/topic/10190

Нравится

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

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

Не получается, вот как делаю:
details: /**SCHEMA_DETAILS*/{
"UsrSplitbbf096611929": {
"schemaName": "UsrSplitDetail",
"entitySchemaName": "UsrSplit",
"filter": {
"detailColumn": "UsrInvoice",
"masterColumn": "Id"
},
subscriber: function() {
this.setMyFEnabled();
}
}
}

methods: {
setMyFEnabled: function() {
console.log("**test**");
}
}
В консоль ничего не выводит при изменении детали

Виталий, добавьте следующие методы в схему, в которой вызываете сабскрайбер:

subscribeDetailEvents: function(detailConfig, detailName) {
    this.callParent(arguments);
    var detailId = this.getDetailId(detailName);
    var detail = this.Terrasoft.deepClone(detailConfig);
    var sandbox = this.sandbox;
    sandbox.subscribe("DetailChanged", function(args) {
        return this.onDetailChanged(detail, args);
    }, this, [detailId]);
},
onDetailChanged: function(detail, args) {
    var subscriber = detail.subscriber;
    if (this.Ext.isFunction(subscriber)) {
        subscriber.call(this, args);
    } else if (this.Ext.isObject(subscriber)) {
        var methodName = subscriber.methodName;
        if (this.Ext.isFunction(this[methodName])) {
            this[methodName](args);
        }
    }
}

Без данных методов subscriber не работает во многих разделах системы.

Написал, не помогло. Я не думаю что в этом проблема, в родительской схеме успешно используется сабскрайбер.

Виталий, скопировал Ваш код в схему редактирования контактов - код не работает.
Добавил методы описанные выше - код успешно отрабатывает. Вот листинг кода:

"UsrTestTest": {
	"schemaName": "UsrSchema4Detail",
	"entitySchemaName": "UsrTestTest",
	"filter": {
		"detailColumn": "CreatedBy",
		"masterColumn": "Id"
	},
	subscriber: function(){
		this.test();
		debugger;
	}
}
methods: {
	test: function(){
		alert("!");
	},
	subscribeDetailEvents: function(detailConfig, detailName) {
		this.callParent(arguments);
		var detailId = this.getDetailId(detailName);
		var detail = this.Terrasoft.deepClone(detailConfig);
		var sandbox = this.sandbox;
		sandbox.subscribe("DetailChanged", function(args) {
			return this.onDetailChanged(detail, args);
		}, this, [detailId]);
	},
	onDetailChanged: function(detail, args) {
		var subscriber = detail.subscriber;
		if (this.Ext.isFunction(subscriber)) {
			subscriber.call(this, args);
		} else if (this.Ext.isObject(subscriber)) {
			var methodName = subscriber.methodName;
			if (this.Ext.isFunction(this[methodName])) {
				this[methodName](args);
			}
		}
	}
},

Так же, Вы можете использовать sandbox на прямую. Его использование детально обсуждалось в этой теме.

Вот что паказывает консоль когда меняю значение на детале:
"Method generatActiveRowControlsConfig is obsolete. Use generateActiveRowControlsConfig instead baseobject.js:85:5
Method handler is obsolete. Use click event instead"
Прилагаю схему:
invoicepage2.txt
Не судите строго за код, только разбираюсь в BPMonline

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

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

Виталий, уточните, заработал ли subscriber? Данные сообщения в консоли никак не влияют на работу приложения. Если заработал, то Вам осталось в методе вызываемом сабскрайбером сделать запрос к базе данных используя entitySchemaQuery, а затем обновить поля основываясь на полученном результате. Для обновления полей воспользуйтесь методом this.set("Имя колонки", новое значение).

subscriber к сожалению не заработал, начал делать через sandbox. Даже что то получилось, в консоль удалось выводить пометки когда делаю изменения на детале, но передать в основную карточку никак не получается. Вот мой код:
invoicepage2.txt
Страница какбы загружается, но пишет "Загрузка" и все заблокировано.
Я уже не знаю что делать....

Добавил в onEntityInitialized строку this.callParent(arguments);и страница загрузилась но сообщение так и не ловит

Виталий, предоставте код схемы карточки детали в которой Вы публикуете данное сообщение. Так же уточните, создавалась ли деталь через Мастер деталей?

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

define("UsrSplitDetail", ["terrasoft", "ConfigurationEnums", "ConfigurationGrid", "ConfigurationGridGenerator",
"ConfigurationGridUtilities"],
function(Terrasoft, configurationEnums) {
	return {
		entitySchemaName: "UsrSplit",
		attributes: {},
		methods: {
			onActiveRowSave: function() {
				this.sandbox.publish("Test1", { test: "param anything" }, [this.sandbox.id]);
				console.log("rowSelected in first detail..." + this.sandbox.id);
			}
		},
		messages: {
			"Test1": {
				mode: Terrasoft.MessageMode.PTP,
				direction: Terrasoft.MessageDirectionType.PUBLISH
			}
		}
	};
});

Сделал замещающую схему детали и там дописал нужный мне код.

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

Виталий, вот пример кода для детали с редактируемым реестром.

Страница контакта:

      messages: {
		"Test1": {
			mode: this.Terrasoft.MessageMode.PTP,
			direction: this.Terrasoft.MessageDirectionType.SUBSCRIBE
		}
      },
		methods: {
			init: function(){
				this.sandbox.subscribe("Test1", function() {
					alert("Great");
				}, this, ["111"]);
				this.callParent(arguments);
			}
		},

Деталь:

define("UsrSchema1Detail", ["ConfigurationGrid", "ConfigurationGridGenerator", "ConfigurationGridUtilities"], function() {
	return {
		entitySchemaName: "UsrTestTest",
		attributes: {
			"IsEditable": {
				dataValueType: Terrasoft.DataValueType.BOOLEAN,
				type: Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
				value: true
			}
		},
		details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
		diff: [
			{
				"operation": "merge",
				"name": "DataGrid",
				"values": {
					"className": "Terrasoft.ConfigurationGrid",
					"generator": "ConfigurationGridGenerator.generatePartial",
					"generateControlsConfig": {"bindTo": "generatActiveRowControlsConfig"},
					"changeRow": {"bindTo": "changeRow"},
					"unSelectRow": {"bindTo": "unSelectRow"},
					"onGridClick": {"bindTo": "onGridClick"},
					"activeRowActions": [
						{
							"className": "Terrasoft.Button",
							"style": this.Terrasoft.controls.ButtonEnums.style.TRANSPARENT,
							"tag": "save",
							"markerValue": "save",
							"imageConfig": {"bindTo": "Resources.Images.SaveIcon"}
						},
						{
							"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
				}
			}
		],
		mixins: {
			ConfigurationGridUtilites: "Terrasoft.ConfigurationGridUtilities"
		},
		methods: {
			int: function(){
				alert("!");
				this.callParent(arguments);
			},
			saveRowChanges: function(row, callback, scope) {
				scope = scope || this;
				callback = callback || this.Terrasoft.emptyFn;
				if (row && this.getIsRowChanged(row)) {
					scope.sandbox.publish("Test1", null, ["111"]);
					row.save({
						callback: callback,
						isSilent: true,
						scope: scope
					});
				} else {
					callback.call(scope);
				}
			}
		},
		messages: {
			"Test1": {
				mode: Terrasoft.MessageMode.PTP,
				direction: Terrasoft.MessageDirectionType.PUBLISH
			}
		}
	};
});

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

О дааа!!! Я сделал это!!! Оно сработало!!!
Но все-же есть где то список функций?
например:
saveRowChanges
init
onActiveRowSave
onEntityInitialized
и тд. Это намного упростило бы не жизнь .

Виталий, часть этих методов описана в миксине "ConfigurationGridUtilities", там описаны методы которые нужны для работы редактируемого грида. Остальные же описаны в BasePageV2 (init, onEntityInitialized).

Далее все как по маслу пошло, с entitySchemaQuery разобрался быстро, есть много примеров на комюнити, да и в отладке поиском найти можна

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

Александр, Вам необходимо смотреть в сторону замещения метода save из схемы BasePageV2 и публиковать сообщение из него.

Правда работает. Опубликовал сообщение из onSaved. Спасибо

Добрый день.
Изменяю в редактируемом реестре данные, при помощи кода

 #5 Мотков Илья 6 апреля 2016 – 10:54 

У меня работает, но данные еще не сохранены в БД.
Подскажите может какой то еще метод есть которым могу воспользоваться, после добавления данных в БД ?

Марат, Вам необходимо смотреть в сторону замещения методов activeRowSaved (ConfigurationGridUtilities) в схеме детали или onSaved в карточке детали (в детали с редактируемым реестром он также вызывается).

Добрый день!
Подскажите как можно вытянуть данные из детали. Нужно выполнить расчёты на основании данных детали и поместить их на страницу реестра. использовать entitySchemaQuery? или же можно как то ещё получить значения?

Здравствуйте, Евгений.

Если данные присутствуют в реестре детали (уже отрисовались в гриде) - Вы можете их получить используя sandbox и атрибут GridData в схеме детали. Если же данных нет - только ESQ.

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

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

Нравится

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

В ds_OpportunityScript есть функция SetDefaultDatasetValues. Возможно, это происходит там.

Чтобы отключить заполнение поля "Состояние", необходимо изменить функцию SetDefaultDatasetValues сервиса ds_OpportunityScript таким образом (закомментированный код):

function SetDefaultDatasetValues(Dataset) {   
	var Today = GetTodayDate();
	var StartDate = Today.getVarDate();
	var ActualCloseDate = AddDateDays(Today, 7).getVarDate();
	Dataset.DisableEvents();
	try {
		Dataset.ValAsDateTime('StartDate') = StartDate;
		Dataset.ValAsDateTime('ActualCloseDate') = ActualCloseDate;
		Dataset.Values('OwnerID') = Connector.CurrentUser.ContactID;
		var OpportunityDefs = GetOpportunityDefs();
		var StatusID = OpportunityDefs.StatusID;
		/*if (!IsEmptyGUID(StatusID)) {
			Dataset.Values('StatusID') = StatusID;
		}*/	
		var RatingID = OpportunityDefs.RatingID;
		if (!IsEmptyGUID(RatingID)) {
			Dataset.Values('RatingID') = RatingID;
		}
	} finally {
		Dataset.EnableEvents();
	}
	Dataset.Values('CurrencyID') = GetBasicCurrencyID(); 
}

Чтобы отключить заполнение поля "Тип", необходимо добавить в функцию wnd_OpportunityEditOnPrepare сервиса wnd_OpportunityEditScript строку кода:

function wnd_OpportunityEditOnPrepare(Window) {
	Initialize(Window);
	wnd_BaseDBEditOnPrepare(Window);
	var Dataset = BaseDBEdit.Dataset;
/* MODULE WORKFLOW */
	if (Dataset.State == dstInsert) {
//Добавить эту строку
		Dataset.Values('TypeID')= null;

Спасибо большое, задача решена.

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

Здравствуйте!
Помогите, пожалуйста, решить проблему.

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

Как пытаюсь реализовать: в обработчике dlDataOnDatasetDataChange(DataField) на изменение поля OwnerID

В итоге не работает.

...
switch (DataFieldName){
                case ('OwnerID'):
                        var TaskDataset = dlData.Dataset;
                        var OwnerID     = dlData.Dataset.Values('OwnerID');
                        var NewOwner = getAssistanteIfExist(OwnerID);
                        dlData.Dataset('OwnerID') = NewOwnerID; // не присваивает!!!
                        //edtOwner.DataField.Value = NewOwnerID; // так тоже не присваивает
                        //DataField.Value = OwnerID; // и так не присваивает
                        break;
...

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

Подскажите, где копать ошибку.

Нравится

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

Ошибка вызвана тем, что заполняя значение поля "Ответственный" ('OwnerID') в блоке case ('OwnerID') Вы вызываете зацикливание.
Попробуйте модифицировать Ваш код подобным образом:

case ('OwnerID'):		
 if (TaskEdit.EditOwner != true) {  
	var OwnerID = dlData.Dataset.Values('OwnerID');
        var NewOwnerID = getAssistanteIfExist(OwnerID);                        
              if (!IsEmptyValue(NewOwnerID)){
                           TaskEdit.EditOwner = true;
                            edtOwner.DataField.Value = NewOwnerID; 
                            return;
             }
    	} 
 TaskEdit.EditOwner = false; 
 break;
switch (DataFieldName){
   case ('OwnerID'):
   var OwnerID     = dlData.Dataset('OwnerID');
   var NewOwner = getAssistanteIfExist(OwnerID);
   if (!IsEmptyValue(NewOwnerID)){
      dlData.Dataset.DisableEvents();
      dlData.Dataset('OwnerID') = NewOwnerID;
      dlData.Dataset.EnableEvents();
   }
   break;

или так:)

"Бондарь Наталия" написал:Ошибка вызвана тем, что заполняя значение поля "Ответственный" ('OwnerID') в блоке case ('OwnerID') Вы вызываете зацикливание.

Увы, ваши варианты не очень подходят, поскольку надо проверить, не находится ли новоявленный заместитель сам в отпуске.
Немного исправил, зацикливание не при чём. При таком коде зацикливания не происходит, но значение не сохраняется.

...
switch (DataFieldName){
                case ('OwnerID'): 
                        var TaskDataset = dlData.Dataset;
                        var OwnerID     = dlData.Dataset.Values('OwnerID');
                        if(IsNotActive(OwnerID))
                        {
                                                var NewOwner = getAssistanteIfExist(OwnerID);
                                                dlData.Dataset('OwnerID') = NewOwnerID; // не присваивает!!!
                        }
                        break;
...

"netlander" написал:NewOwnerID получаю правильный.
При дебаге показывает, что оно, вроде бы, присваивается, но при этом в лукапконтроле не отображается.

Если NewOwnerID получаете правильно и его значение присваивается полю 'OwnerID', но не отображается, следовательно значение поля перезаписывается в каком-то другом месте/событии.
Попробуйте пройтись отладчиком и отловить в какой момент перезаписывается значение поля 'OwnerID'.

Новое значение просто не записывается.
Попробуйте вот такой код:

скрипт scr_TaskEdit

...
switch (DataFieldName){
                case ('OwnerID'): 
                              dlData.Dataset.DisableEvents();
                              dlData.Dataset('OwnerID') = <ID ЛЮБОГО КОНТАКТА>;
                              dlData.Dataset.EnableEvents();
                              break;
}
...

Значение тупо не меняется.
Хххеееелп.

Может вам подойдет вариант замены ответственного не в момент его простановки, а в момент перед сохранением записи на событие OnBeforePost?

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