$engine JScript
$uname selectColumn
$dname Выбор колонки табличного поля
$addin stdlib
stdlib.require("SelectValueDialog.js", SelfScript);
// (c) Александр Орефков
// Небольшой скрипт, позволяющий быстро вставить в код название любой из колонок табличных
// полей, расположенных на обычной форме
// Требует для работы svcsvc
SelfScript.self['macrosВыбрать колонку ТабличногоПоля'] = function()
{
var useSvcsvc = true;
try{
var sel = new ActiveXObject('Svcsvc.Service')
}catch(e)
{
//Message("Не удалось создать объект 'Svcsvc.Service'. Зарегистрируйте svcsvc.dll")
//return
useSvcsvc = false;
}
// Получаем активное текстовое окно
var wnd = snegopat.activeTextWindow()
if(!wnd)
return
// Проверим, что это Форма.
// Свойство mdProp показывает, к какому свойству объекта метаданных относится окно
if(wnd.mdProp.name(1) != "Форма")
return
// Получим само свойство "Форма". Это "внешнее" свойство, т.е. оно храниться отдельно от
// самого объекта метаданных.
// При получении можно указывать гуид свойства, или его имя, или порядковый номер
var extProp = wnd.mdObj.getExtProp(wnd.mdProp.id)
// Сохраним текущее состояние свойства "Форма" в файл. Так как файл в saveToFile не передан, то
// сохранение произойдет в псевдо-файл в памяти.
var file = extProp.saveToFile()
// Для обычных форм формат файла формы является "файлом файлов", storage. Поэтому будем
// рассматривать его как storage. Для управляемых форм - это не так, там обычный текст utf-8
try{
// создадим хранилище на базе файла. Для управляемых форм тут вывалится в catch
var stg = v8Files.attachStorage(file)
// Получим из хранилища содержимое под-файла form
var text = stg.open("form", fomIn).getString(dsUtf8)
//Message(text)
// Простым регэкспом выдернем встречающиеся колонки
var re = /\{6,3,0,\d\},\d,0,0,4,0,"(.+)"/g
var columns = {}
while(re.exec(text))
columns[RegExp.$1] = 1
var arrOfColumns = []
for(var k in columns)
arrOfColumns.push(k)
if (useSvcsvc){
var choice = sel.FilterValue(arrOfColumns.join("\r\n"), 1 | 4);
} else {
var dlg = new SelectValueDialog("Выбор колонки табличного поля", arrOfColumns);
sel = dlg.selectValue();
var choice = '';
if (sel){
choice = dlg.selectedValue;
}
}
if(choice.length)
{
wnd.selectedText = choice
return true
}
}catch(e)
{
// Сюда попадаем, если это управляемая форма. Ее можно прочитать так
//file.seek(0, fsBegin)
//Message(file.getString(dsUtf8))
}
}