В общем, победил я еe (Axapta'у). Сделал на интерфейсах без макросов.
Хотя этот способ можно так-же охарактеризовать как перректальный
X++:
#define.msoPropertyTypeDate(0x00000003)
#define.msoPropertyTypeString(0x00000004)
static void AndyD_Excel_DocProperty(Args _args)
{
COMExcelDocument_RU excel;
FileName fileName = "";
COM doc;
COM comDocProp,
comOneProp;
ComVariant var;
ComDispFunction funcGet;
ComDispFunction funcSet;
COMVariant varArg1;
COMVariant varArg2;
COMVariant varArg3;
COMVariant varArg4;
COMVariant varRet;
;
excel = new ComExcelDocument_RU();
excel.newFile(fileName,true);
doc = excel.getComDocument();
// ------------------ Запись в BuiltinDocumentProperties
comDocProp = doc.BuiltinDocumentProperties();
funcGet = new ComDispFunction(comDocProp, "Item", COMDispContext::PropertyGet);
varArg1 = new COMVariant(COMVariantInOut::In, COMVariantType::VT_BSTR);
varArg1.bStr("Author");
varRet = new COMVariant(COMVariantInOut::OUT_RETVAL, COMVariantType::VT_DISPATCH);
funcGet.call(varArg1, varRet);
comOneProp = COM::createFromInterface(varRet.iDispatch());
funcSet = new ComDispFunction(comOneProp, "Value", COMDispContext::PropertyPut);
varRet = new COMVariant(COMVariantInOut::In, COMVariantType::VT_BSTR);
varRet.bStr((select UserInfo where UserInfo.id == curuserId()).Name + "-Builtin");
funcSet.call(varRet);
// Пример получения значения
funcSet = new ComDispFunction(comOneProp, "Value", COMDispContext::PropertyGet);
varRet = new COMVariant(COMVariantInOut::Out_retVal, COMVariantType::VT_BSTR);
funcSet.call(varRet);
info(varRet.bStr());
funcGet = new ComDispFunction(comDocProp, "Item", COMDispContext::PropertyGet);
varArg1 = new COMVariant(COMVariantInOut::In, COMVariantType::VT_BSTR);
varArg1.bStr("Creation Date");
varRet = new COMVariant(COMVariantInOut::OUT_RETVAL, COMVariantType::VT_DISPATCH);
funcGet.call(varArg1, varRet);
comOneProp = COM::createFromInterface(varRet.iDispatch());
funcSet = new ComDispFunction(comOneProp, "Value", COMDispContext::PropertyPut);
varRet = new COMVariant(COMVariantInOut::In, COMVariantType::VT_DATE);
varRet.date(today());
funcSet.call(varRet);
// ------------------ Запись в CustomDocumentProperties
comDocProp = doc.CustomDocumentProperties();
funcSet = new ComDispFunction(comDocProp, "Add", COMDispContext::Method);
varArg1 = new COMVariant(COMVariantInOut::In, COMVariantType::VT_BSTR);
varArg1.bStr("Автор");
varArg2 = new COMVariant(COMVariantInOut::In, COMVariantType::VT_BOOL);
varArg2.boolean(false);
varArg3 = new COMVariant(COMVariantInOut::In, COMVariantType::VT_INT);
varArg3.int(#msoPropertyTypeString);
varArg4 = new COMVariant(COMVariantInOut::In, COMVariantType::VT_BSTR);
varArg4.bStr((select UserInfo where UserInfo.id == curuserId()).Name + "-Custom");
funcSet.call(varArg1, varArg2, varArg3, varArg4);
varArg1.bStr("Дата создания");
varArg3.int(#msoPropertyTypeDate);
varArg4 = new COMVariant(COMVariantInOut::In, COMVariantType::VT_DATE);
varArg4.date(today());
funcSet.call(varArg1, varArg2, varArg3, varArg4);
// Пример получения значения
funcGet = new ComDispFunction(comDocProp, "Item", COMDispContext::PropertyGet);
varArg1 = new COMVariant(COMVariantInOut::In, COMVariantType::VT_BSTR);
varArg1.bStr("Автор");
varRet = new COMVariant(COMVariantInOut::OUT_RETVAL, COMVariantType::VT_DISPATCH);
funcGet.call(varArg1, varRet);
comOneProp = COM::createFromInterface(varRet.iDispatch());
funcSet = new ComDispFunction(comOneProp, "Value", COMDispContext::PropertyGet);
varRet = new COMVariant(COMVariantInOut::Out_retVal, COMVariantType::VT_BSTR);
funcSet.call(varRet);
info(varRet.bStr());
}