as far as I know, you cannot pass any sort of thing as a record, array, or other weird things though due to the fact that the type variant does not support them.
I usually create a pointer-like alternative using an array of <YourType>; but do to the fact you are using more than one script, you will need to create functions like TUser_GetTagId(Ptr: word): string; etc. which are for the basic types, and mayb TUser_GetSkill(Ptr: word; Index: byte): integer; for that.
another extension to that alternative is to have both types be defined on both sides, and create a function that'll use these TUser_* functions to create another object of TUser, and then possible remove the content @ the pointer (unless ur passing more than 1 value of TUser, you really don't even need an array of TUser, just one instance of it). some functions that can hide all the hidden TUser_* and pointer stuff, and in the end just give you TUser is definitely nice.
another idea: cross func something like SetData(all TUser data goes here as various parameters); then in other script u can access it kuz it'll set it's own local TUser object to the stuff set by SetData - might be a problem with the array though
or just do ur crossfunc with all the data in the parameters - again might be a problem with the array though