Показать сообщение отдельно
Старый 23.11.2010, 16:00   #5  
someOne is offline
someOne
Участник
Аватар для someOne
 
173 / 423 (15) +++++++
Регистрация: 11.12.2008
Адрес: Москва
Заметил странное поведение sysDictField. (Ax2009 RU5)
При работе на серверной и клиентской части есть различия в поведении...
Например для пользователя, у которого нет прав на ключ PurchTables, но есть право на просмотр таблицы PurchTable, код :
X++:
static server void test2()
{
    SysDictField    sysDictField = new SysDictField(tablenum(PurchTable), fieldnum(PurchTable, PurchId));
    boolean         visible;
    ;
    visible = sysDictField.visible();

    info(strfmt("%1", visible));
}
Возвращает false, а
X++:
static client void test2()
{
    SysDictField    sysDictField = new SysDictField(tablenum(PurchTable), fieldnum(PurchTable, PurchId));
    boolean         visible;
    ;
    visible = sysDictField.visible();

    info(strfmt("%1", visible));
}
Возвращает true

Это, в свою очередь, влияет на работу формы фильтрации SysQueryForm.
Пользователь с такими правами может спокойно работать в форме "Заказ на покупку", создавать и разносить закупки... Но не сможет ничего сортировать и фильтровать через форму фильтрации-сортировки.

Форма фильтрации нормально работает только тогда, когда у пользователя есть право на ключ безопасности той таблицы, по которой производится фильтрация и сортировка (а не на саму таблицу).

В Ax 3.0 все работало корректно, в Ax2009 приходится открывать права на ключ безопасности таблиц целого модуля (чтобы работала сортировка и фильтрация), что не корректно с моей точки зрения.

Поменял в
X++:
SysQueryForm
private static server container findFields(tableId _tableId, TmpSysQueryCompanyRange _tmpCompanyRange)
на

private static client container findFields(tableId _tableId, TmpSysQueryCompanyRange _tmpCompanyRange)

Таким образом все работает корректно.
За это сообщение автора поблагодарили: Logger (2), gl00mie (2), S.Kuskov (5).