По аналогии с
выше приведенным постом tricky, я сделал для
себя выпадающий список (Lookup) для всех полей таблицы не являющимися системными:
Результат:

- В \Data Dictionary\Base Enums\SysPickListType добавить элемент, назовем его к примеру FieldsUsersLabels (Пользовательские поля с названием)
- В классе создадим метод \Classes\Global\pickFieldUserLabel
X++:
static int pickFieldUserLabel(tableId tableId)
{
Object formRun;
Args args;
;
args = new Args(formstr(SysPick));
args.parm(strRFix(int2str(SysPickListType::FieldsUsersLabels),2)+int2str(tableId));
formRun = classfactory.formRunClass(args);
formRun.init();
formRun.run();
formRun.wait();
if (formRun.selection())
return formRun.selection();
return 0;
}
- В класс создадим метод \Classes\sysPickList\fillFieldsUserLabesMap:
X++:
public static client container fillFieldsUserLabesMap(str _argsParm)
{
TmpSysTableField tmpSysTableField;
DictTable dictTable = new DictTable(str2int(_argsParm));
Map map = new Map(Types::Integer, Types::String);
//Variables
DictField dictField;
SysDimension dim;
str num = '';
;
if (dictTable &&
dictTable.rights() > AccessType::NoAccess)
{
tmpSysTableField = TmpSysTableField::findTableFields(tmpSysTableField, dictTable.id());
while select tmpSysTableField
{
dictField = new dictField(dictTable.id(), tmpSysTableField.ExtendedFieldId);
if(!dictField.isSystem())
{
if(tmpSysTableField.FieldName LIKE "*Dimension*")
num = "[" + int2str(enum2int(str2Enum(dim, tmpSysTableField.FieldLabel)) + 1) + "]";
else
num = "";
map.insert(tmpSysTableField.ExtendedFieldId, tmpSysTableField.FieldName + num + " (" + tmpSysTableField.FieldLabel + ")" );
}
}
}
return map.pack();
}
- В методе init этого же класса добавить примерно такие строки (в блоке switch(sysPickListType)):
X++:
case SysPickListType::FieldsUsersLabels :
imageRes = #imageField;
caption = "Пользовательские поля с названием";
designWidth = #designLargeWidth;
if (!map)
{
map = Map::create(sysPickList::fillFieldsUserLabesMap(parmTxt));
}
break;
- Вызываем метод:
X++:
Global::pickFieldUserLabel(tableNum(CustTable));
Для примера можно выбрать форму для изучения
\Forms\PBATreeTable.
Пример Lookup метода:
X++:
void lookup()
{
fieldId id;
//AnyUserTable - таблица куда сохраняем поле
;
id = pickFieldUserLabel(tableNum(CustTable));
if (! id)
return;
AnyUserTable.FieldName = fieldid2name(tableNum(CustTable),id);
AnyUserTable_ds.refresh();
}
P.S. Спасибо
tricky , за хороший пост.