На базе приведенного примера сделал джобик, который позволяет "поднять" конфигурационный ключ на таблицах с нижележащего слоя, если на текущем слое он после обновления или еще каких действий получился "неправильный". В режиме проверки (если на вопрос "изменять конф. ключи" ответить "Нет") только выводит информацию о найденных расхождениях. Если прописываемый ключ оказался выключенным, а прежний - включенным, выводится предупреждение и запрашивается дополнительное подтверждение. Но в любом случае до синхронизации изменения не вступят в силу.
X++:
#macrolib.Properties
static void ChangeConfigurationKey(Args _args)
{
UtilElements ueCurrLayer;
UtilElements uePrevLayer;
CheckFix modeCheckFix;
Counter nChanged;
Counter nFound;
boolean tryChangeConfigKey4Table(UtilElements _ue, UtilEntryLevel _prevLayer)
{
SysInfoAction infoAction;
TreeNode tnCurr;
TreeNode tnPrev;
configurationkeyid currKeyId;
configurationkeyid prevKeyId;
str currKeyName;
str prevKeyName;
str warnMsg;
boolean isConfirmed;
boolean ret;
;
setprefix( strfmt( "@SYS55826", _ue.name ) );
if (_ue.utilLevel <= _prevLayer)
{
throw error( Error::wrongUseOfFunction( funcname() ) );
}
tnCurr = xUtilElements::getNode( _ue );
if (tnCurr)
{
tnPrev = tnCurr.getNodeInLayer( _prevLayer, false );
}
if (tnPrev)
{
currKeyName = findProperty( tnCurr.AOTgetProperties(), #PropertyConfigurationkey );
prevKeyName = findProperty( tnPrev.AOTgetProperties(), #PropertyConfigurationkey );
if (currKeyName != prevKeyName)
{
infoAction = new SysInfoAction_Properties( tnCurr.treeNodePath() );
info( strfmt( @"Конф.ключ на %1 (%2) отличается от %3 (%4)", tnCurr.applObjectLayer(), currKeyName, _prevLayer, prevKeyName ), '', infoAction );
currKeyId = configurationkeyname2id( currKeyName );
prevKeyId = configurationkeyname2id( prevKeyName );
isConfirmed = modeCheckFix == CheckFix::Fix;
if ( !isConfigurationKeyEnabled( prevKeyId )
&& isConfigurationKeyEnabled( currKeyId )
)
{
warnMsg = strfmt( @"Конфигурационный ключ %1 выключен, изменения могут привести к потере данных", prevKeyName );
if (modeCheckFix == CheckFix::Fix)
{
isConfirmed = Box::yesNo( warnMsg + @". Все равно изменить?", DialogButton::No, "@SYS866" ) == DialogButton::Yes;
}
else
{
warning( warnMsg );
}
}
if (isConfirmed)
{
tnCurr.AOTsetProperties( setProperty( tnCurr.AOTgetProperties(), #PropertyConfigurationkey, prevKeyName ) );
tnCurr.AOTsave();
tnCurr.AOTcompile();
info( prevKeyName ? strfmt( @"Ключ изменен на %1", prevKeyName ) : @"Ключ удален" );
ret = true;
}
}
}
return ret;
}
;
setprefix( @"Перебивка конфигурационных ключей на таблицах" );
switch (Box::yesNoCancel( @"Изменять конфигурационные ключи?", DialogButton::No ))
{
case DialogButton::Yes :
modeCheckFix = CheckFix::Fix;
break;
case DialogButton::Cancel :
error( "@SYS18738" );
return;
default :
break;
}
while select ueCurrLayer
where ueCurrLayer.utilLevel == currentAOLayer()
&& ueCurrLayer.recordType == UtilElementType::Table
{
select firstonly reverse utilLevel, RecId
from uePrevLayer
order by utilLevel
where uePrevLayer.name == ueCurrLayer.name
&& uePrevLayer.recordType == ueCurrLayer.recordType
&& uePrevLayer.utilLevel < ueCurrLayer.utilLevel
;
if (uePrevLayer)
{
nFound++;
if (tryChangeConfigKey4Table( ueCurrLayer, uePrevLayer.utilLevel ))
{
nChanged++;
}
}
}
info( strfmt( @"Обработано таблиц: %1, изменено %2", nFound, nChanged ) );
}