Я в свое время столкнулся с тем, что buffer.TableId для таблиц, использующих наследование, зачастую возвращает идентификатор не совсем той таблицы, к которой относится буфер. Вместо этого обычно возвращается идентификатор одной из родительских таблиц, явно фигурирующих в коде во время компиляции - см. также
А что такого принципиального в 2012? По моему хороший разработчик без труда в ней разберется Нужную информацию содержит поле buffer.RelationType, но тут есть нюанс: в интерпретаторе Х++ обращение к этому полю безопасно даже для Common, а вот при генерации CIL это приводит к ошибке компиляции. Более безопасным оказалось вызывать buffer.getInstanceRelationType() - он возвращает
название конкретной таблицы-наследника либо пустую строку, если таблица не входит в иерархию наследования. В итоге для определения во время выполнения "настоящего" типа табличного буфера с учетом возможного наследования получился такой вспомогательный метод:
X++:
// возвращает tableId таблицы либо, если таблица поддерживает наследование, то tableId конкретного "наследника"
// safe тут относится к генерации кода CIL, которая валится на простом обращении к Common.RelationType
public static TableId getTableIdOrReltaionTypeSafe(Common _record)
{
TableNameShort tableName = _record.getInstanceRelationType();
TableId ret = tableName2id(tableName);
;
if (!ret)
{
ret = _record.TableId;
}
return ret;
}
Полученное значение уже можно использовать, скажем, в new DictTable(tableId).makeRecord()