AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Администрирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 15.06.2005, 17:20   #1  
George Nordic is offline
George Nordic
Модератор
Аватар для George Nordic
Злыдни
 
4,479 / 1250 (50) ++++++++
Регистрация: 17.12.2003
Адрес: Moscow
Записей в блоге: 9
Слетают права при импорте проекта
Коллеги!

Никто не сталкивался со следующей ситуацией: при импорте проекта (новый функционал или даже просто измененный существующий) слетают настроенные права доступа. Ключи прописаны. Ситуация возникает, даже если в новом проекте не создавались ключи!

Кто-нибудь сталкивался? Как решали проблему?

С Уважением,
Георгий
Старый 15.06.2005, 18:39   #2  
sukhanchik is offline
sukhanchik
Administrator
Аватар для sukhanchik
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,275 / 3476 (122) ++++++++++
Регистрация: 13.06.2004
Адрес: Москва
Хм.... напрашиваются сразу 2 версии:
1. Табличка AccessRightsList. Все хранится по ID-шникам. Если ID-шники изменились после импорта - то пиши пропало. Но вероятность этого низка - т.к. изменить ID элемента в АОТ просто так - не просто (ну кроме как опускания в слой). Извратиться конечно можно - но причина скорее всего не в этом
2. Таблички SysSecurity*. Если настройка прав идет по контролам формы (в правах доступа через главное меню и т.д., не через Контроль доступа) - то права хранятся-то привязанные к ID-шникам контролов на форме..... А вот тут-то вы и попали... Добавляется новый контрол, у старого (на который настроены права) - ID-шник слетает.... ну соотв права тоже

МОРАЛЬ: права доступа к элементам, которые выделены жирным шрифтом, даже несмотря на то что к ним отсутствует доступ - желательно не менять. Ибо потом форму недоработаешь.... Или же писать утилиту экспорта/импорта прав, работающую по именам контролов ... Опять-таки - отход от стандартной функциональности
Старый 15.06.2005, 18:45   #3  
George Nordic is offline
George Nordic
Модератор
Аватар для George Nordic
Злыдни
 
4,479 / 1250 (50) ++++++++
Регистрация: 17.12.2003
Адрес: Moscow
Записей в блоге: 9
Да, тут у меня тоже подозрения были, со слоями связанные...
Старый-то функционал (утвержденный, так сказать) лежит в cus-слое. А поднимается-то все на usr!

Возможно, при этом слетают айдишники. Даже 100% так, хотя и стоит флаг "импортировать со значением идентификаторов".

Видимо, у большинства разработчиков разработка идет в одном слое, поэтому и проблема столь специфическая, мало кому известная.

Спасибо за советы огромное! Будем подумать, что можно сделать. Мораль учтем!
Спасибо огромное, г-н sukhanchik!

С Уважением,
Георгий
Старый 15.06.2005, 18:58   #4  
sukhanchik is offline
sukhanchik
Administrator
Аватар для sukhanchik
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,275 / 3476 (122) ++++++++++
Регистрация: 13.06.2004
Адрес: Москва
тогда сразу вам подводный камешек.... ID-шники элементов АОТ имеют для каждой пары слоев свой диапазон - для cus-cup - это 40000-49999. Для usr-usp - 50000-59999. А теперь внимание на экран. В CUS-слой закачивается элемент, у которого ID - из диапазона USR-слоя. В тоже время, в USR-слое имеется элемент, с таким же ID-шником (если просто одинаковые имена, но разные ID - тоже интересно). Аксапта начинает "путать" эти элементы. Лечится - удалением из верхнего слоя и импортом уже без ID-шников (по сути сменой ID-шника).
Конечно это не Ваша ситуация, однако проблема из той же оперы ...
Старый 15.06.2005, 19:08   #5  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Изначально опубликовано sukhanchik
В тоже время, в USR-слое имеется элемент, с таким же ID-шником (если просто одинаковые имена, но разные ID - тоже интересно). Аксапта начинает "путать" эти элементы. Лечится...
а диагностируется запросом
Сервис \ Средства разработки \ Переход к новой версии \ Переименованные прикладные объекты

Согласен про ID.

Но на самом деле, не только они. Были случаи, когда AccessRights слетал и не только при импорте из слоя в слой. Первый признак, что она готовиться к фигне - Admin вдруг не получает права на что-то. Слетание остальных прав - похоже наведенная ошибка.

Но какие условия вызывают ограничения админа в правах - так и не понял. я просто нажимаю кнопку установить полные права для админа.

George, а у твоего admin полные права?
__________________
полезное на axForum, github, vk, coub.
Старый 15.06.2005, 19:16   #6  
George Nordic is offline
George Nordic
Модератор
Аватар для George Nordic
Злыдни
 
4,479 / 1250 (50) ++++++++
Регистрация: 17.12.2003
Адрес: Moscow
Записей в блоге: 9
2 sukhanchik: Да, фича известная, но от этого не легче
Правда, в идеале у нас должно все работать так:
1 База - разработчиков
2 База - аудит/тестовая
3 База - рабочая

в 1 идет разработка на usr. потом накатываются (без идентификаторов) на 2, на usr слой. потом я его чищу, делаю аудит кода, консультант тестирует функциональность, я его поднимаю на cus и тру на usr.
Потом Администратор поднимает на рабочую (с идентификаторами cus слоя, присвоившимися в тестовой) и дает права.
Так в идеале... Кстати, кажись, на рабочую поднимается на usr?! Брр-р-р попадос...

2 Mazzy:
Да, у админа права полные. А хрень со слетом админских прав сам наблюдал неоднократно.

С Уважением,
Георгий
Старый 15.06.2005, 19:23   #7  
sukhanchik is offline
sukhanchik
Administrator
Аватар для sukhanchik
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,275 / 3476 (122) ++++++++++
Регистрация: 13.06.2004
Адрес: Москва
Цитата:
а диагностируется запросом
Спасибо, я про это не знал.
Цитата:
AccessRights слетал и не только при импорте из слоя в слой.
ну я и говорю - главное - ID-шники элементов АОТ... А уж из-за чего они слетели - это уже другой вопрос.
Цитата:
Первый признак, что она готовиться к фигне - Admin вдруг не получает права на что-то
Вставлю свои 5 копеек. Если родительский ключ разрешен, то для разрешения дочернего ключа - запись в табличку не производится. Т.е. считается, что права наследуются. И наоборот, если ключ не разрешен, то подключ также не разрешен. Таким образом (обобщая) - если на родительские ключи у админа есть все права, то для установления доступа к ним, в табличке не должно быть записей, отосящихся к админу и этим ключам. И наоборот - если у пары домен-группа пользователей нет вообще прав, то они могут появиться при "слетании прав" - абсолютно с такой же вероятностью (появились записи), как и у админа - исчезнуть
Старый 15.06.2005, 20:31   #8  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Изначально опубликовано sukhanchik
Если родительский ключ разрешен, то...
Спасибо.
__________________
полезное на axForum, github, vk, coub.
Старый 15.06.2005, 22:46   #9  
glibs is offline
glibs
Member
Сотрудники компании It Box
Most Valuable Professional
Лучший по профессии 2011
Лучший по профессии 2009
 
4,942 / 911 (40) +++++++
Регистрация: 10.06.2002
Адрес: I am from Kyiv, Ukraine. Now I am in Moscow. For private contacts: glibs@hotmail.com
Re: Слетают права при импорте проекта
Цитата:
Изначально опубликовано George Nordic
...
Никто не сталкивался со следующей ситуацией: при импорте проекта (новый функционал или даже просто измененный существующий) слетают настроенные права доступа.
...
Я сталкивался. У меня была проблема с правами, которые пишутся в SysSecurityFormTable и SysSecurityFormControlTable (доступ на поля, заполняемые display-методами). Это ужасно. Проблему пока не решили.
__________________
С уважением,
glibs®
Старый 16.06.2005, 08:46   #10  
KiselevSA is offline
KiselevSA
Злыдни
Аватар для KiselevSA
Злыдни
Лучший по профессии 2015
 
958 / 333 (13) ++++++
Регистрация: 25.01.2002
Адрес: Москва
А почему бы разработчиков не перевести на usp? После ревизии кода подымать его на usr. У usp и usr хоть диапазон id одинаковый.
Старый 16.06.2005, 10:08   #11  
George Nordic is offline
George Nordic
Модератор
Аватар для George Nordic
Злыдни
 
4,479 / 1250 (50) ++++++++
Регистрация: 17.12.2003
Адрес: Moscow
Записей в блоге: 9
Цитата:
Изначально опубликовано KiselevSA
А почему бы разработчиков не перевести на usp? После ревизии кода подымать его на usr. У usp и usr хоть диапазон id одинаковый.
Да, тоже вариант. cus был выбран по двум причинам:
1) Есть еще "буферные" cup и usp, которые можно задействовать. Правда, реально я этой возможность пользовался всего пару раз, и без неё можно нормально обойтись. Правда, можно еще периодически копировать слой в old, но этим никто не хочет заниматься или постоянно забываем.
2) У нас же на cus права куплены! Надо же их приспособить хоть под что-то!

Спасибо всем! Я-то думал, это какая-то наша заморочка. А вон оно как

С Уважением,
Георгий.
Старый 21.09.2005, 11:52   #12  
Hidden is offline
Hidden
Участник
 
199 / 15 (1) ++
Регистрация: 25.03.2004
Адрес: Moscow
Я с этой проблемой уже совсем замучился, народ подскажите никто не решил ее. А то я только и делаю что права настраиваю в Аксапте. Как только что нибудь импортирую так все права слетают. Я могу только на usr слое программировать. Что делать подскажите?
Старый 21.09.2005, 12:08   #13  
George Nordic is offline
George Nordic
Модератор
Аватар для George Nordic
Злыдни
 
4,479 / 1250 (50) ++++++++
Регистрация: 17.12.2003
Адрес: Moscow
Записей в блоге: 9
Хе-хе.
Только на usr слое, говоришь?
Хорошо. МЫ ТОЖЕ.

А теперь внимание:
1) Настраиваешь права, в т.ч. на контролы формы. Все нормально.
2) Пользователь залезает в настройку формы и двигает контролы.
3) Заливаем модификацию
4) Что такое? Где наши прива??

Короче, как вариант: делай бэкап таблиц SysSecurityFormControlTable и SysSecurityFormTable перед накаткой модификаций. Если будешь импортировать со значениями идентификаторов и потом восстанавливать эти таблицы, то есть вероятность, что права не поедут.
Но ну нас это прокатывает через раз... Есть подозрение, что сама форма раздачи прав несет в себе какую-то бяку... При построении дерева что-то не то. Если дороешь, дай знать, ок?

Да, и письмишко напиши.

С Уважением,
Георгий.
Старый 21.09.2005, 17:00   #14  
sukhanchik is offline
sukhanchik
Administrator
Аватар для sukhanchik
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,275 / 3476 (122) ++++++++++
Регистрация: 13.06.2004
Адрес: Москва
Из нарытого
1. Форма раздачи прав несет в себе лишь ту бяку - что при первом просмотре дерева права грузятся в память, после чего там и остаются... до перезапуска Аксапты. Более бяк там нет... Она просто строит дерево
2. Бэкап таблиц SysSecurity* по-хорошему надо делать по-другому:
Модифицируется экспорт/импорт прав в Аксапте таким образом - чтобы в получившемся файле лежали только ИМЕНА элементов АОТ. Т.е. по сути - нужно экспортнуть таблички AccessRightsList и таблички SysSecurity*, заменив при экспорте ID-шники на имена. Ну и ессно обратно - при импорте - подставив вместо имен текущие значения ID-шников. При экспорте - надо не забыть сохранить права перед экспортом. После импорта - их надо перегрузить и обновить дерево в форме
Файлы, в которых сохранены права - можно хранить в сейфе
3. Упаси Бог изменять права в трехуровневой конфигурации. Аксапта сохраняет права по принципу кто последний вышел из нее - тот и прав. А если вы настроили права, а после этого другой юзер вышел - можете смело считать свою работу напрасной. При импорте прав (т.е. изменении данных в табличках) - крайне нежелательно вообще иметь АОС под рукой.... Ибо его наличие аккурат приводит к глюкам, описанным George Nordic
Цитата:
Но ну нас это прокатывает через раз
А так - вполне можно не зависеть от слоев и значений идентификаторов... Но правда нужно постараться
__________________
Возможно сделать все. Вопрос времени
Старый 23.03.2006, 13:10   #15  
Wamr is offline
Wamr
----------------
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
1,737 / 858 (32) +++++++
Регистрация: 15.01.2002
Адрес: Москва
Записей в блоге: 7
Проверка прав после каждого переноса
Написал жобик для проверки прав настроенных на отдельные поля (любые элементы) формы.

PHP код:
static void CheckAccess(Args _args)
{
    
SysSecurityFormControlTable     SysSecurityFormControlTable;
    
SysSecurityFormTable            SysSecurityFormTable;
    
FormRun                         fr;
    
FormBuildDesign                 fbd;
    
Args                            args = new Args();
    
Map                             name2id;
    
Map                             name2label;

    
str 30 getLabel(Object _control)
    {
        switch (
classIdGet(_control))
        {
            case 
classnum(FormBuildStringControl):
            case 
classnum(FormBuildCheckBoxControl):
            case 
classnum(FormBuildGroupControl):
            case 
classNum(FormBuildRealControl):
            case 
classNum(FormBuildIntControl):
            case 
classNum(FormBuildComboBoxControl):
            case 
classNum(FormBuildWindowControl):
            case 
classNum(FormBuildDateControl):
            case 
classNum(FormBuildListBoxControl):
            case 
classNum(FormBuildTimeControl):
                return 
_control.label();
            case 
classNum(FormBuildRadioControl):
            case 
classNum(FormBuildTabPageControl):
                return 
_control.caption();
            case 
classNum(FormBuildButtonControl):
            case 
classNum(FormBuildCommandButtonControl):
            case 
classNum(FormBuildMenuButtonControl):
            case 
classNum(FormBuildFunctionButtonControl):
                return 
_control.text();
            default :
                return 
_control.name();
        }

        return 
_control.name();
    }

    
void fillMap(Object _containerControl)
    {
        
int     i;
        
Object  fbc;

        for( 
1<= _containerControl.controlCount(); ++)
        {
            
fbc _containerControl.controlNum(i);
            if(
fbc.isContainer())
                
fillMap(fbc);
            else
            {
                
name2id.insert(fbc.name(), fbc.id());
                
name2label.insert(fbc.name(), getLabel(fbc));
            }
        }
    }

    
SetPrefix('Проверка прав на контролы');

    while 
select SysSecurityFormTable
        order by DomainId
FormNameUserGroupId
    
{
        
args.name(SysSecurityFormTable.FormName);
        
fr ClassFactory::formRunClassOnClient(args);
        
fbd fr.form().design();

        
name2id = new Map(Types::StringTypes::Integer);
        
name2label = new Map(Types::StringTypes::String);
        
fillMap(fbd);

        
SetPrefix(strFmt("%2 (%1)\t %3"fr.name(), fbd.caption(), SysSecurityFormTable.UserGroupId));

        while 
select SysSecurityFormControlTable
            order by FormControlName
FormControlId
            where SysSecurityFormControlTable
.SysSecurityFormId == SysSecurityFormTable.RecId
        
{
            if(
name2id.exists(SysSecurityFormControlTable.FormControlName) &&
               
name2id.lookup(SysSecurityFormControlTable.FormControlName) == SysSecurityFormControlTable.FormControlId)
                
info(strFmt("%1 (%2) - %3"name2label.lookup(SysSecurityFormControlTable.FormControlName),
                                            
SysSecurityFormControlTable.FormControlNameSysSecurityFormControlTable.AccessType));
            else
            {
                if(
name2label.exists(SysSecurityFormControlTable.FormControlName))
                    
error(strFmt("%1 (%2) - %3"name2label.lookup(SysSecurityFormControlTable.FormControlName),
                                                 
SysSecurityFormControlTable.FormControlNameSysSecurityFormControlTable.AccessType));
                else
                    
error(strFmt("%1 - %2"SysSecurityFormControlTable.FormControlNameSysSecurityFormControlTable.AccessType));
            }
        }
    }

За это сообщение автора поблагодарили: Dron AKA andy (2), glibs (5), Logger (5).
Старый 23.03.2006, 16:47   #16  
Hidden is offline
Hidden
Участник
 
199 / 15 (1) ++
Регистрация: 25.03.2004
Адрес: Moscow
Запустил этот джоб, что за информацию он выдал? Как использовать информацию которую он выдал?
Старый 23.03.2006, 17:32   #17  
Wamr is offline
Wamr
----------------
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
1,737 / 858 (32) +++++++
Регистрация: 15.01.2002
Адрес: Москва
Записей в блоге: 7
синие - актуальные настройки права на элементы формы
красные - утерянные настройки
Старый 23.03.2006, 20:50   #18  
glibs is offline
glibs
Member
Сотрудники компании It Box
Most Valuable Professional
Лучший по профессии 2011
Лучший по профессии 2009
 
4,942 / 911 (40) +++++++
Регистрация: 10.06.2002
Адрес: I am from Kyiv, Ukraine. Now I am in Moscow. For private contacts: glibs@hotmail.com
А я думал, оно сразу и чинит...

Хотя, и за это спасибо.
__________________
С уважением,
glibs®
Старый 24.03.2006, 13:17   #19  
Wamr is offline
Wamr
----------------
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
1,737 / 858 (32) +++++++
Регистрация: 15.01.2002
Адрес: Москва
Записей в блоге: 7
версия 2 - продвинутая
Добавлена возможность автоматического исправления ошибок и удаления мусора.
Как любое автоматическое исправления, имеет свои "особенности". Если будете использовать, то сначала потестируйте внимательно.
PHP код:
static void CheckAccess(Args _args)
{
    
SysSecurityFormControlTable     SysSecurityFormControlTable;
    
SysSecurityFormTable            SysSecurityFormTable;
    
FormRun                         fr;
    
FormBuildDesign                 fbd;
    
Args                            args = new Args();
    
Map                             name2id;
    
Map                             name2label;
    
Dialog                          d = new Dialog('Проверка прав на формах');
    
DialogField                     dfShow;
    
DialogField                     dfUpdate;
    
DialogField                     dfClear;

    
str 30 getLabel(Object _control)
    {
        switch (
classIdGet(_control))
        {
            case 
classnum(FormBuildStringControl):
            case 
classnum(FormBuildCheckBoxControl):
            case 
classnum(FormBuildGroupControl):
            case 
classNum(FormBuildRealControl):
            case 
classNum(FormBuildIntControl):
            case 
classNum(FormBuildComboBoxControl):
            case 
classNum(FormBuildWindowControl):
            case 
classNum(FormBuildDateControl):
            case 
classNum(FormBuildListBoxControl):
            case 
classNum(FormBuildTimeControl):
                return 
_control.label();
            case 
classNum(FormBuildRadioControl):
            case 
classNum(FormBuildTabPageControl):
                return 
_control.caption();
            case 
classNum(FormBuildButtonControl):
            case 
classNum(FormBuildCommandButtonControl):
            case 
classNum(FormBuildMenuButtonControl):
            case 
classNum(FormBuildFunctionButtonControl):
                return 
_control.text();
            default :
                return 
_control.name();
        }
        return 
_control.name();
    }

    
void fillMap(Object _containerControl)
    {
        
int     i;
        
Object  fbc;

        for( 
1<= _containerControl.controlCount(); ++)
        {
            
fbc _containerControl.controlNum(i);
            if(
fbc.isContainer())
                
fillMap(fbc);
            else
            {
                
name2id.insert(fbc.name(), fbc.id());
                
name2label.insert(fbc.name(), getLabel(fbc));
            }
        }
    }

    
dfShow   d.addFieldValue(typeId(NoYesId), true'Отображать сведения в инфолог',
                                                      
'info - корректные права, warning - известен новый id объекта, error - непонятно что');
    
dfUpdate d.addField(typeId(NoYesId), 'Исправлять ID, если найден правильный',
                                           
'Попытка восстановить права на "измененные" объекты формы');
    
dfClear  d.addField(typeId(NoYesId), 'Удалять ссылки на неверный ID (и неисправленные)',
                                           
'Если не стоит "Исправлять..", то удалятся все некорректные настройки');

    if(! 
d.run() || (dfShow.value()   != NoYes::Yes &&
                     
dfUpdate.value() != NoYes::Yes &&
                     
dfClear.value()  != NoYes::Yes)  )
        return;

    
SetPrefix('Проверка прав на контролы');
    
startLengthyOperation();

    while 
select SysSecurityFormTable
        order by DomainId
FormNameUserGroupId
    
{
        
args.name(SysSecurityFormTable.FormName);
        
fr ClassFactory::formRunClassOnClient(args);
        
fbd fr.form().design();

        
name2id = new Map(Types::StringTypes::Integer);
        
name2label = new Map(Types::StringTypes::String);
        
fillMap(fbd);

        
SetPrefix(strFmt("%2 (%1)\t %3"fr.name(), fbd.caption(), SysSecurityFormTable.UserGroupId));

        try
        {
            
ttsbegin;
            
SysSecurityFormControlTable.selectForUpdate(dfClear.value() || dfUpdate.value());

            while 
select SysSecurityFormControlTable
                order by FormControlId DESC
FormControlName
                where SysSecurityFormControlTable
.SysSecurityFormId == SysSecurityFormTable.RecId
            
{
                if(
name2id.exists(SysSecurityFormControlTable.FormControlName) &&
                   
name2id.lookup(SysSecurityFormControlTable.FormControlName) == SysSecurityFormControlTable.FormControlId)
                {
                    if(
dfShow.value() == NoYes::Yes)
                        
info(strFmt("%1 (%2) - %3"name2label.lookup(SysSecurityFormControlTable.FormControlName),
                                                
SysSecurityFormControlTable.FormControlNameSysSecurityFormControlTable.AccessType));
                }
                else
                {
                    if(
name2label.exists(SysSecurityFormControlTable.FormControlName))
                    {
                        if(
dfShow.value() == NoYes::Yes)
                            
warning(strFmt("%1 (%2) - %3"name2label.lookup(SysSecurityFormControlTable.FormControlName),
                                                     
SysSecurityFormControlTable.FormControlNameSysSecurityFormControlTable.AccessType));
                        if(
dfUpdate.value() == NoYes::Yes)
                        {
                            
SysSecurityFormControlTable.FormControlId name2id.lookup(SysSecurityFormControlTable.FormControlName);
                            
SysSecurityFormControlTable.update();
                        }
                        else if(
dfClear.value() == NoYes::Yes)
                            
SysSecurityFormControlTable.delete();
                    }
                    else
                    {
                        if(
dfShow.value() == NoYes::Yes)
                            
error(strFmt("%1 - %2"SysSecurityFormControlTable.FormControlNameSysSecurityFormControlTable.AccessType));

                        if(
dfClear.value() == NoYes::Yes)
                            
SysSecurityFormControlTable.delete();
                    }
                }
            }

            
ttscommit;
        }
        catch
        {
            
error("Исправление не удалось!");
            
// Если исправление для некоторых форм-групп не удалось, то можно
            // исправить сортировку order by FormControlId на ASC и запустить еще раз
        
}
    }

    
ttsbegin;

    
SetPrefix('Права на контролы без привязок к формам');
    while 
select forupdate SysSecurityFormControlTable
    notexists join SysSecurityFormTable
        where SysSecurityFormTable
.RecId == SysSecurityFormControlTable.SysSecurityFormId
    
{
        if(
dfShow.value() == NoYes::Yes)
            
error(strFmt("%1 (%2) %3"SysSecurityFormControlTable.FormControlNameSysSecurityFormControlTable.FormControlIdSysSecurityFormControlTable.FormControlType));
        if(
dfClear.value() == NoYes::Yes)
            
SysSecurityFormControlTable.delete();
    }

    
SetPrefix('Ссылка на формы без настроек на контролы');
    while 
select forupdate SysSecurityFormTable
    notexists join SysSecurityFormControlTable
        where SysSecurityFormControlTable
.SysSecurityFormId == SysSecurityFormTable.RecId
    
{
        if(
dfShow.value() == NoYes::Yes)
            
error(strFmt("%1 (%2) %3"SysSecurityFormTable.FormNameSysSecurityFormTable.DomainIdSysSecurityFormTable.UserGroupId));
        if(
dfClear.value() == NoYes::Yes)
            
SysSecurityFormTable.delete();
    }

    
ttscommit;
    
endLengthyOperation();

За это сообщение автора поблагодарили: glibs (4), George Nordic (5), Qaz Qwerty (1).
Старый 06.11.2008, 18:25   #20  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,875 / 3123 (112) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Wamr спасибо вам за предоставленную информацию.

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

Реальный пример.

1. Используются домены.
2. Ключ доступа к доменам включен (возможно это не влияет на воспроизводимость глюка, привожу просто для справки)
3. Есть 2 компании 100 и 200. Им соответсвуют домены Домен100 и Домен200
4. Пользователь является членом групп Admin и Группа1
5. Для группы Группа1, формы Справочник1 и домена Домен200 в табличках SysSecurityFormTable, SysSecurityFormControlTable заведены настройки, скрывающие определенные.
6. Справочник1 отображает данные из виртуальной компании - так что все равно откуда его открывать.

Теперь прикол.
Если пользователь первый раз открывает форму справочник1 в компании 100 (т.е. Домен100) - то все нормально - кнопки ему доступны.
Если же он первый раз открывает форму справочник1 в компании 200 (т.е. Домен200) - то кнопки ему уже недоступны ! Если при этом переключиться в компанию 100 и открыть справочник там, то кнопки станут доступны. И будут доступны, если обратно перключиться в компанию 200 и открыть в 3-й раз форму справочник1. Такое ощущение что один раз догрузив правильные настройки - система их уже не меняет.

Все это очень странно. Выглядит как шаманство. Самое паршивое, что глюк действует на Админа !
Теперь понимаю почему техподдержка в ответ на просьбы настроить права нервно скрежещет зубами и тихо матерится.

P.S.

Ax 3.0 KR3 SP5

1-й джоб wamr-a натравил - проблем не выявлено. Красных сообщений не было. Только выведена информация о том какие кнопки скрыты.

Последний раз редактировалось Logger; 06.11.2008 в 18:29.
Теги
ax3.0, id объекта, xpo, законченный пример, импорт, права доступа

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Бага при импорте проекта Logger DAX: Программирование 0 09.12.2008 13:57
Сколько процентов от стоимости проекта идет на ФОТ? (анонимный опрос) Spider DAX: Прочие вопросы 1 27.09.2006 08:22
Проблемы при импорте и экспорте проекта FiGr DAX: Прочие вопросы 0 23.05.2006 16:41
Удаление проекта Maxim Gorbunov DAX: Программирование 0 24.12.2001 23:04

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 08:59.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.