Закрыть копирование - не достаточно.
Запретить придется не только копирование, но и ряд других возможностей
- автоотчет
- предварительный просмотр
- экспорт в ексель
Кроме того если вы закроете копирование совсем - пользователи будут серьезно возмущаться, так как часто копируют не весь справочник, а отдельные поля справочника клиентов (код клиента или адрес например).
Закрыть копирование сразу всего - не гуманно.
Лучше проверить сколько записей выделенно в данный момент в гриде - это не сложно, например так
X++:
client static boolean isSingleRecordSelected(FormDataSource _formDataSource)
{
common record;
;
if (!_formDataSource)
return false;
record = _formDataSource.getFirst(true);
if (!record)
return true;
return false;
}
И если выбрано более одной строки - запрещать копирование. В противном случае копирование должно работать.
Я написал такой статичный метод
X++:
static client void checkAccessTaskCopy(int _taskId, FormDataSource _formDataSource, FormName _formName)
{
#define.taskSend(310)
#define.taskPreView(299)
#define.taskAutoReport(278)
#define.taskCopy(771)
#define.taskExport2Excel(4436)
#define.taskFilterByField(2843)
;
if (_taskId == #taskAutoReport || _taskId == #taskCopy || _taskId == #taskExport2Excel || _taskId == #taskPreView || _taskId == #taskSend)
{
if (isSingleRecordSelected(_formDataSource) == false || _taskId != #taskCopy)
{
if ("Дополнительная проверка прав" == false)
throw error("Нет прав");
}
}
}
А на форме, например CustTable (в любой форме можно вставить такую проверку, нужно лишь заменить имя источника данных)
X++:
public int task(int _taskId)
{
int ret;
#task
;
// -->
Global::checkAccessTaskCopy(_taskId, CustTable_ds, element.name());
// <--
// If Control+N and datasource is not CustTable then call create on CustTable
if (_taskId == #taskNew && (confind(skipCreateDataSources,this.dataSource().id()) || !custTable))
{
custTable_ds.create();
ret = 1;
}
else
{
ret = super(_taskId);
}
return ret;
}