В копилку "бесполезного"
Задача: множество отчетов, данные выкидываются в excel. Соответственно, иногда необходимо найти запись в справочнике Аксапты, по коду. Копируем ячейку с кодом, лезем в аксапту, открываем форму справочника, фильтруемся...
Вот, что бы убрать это "фильтруемся", и предлагаю следующий код (в нем ничего сложного):
X++:
void buf2range(FormDataSource _formDS)
{
TextBuffer textBuffer = new TextBuffer();
DictTable dictTable;
SysDictField dictField;
Common common;
QueryBuildRange queryBuildRange;
;
if (_formDS &&
WinAPI::isControlButtonDown()) // можно убрать "только при нажатом Ctrl".
{
textBuffer.fromClipboard();
dictTable = new DictTable(_formDS.cursor().TableId);
if (dictTable.isMap() ||
dictTable.isView() ||
! dictTable.primaryKeyField())
break;
dictField = new SysDictField(dictTable.id(),
dictTable.primaryKeyField());
if ((dictField.baseType() == Types::String ||
dictField.baseType() == Types::RString) &&
dictField.fieldSize() >= textBuffer.size())
{
common = dictTable.makeRecord();
select recId from common
where common.(dictField.id()) == textBuffer.getText();
if (common)
{
queryBuildRange = SysQuery::findOrCreateRange(_formDS.query().dataSourceNo(_formDS.query().levelTable(dictTable.id())),
dictField.id());
if (queryBuildRange && ! queryBuildRange.value())
queryBuildRange.value(queryValue(textBuffer.getText()));
}
}
}
}
Метод можно поместить в класс SysSetupFormRun, и вызывать из метода init() этого класса:
X++:
public void init()
{
;
super();
SysSecurityFormSetup::loadSecurity(this);
// --> Slava, 01/02-07 /* */
if (this.objectSet())
this.AA_process(this.objectSet());
// <-- Slava, 01/02-07
}