Коллеги, подскажите что и где нужно прописать, чтобы решить такую задачку: при удалении контрагента должна проходить проверка: если контрагент имеет статус "действующий", то пользователю выдается сообщение о том, что его нельзя удалить, и удаление, соответственно, не происходит.
Насколько я понимаю, нужно просто добавить проверку на событие кнопки "Удалить" реестра контрагентов. Но что именно там нужно писать?
Нравится
Решал похожую задачу: при клике 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())
и после которого идет скрипт о сообщении.