Цитата:
Сообщение от
pedrozzz
Но,таблицы - это не только поля, а еще и группы полей, индексы и прочее. С ними пока не взлетело и нет времени разобраться. Но именно поля работают

Не взлетело потому, что вставка при сравнении использует метод TreeNode.AOTDrop, который не работает с индексами и группами полей.
Кстати говоря, с полями эта правка будет нормально работать только в 2012. Сравнение происходит построчно, без учета прочих метаданных сравниваемого объекта, т.е. текстовое представление объектов (в нашем случае - списков полей) должно быть одинаковым для обоих версий сравниваемых объектов (в нашем случае порядок существующих в обоих версиях полей должен быть одинаковым). Поскольку при вставке полей ядром не учитывается второй параметр AOTDrop - позиция вставки - новое поле всегда вставляется в начало узла Fields таблицы (до сохранения/восстановления), а в нормальном представлении поля отсортированы, то получается забавный результат. Он как раз и лечится правкой метода hasOrdering, которая заставляет при формировании текстового представления сортировать список полей по алфавиту.
В 2009 видимо потребуется уже более тщательное перепиливание, т.к. там нужно учитывать, что поля сортируются по id.
Для того, чтобы индексы и группы не помечались для добавления (ибо не работает), надо немного подправить изменения в canMergeInsertSubnodes:
X++:
public boolean canMergeInsertSubnodes(SysComparable _top, SysCompareContextProvider _context)
{
//...
//Добавить в switch
case UtilElementType::Table:
if (this.parmTreeNode().treeNodeType().id() == #NT_DBFIELDLIST)
{
return true;
}
break;
//..
}