Bom dia, Crystian!
Passei por uma situação similar e corrigi usando a classe FwSx3Util e a função GetSx3Cache. Segue exemplo abaixo:
_cAlias := 'ZD3'
_aCpoSX3 := FwSX3Util():GetAllFields(_cAlias)
_cAcols := "ZD3_COD/ZD3_DESCRI/ZD3_UM"
For i := 1 To Len(_aCpoSX3)
If(X3Uso(GetSx3Cache(_aCpoSX3[i], 'X3_USADO')) .And. AllTrim(GetSx3Cache(_aCpoSX3[i], 'X3_CAMPO')) $ _cAcols)
nUsado++
aAdd(_aHeader, {AllTrim(GetSx3Cache(_aCpoSX3[i], 'X3_TITULO')),;
AllTrim(GetSx3Cache(_aCpoSX3[i], 'X3_CAMPO')),;
GetSx3Cache(_aCpoSX3[i], 'X3_PICTURE'),;
GetSx3Cache(_aCpoSX3[i], 'X3_TAMANHO'),;
GetSx3Cache(_aCpoSX3[i], 'X3_DECIMAL'),;
"AllWaysTrue()",;
GetSx3Cache(_aCpoSX3[i], 'X3_USADO'),;
GetSx3Cache(_aCpoSX3[i], 'X3_TIPO'),;
GetSx3Cache(_aCpoSX3[i], 'X3_F3'),;
GetSx3Cache(_aCpoSX3[i], 'X3_CONTEXT'),;
GetSx3Cache(_aCpoSX3[i], 'X3_CBOX'),;
GetSx3Cache(_aCpoSX3[i], 'X3_RELACAO'),;
GetSx3Cache(_aCpoSX3[i], 'X3_WHEN'),;
GetSx3Cache(_aCpoSX3[i], 'X3_VISUAL'),;
GetSx3Cache(_aCpoSX3[i], 'X3_VLDUSER'),;
GetSx3Cache(_aCpoSX3[i], 'X3_PICTVAR'),;
If(GetSx3Cache(_aCpoSX3[i], 'X3_OBRIGAT') == "€", .T., .F.)} )
Endif
Next i