Обработка кнопок реестра

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

Нравится

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

Решал похожую задачу: при клике OK в карточке проверял условие и если оно выполнялось - показывал вопрос пользователю (да или нет). Если да - выполнял некое действие, а затем базовая логика сохранения и закрытия карточки. Если нет - не делал ничего, карточка оставалась открытой.
фрагмент БП
У вас должно быть похоже, но проще. Принимается сообщение нажатия на кнопку, в блоке-скрипте присваивается значение булевскому параметру (его надо создать в дизайнере). Затем два потока, один условный при параметре, равном true, на событие нажатия кнопки в базовом процессе. Другой - по умолчанию (если параметр false) - сообщение пользователю о невозможности удаления и всё.

В скрипте scr_AccountsGridArea событие btnDeleteOnClick необходимо изменить примерно так:

var SelectedIDs = grdData.SelectedIDs;
	var SelectedIDs = grdData.SelectedIDs;
	var SelectedIDsCount = SelectedIDs.Count;
	if (!SelectedIDsCount) {
  		return;
	}
	var deleteflag = true;
	var i;
	for (i = 0; i<SelectedIDsCount; i++) {
		if (GetDatasetFieldValueByID('ds_Account', SelectedIDs([i]), 'StatusID') == StatusIdValue) {
			deleteflag = false;
		}
	}
	if (deleteflag) {
		scr_BaseGridArea.btnDeleteOnClick(Control)
	}
        else {
		ShowInformationDialog('Нельзя удалить действующего контрагента');
	}

Где 'StatusID' - Имя поля Статус, а StatusIdValue - ID статуса "действующий"

Не заметил, что BPM. Но может кому-то понадобится для CRM.

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

При таком подходе, Вы возвращаете серверную подписку на кнопку, в то время, как по умолчанию - клиентская.
Как выход, на событии Init своей страницы, перед вызовом базового обработчика подписаться на событие DataSource.BeforeRemoveRow, выполнить проверку на условие и в случае отрицательного результата такой проверки установить свойство DataSourceEventArgs.Cancel = true; При таком подходе, Вам не придется делать какие-то дополнительные запросы в БД, поскольку аргумент DataSourceEventArgs будет содержать ссылку на удаляемую строку.

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

Page.DataSource.BeforeRemoveRow += (sender, e) => {
var account = e.Row;
if (account == null) {
return;
}
Guid statusId = account.GetTypedColumnValue("StatusId");
if (statusId.Equals(ActiveAccountStatusId)) {
e.Cancel = true; // Это нужно, что не прошло базовое удаление
ErrorMessageText = new LocalizableString("Вы не можете удалить действующего контрагента");
}
};

Где StatusId - название поля статуса в БД, ActiveAccountStatusId - константа действующего статуса контрагента, а ErrorMessageText - локализируемая строка с сообщением (разумеется Вашим :) ).
Потом вставляете Исключающее или с условным потоком в котором проверяете:

!string.IsNullOrEmpty(ErrorMessageText.ToString())

и после которого идет скрипт о сообщении.

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