Показать сообщение отдельно
Старый 25.09.2018, 13:48   #6  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5788 (200) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Я в свое время столкнулся с тем, что 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()
За это сообщение автора поблагодарили: AlGol (3), raz (10), sukhanchik (8), Logger (8).