Добавлена возможность автоматического исправления ошибок и удаления мусора.
Как любое автоматическое исправления, имеет свои "особенности". Если будете использовать, то сначала потестируйте внимательно.
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( i = 1; i <= _containerControl.controlCount(); i ++)
{
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, FormName, UserGroupId
{
args.name(SysSecurityFormTable.FormName);
fr = ClassFactory::formRunClassOnClient(args);
fbd = fr.form().design();
name2id = new Map(Types::String, Types::Integer);
name2label = new Map(Types::String, Types::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.FormControlName, SysSecurityFormControlTable.AccessType));
}
else
{
if(name2label.exists(SysSecurityFormControlTable.FormControlName))
{
if(dfShow.value() == NoYes::Yes)
warning(strFmt("%1 (%2) - %3", name2label.lookup(SysSecurityFormControlTable.FormControlName),
SysSecurityFormControlTable.FormControlName, SysSecurityFormControlTable.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.FormControlName, SysSecurityFormControlTable.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.FormControlName, SysSecurityFormControlTable.FormControlId, SysSecurityFormControlTable.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.FormName, SysSecurityFormTable.DomainId, SysSecurityFormTable.UserGroupId));
if(dfClear.value() == NoYes::Yes)
SysSecurityFormTable.delete();
}
ttscommit;
endLengthyOperation();
}