В общем, вроде нашел решение.
Вот джоб, которым тестировал:
Код:
static void Tutorial_ChangeFieldId(Args _args)
{
UtilIdElements uie;
SQLDictionary dict;
;
ttsbegin;
select forupdate uie
where uie.name == "Field2" &&
uie.parentId == tableNum(Tutorial_ChangeFieldId);
if (!uie)
warning("Запись в UtilIdElements не найдена");
else
{
uie.id = 50005;
uie.update();
}
// appl.dbSynchronize(tableNum(Tutorial_ChangeFieldId), false);
// select forUpdate dict
// where dict.tabId == tableNum(Tutorial_ChangeFieldId) && dict.fieldId == fieldNum(Tutorial_ChangeFieldId, Field2);
// if (!uie)
// warning("Запись в SQLDictionary не найдена");
// else
// {
// dict.fieldId = 50005;
// dict.update();
// }
ttscommit;
}
После его запуска у меня становится имя поля UNKNOWN и теряются свойства (делаю "Восстановить" сразу после запуска).
НО: если тупо после этого сделать синхронизацию таблицы - о чудо, все восстановилось! Id поменялся, данные в таблице остались. Абсолютно интуитивно непонятный механизм - смотрим на какую-то фигню (UNKNOWN), после синхронизации получаем конфетку
То, что закомментировал, оказалось ненужным. Программная синхронизация таблицы не помогает, нужно почему-то обязательно через АОТ делать. Так что решение таково:
программно изменяем IDшники полей в UtilIdElements и делаем синхронизацию таблицы. Вуаля!
Спасибо всем, принявшим участие в эксперименте.