Показать сообщение отдельно
Старый 20.04.2011, 18:11   #26  
someOne is offline
someOne
Участник
Аватар для someOne
 
174 / 432 (15) +++++++
Регистрация: 11.12.2008
Адрес: Москва
Цитата:
Сообщение от Ivanhoe Посмотреть сообщение
Не понял =). Если прав на таблицу xRefTableRelation нету - то все ок, а если есть - то выдается ошибка??

И по логике, и по факту на моей модифицированной, но не в части прав AX, всё наоборот - если прав на эту таблицу нет (не на ключ, а на таблицу), то ошибка выдается. Если права дать - то всё работает.

Как-то уж очень по-разному ведет себя аксапта в наших инсталляциях. Надо проверить у кого-то еще!
Видимо я выразился не слишком ясно.

Суть того, что я хотел сообщить, в следующем:
1. Права на таблицу xRefTableRelation, конечно же есть. Если бы их не было - то выдавалась бы ошибка о том что нет доступа (которую я привел), а не выдавался бы список "пусто" на сером фоне.

2. Этих прав (на таблицу xRefTableRelation) не достаточно. Для того чтобы в списке появились необходимые таблицы - приходится открывать пользователю права на ключи таблиц. Если этого не делать - в списке отображаются только таблицы БЕЗ ключей


Не поленился разобраться, в чем же "засада".

Все дело в методе класса
\Classes\SysQueryBuilder\buildRelations
Там есть такой метод, который определяет "доступна" ли таблица данному пользователю

Если на таблице есть какой нибудь ключ безопасности, и у пользователя нет прав на этот ключ, (хотя и есть право на объект (таблицу)) то при запуске проверка возвращает "false", поэтому таблицы и не отражаются пользователю.

X++:
private static client server Map buildRelations(Map _map, SysDictTable _orgDictTable, TableName _tableName, RelationName _relationName)
.....
    if (dictTable &&
        dictTable.rights() > AccessType::NoAccess &&
        !dictTable.isTmp())
    {

Особенность в том что в случае запуска на стороне сервера и на стороне клиента (у меня по крайней мере) он возвращает разные значения!!!

Вот пример. Проверьте у себя разве он у вас работает не так ?
X++:
static void test(Args _args)
{
    SysDictTable    DictTable;
    ;
  
    dictTable   = new SysDictTable(tablename2id("SalesLine"));

    if (dictTable.rights() > AccessType::NoAccess)
    {
        info("true");
    }
    else
    {
        info("fasle");
    }
}
Если на таблице есть какой нибудь ключ безопасности, и у пользователя нет прав на этот ключ, но есть право на объект (таблицу), то при запуске на стороне сервера пример вернет "false", а при запуске на клиенте - "true"

В этом кажется, и есть проблема.

Интересно, каким образом в вашем случае пользователю отображены табличные связи ? Неужели в вашем случае этот метод работает иначе ???

Кстати проблема решается если в классе SysQueryBuilder вместо
private static server container findRelations(tableId _tableId)
написать
private static client container findRelations(tableId _tableId)

Последний раз редактировалось someOne; 20.04.2011 в 18:21.
За это сообщение автора поблагодарили: Ivanhoe (3).