Задаю довольно таки распространенный вопрос, как ни странно, я не нашел подобной темы.
Допустим есть поле статус, при его изменении должно автозаполняться другое поле - дата(возможно текстовое или даже справочник). И сразу усложню задание, изменения должны вступить в силу когда поле статус меняет одно конкретное значение в другое(например из "В работе" в "Выполнено").
BPMonline 7.x
Заранее спасибо.

Нравится

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

Есть кто живой и знающий?

Здравствуйте, данный кейс решается стандартной подпиской на событие. И выполнением интересующей Вас логики по событию.

Подписка на событие в том или ином виде проскакивала на форуме, к примеру:
http://www.community.terrasoft.ua/forum/topic/13908

А по скольку Вы говорите про статусы "В работе", "Выполнено" могу предположить что речь идет про карточку активности, а в ней уже есть, если посмотреть исходный код, в родительских схемах, атрибут:

"Status": {
  "isRequired": true,
  lookupListConfig: {
    columns: ["Finish"]
  },
  dependencies: [
    {
      columns: ["Status"],
      methodName: "onStatusChanged"
    }
  ]
},

В котором задан метод "onStatusChanged" на изменение данной колонки, и метод этот уже написан, достаточно его переопределить, и дописать недостающей логики.

К примеру:

define("ActivityPageV2", ["ActivityPageV2Resources", "GeneralDetails"],
function(resources, GeneralDetails) {
	return {
		entitySchemaName: "Activity",
		details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
		diff: /**SCHEMA_DIFF*/[
		]/**SCHEMA_DIFF*/,
		attributes: {
			"StatusValue": {
				dataValueType: this.Terrasoft.DataValueType.TEXT
			}
		},
		methods: {
			onEntityInitialized: function() {
				this.callParent(arguments);
				var statusValue = this.get("Status");
				this.set("StatusValue", statusValue);
			},
			onStatusChanged: function() {
				this.callParent(arguments);
				var oldStatus = this.get("StatusValue");
				var statusValue = this.get("Status");
 
				console.log("был: " + oldStatus.displayValue + ", стал: " + statusValue.displayValue);
				// тут любая логика проверки, и установки
				if (oldStatus.displayValue === "Не начата" && statusValue.displayValue === "В работе") {
					this.set("DetailedResult", "Взята в работу");
				}
 
				this.set("StatusValue", statusValue);
			}
		},
		rules: {},
		userCode: {}
	};
});

"Щиголь Максим" написал:А по скольку Вы говорите про статусы "В работе", "Выполнено" могу предположить что речь идет про карточку активности

Это карточка заказа, нужно поставить дату окончания(текущую дату) в определенное поле когда статус стает определенным значением. Не знаю как это работает но у меня выбивает ошибку, с помощью вывода данных в консоль определил что выбивает на
"Щиголь Максим" написал:this.set("StatusValue", statusValue);

подумал раз это поле то и тип должен быть не DataValueType.TEXT а DataValueType.LOOKUP, но ничего не помогло, этот код: var statusValue = this.get("Status"); срабатывает(вывожу в консоль данные из statusValue)

this.set("StatusValue", statusValue);

В данном месте ошибка может быть только по двум причинам:

1) неправильный контекст выполнения.
2) проблемы с аттрибутом StatusValue.

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

Получилось, поменял местами немного, написал так:
this.set("StatusValue", statusValue.displayValue);
а в остальных местах пользовался просто statusValue и oldStatus

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