Запретить удаление операций

Задача - запретить удаление выполненных операций всем пользователям, кроме нескольких определенных.
Что делаю - на событие OnDatasetBeforeDelete для ds_Cashflow в скрипте ds_CashflowScript пишу функцию

function SelfOnDatasetBeforeDelete(Dataset) {
        ContactID = Connector.CurrentUser.ContactID ;
        CashflowScript.StatusID = GetFieldValueFromDisabledField(Dataset, 'StatusID');
        if (CashflowScript.StatusID=='{FDEA47BE-53FE-4730-BF4F-4F44C3B5D61A}'){
           if (ContactID != '{32E85247-DE68-4C6A-B032-06F5CDFB2B3A}'  &&
                 ContactID != '{E2093D56-49ED-4D4D-B69E-C9FF0623DE95}'  &&
                 ContactID != '{ED75744C-BC2C-469C-8993-8473E23E7F06}'  &&
                 ContactID != '{14925854-AAFD-4516-8A23-F2B5312F4C63}'){
                 ShowInformationDialog('У Вас нет прав удалять выполненную операцию');
                 return;
                  }
            }
        }

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

Нравится

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

Мне кажется, такую логику лучше сделать путём раздачи прав на группу таблиц этого раздела.

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

По идее полный обработчик выглядит так (3.4.1)

ds_CashflowOnDatasetBeforeDelete(Dataset, DoDelete)

если внутри по условию присвоить

DoDelete.Value = true;

то удаление должно отмениться

У меня в 3.3.2 функция выглядит без DoDelete. Если его туда дописать, то ничего не изменится

Виктория, странно, у меня в 3.3.2 есть параметр DoDelete. Конструкция ниже работает:

function ds_CashflowOnDatasetBeforeDelete(Dataset, DoDelete) {
 
	CashflowScript.StatusID = GetFieldValueFromDisabledField(Dataset, 'StatusID');
 
	if (CashflowScript.StatusID =='{FDEA47BE-53FE-4730-BF4F-4F44C3B5D61A}')  { 	
		ShowInformationDialog('У Вас нет прав удалять выполненную операцию');
	    DoDelete.Value = false;
	}   

}

Но можно также создать обработчик события кнопки "Удалить" грида Операций, в которой реализовать аналогичное условие:

function btnDeleteOnClick(Control) {
 
	 if (grdData.DatasetLink.Dataset.ValAsGUID('StatusID')  == '{FDEA47BE-53FE-4730-BF4F-4F44C3B5D61A}')  {
	  	ShowInformationDialog('У Вас нет прав удалять выполненную операцию');
	 }
	 else
	 	scr_BaseGridArea.btnDeleteOnClick(Control);
}

"Безродный Андрей" написал:Но можно также создать обработчик события кнопки "Удалить" грида Операций, в которой реализовать аналогичное условие:

Кнопочка delete все равно будет работать по выделенной записи :)

"Александр Кудряшов" написал:
Безродный Андрей пишет:

Но можно также создать обработчик события кнопки "Удалить" грида Операций, в которой реализовать аналогичное условие:

Кнопочка delete все равно будет работать по выделенной записи :)


Александр,

проверил:

по кнопке Delete на клавиатуре аналогично появляется окно с предупреждением (бинарные файлы 3.3.2.311):

http://i68.fastpic.ru/big/2014/0930/1d/cf02d7f1e5909e18df53bdfa5f1de61d.png

У меня только в скрипте wnd_CashflowGridAreaScript есть функция с DoDelete, называется function dlDataOnDatasetBeforeDelete(Dataset, DoDelete).

Сейчас попробую привязаться к кнопке "Удалить"

"Безродный Андрей" написал:по кнопке Delete на клавиатуре аналогично появляется окно с предупреждением (бинарные файлы 3.3.2.311)

Спасибо, вот этого я не знал... или хорошо забыл :smile:

по кнопке Удалить у меня работает только так (без открытия и закрытия Датасета ругается).
Но самое противное, что при такой работе очень заметно тормозит, зависает на минуту-другую. Работать так не возможно. Увы.

function btnDeleteOnClick(Control) {
 
	var CashflowDataset = CashflowGridArea.CashflowDataset;
	 ContactID = Connector.CurrentUser.ContactID ;
	 	 CashflowDataset.Open();
	   StatusID = CashflowDataset.ValAsGUID('StatusID');
	  CashflowDataset.Close();
 
	 //если статус операции = выполнена, а изменяющий не из группы упр.фин, то не удалять
     	if (StatusID=='{FDEA47BE-53FE-4730-BF4F-4F44C3B5D61A}'){
     	if (ContactID != '{32E85247-DE68-4C6A-B032-06F5CDFB2B3A}'  &&
		 ContactID != '{E2093D56-49ED-4D4D-B69E-C9FF0623DE95}'  &&
		 ContactID != '{ED75744C-BC2C-469C-8993-8473E23E7F06}'  &&
		 ContactID != '{14925854-AAFD-4516-8A23-F2B5312F4C63}'){
     	ShowInformationDialog('У Вас нет прав удалять выполненную операцию НОВОЕ');
     	return;
     				  }   else  scr_BaseGridArea.btnDeleteOnClick(Control);
 
	} else 	scr_BaseGridArea.btnDeleteOnClick(Control);
 
} 

Поэтому возвращаюсь к первоначальному вопросу - нельзя ли все-таки как-то правильно использовать событие OnDatasetBeforeDelete для ds_Cashflow в скрипте ds_CashflowScript?

Т.к. везде по системе для отображения операций используется грид wnd_CashflowGridArea (за возможно единственным исключением - окном выбора wnd_SelectData), то используйте свой код с первого же вашего поста, только на событии

У меня только в скрипте wnd_CashflowGridAreaScript есть функция с DoDelete, называется function dlDataOnDatasetBeforeDelete(Dataset, DoDelete).

и не забудьте дописать

DoDelete.Value = false; 

Если это критично, и хочется точно знать что лазеек в безопасности нет, ни от куда нельзя будет удалить операцию - пишите триггер на таблицу.

Дмитрий, не поверите, подправила функцию

function dlDataOnDatasetBeforeDelete(Dataset, DoDelete) {
	 ContactID = Connector.CurrentUser.ContactID ;
      StatusID = Dataset.ValAsGUID('StatusID');
        if (StatusID=='{FDEA47BE-53FE-4730-BF4F-4F44C3B5D61A}'){
           if (ContactID != '{32E85247-DE68-4C6A-B032-06F5CDFB2B3A}'  &&
                 ContactID != '{E2093D56-49ED-4D4D-B69E-C9FF0623DE95}'  &&
                 ContactID != '{ED75744C-BC2C-469C-8993-8473E23E7F06}'  &&
                 ContactID != '{14925854-AAFD-4516-8A23-F2B5312F4C63}'){
                 ShowInformationDialog('У Вас нет прав удалять выполненную операцию');
                  DoDelete.Value=false;
 
 
                  }
            }
}

Сообщение появляется, когда положено, но операция все равно УДАЛЯЕТСЯ.
Все так же как и было изначально. :(
Зато работает быстро.

Виктория, это какая-то фантастика - никогда подобного не встречал. Вы обновлялись до последней версии бинарников? Попробуйте, как минимум на 3.3.2.311.

Виктория,

действительно, проверьте на последней версии бинарных файлов (3.3.2.311).

Как я писал ранее, оба варианта на версии бинарных файлов 3.3.2.311 и конфигурации версии 3.3.2.130 работают корректно.

Если обновление не сработает, пришлите на support@terrasoft.ru копию базы, - посмотрим.

Обновление на новые бинарные файлы помогло!

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