Показать сообщение отдельно
Старый 24.01.2011, 15:51   #6  
someOne is offline
someOne
Участник
Аватар для someOne
 
174 / 432 (15) +++++++
Регистрация: 11.12.2008
Адрес: Москва
Закрыть копирование - не достаточно.

Запретить придется не только копирование, но и ряд других возможностей
- автоотчет
- предварительный просмотр
- экспорт в ексель

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

Закрыть копирование сразу всего - не гуманно.

Лучше проверить сколько записей выделенно в данный момент в гриде - это не сложно, например так

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;
}
За это сообщение автора поблагодарили: Ivanhoe (3).