Artifact 9f13f6e39cb6f29e108f45cfc91df05b37c23ba1:
- File AnalizeEventSubscript.js — part of check-in [81900b4aec] at 2012-11-23 06:42:58 on branch trunk — Переделал поиск метода-обработчика на снегопатовский парсер. Годится как пример правильного поиска метода в модуле. (user: orefkov size: 7437) [more...]
$engine JScript $uname AnalizeEventSubscript $dname Анализ подписок на события $addin vbs $addin global $addin stdlib $addin stdcommands // (c) Александр Орефков // Небольшой скрипт, показывающий отчет по подпискам на события объектов метаданных. // Идея и схема компоновки данных взята из разработки Владислава Данилина "Анализ подписок на события" // http://infostart.ru/public/123745/ global.connectGlobals(SelfScript) var form = loadScriptForm(SelfScript.fullPath.replace(/js$/, 'ssf'), SelfScript.self) form.Результат.Columns.Add("mdobj") function ТаблицаПодписок() { vt = v8New("ТаблицаЗначений") vt.Колонки.Добавить("Метаданные"); vt.Колонки.Добавить("Объект"); vt.Колонки.Добавить("Имя"); vt.Колонки.Добавить("Событие"); vt.Колонки.Добавить("Обработчик"); vt.Колонки.Добавить("mdobj"); vt.Колонки.Добавить("event"); choice = v8New("СписокЗначений") for(var i = 0, c = metadata.openedCount; i < c; i++) { var container = metadata.getContainer(i) try{ if(container.rootObject.childObjectsCount("ПодпискиНаСобытия") > 0) choice.Add(container, container.identifier) }catch(e){} } if(choice.Count() == 0) { MessageBox("Нет конфигураций с подписками") return null } else if(choice.Count() == 1) choice = choice.Get(0) else choice = choice.ChooseItem("Выберите конфигурацию для отчета") if(!choice) return null var container = choice.Value var mdObj = container.rootObject //debugger for(var i = 0, c = mdObj.childObjectsCount("ПодпискиНаСобытия"); i < c; i++) { var event = mdObj.childObject("ПодпискиНаСобытия", i) var typeString = ЗначениеВСтрокуВнутр(event.property("Источник")) var typesUUIDs = typeString.replace(/\n/g, "").replace(/\{"#",f5c65050-3bbb-11d5-b988-0050bae0a95d,\{"Pattern",|\}\}|"#",/g, '').split(',') for(var idx in typesUUIDs) { var obj = container.findByTypeUUID(typesUUIDs[idx]) var mdClassName = obj.mdclass.name(1, true) if(!mdClassName.length) { obj = container.rootObject mdClassName = " Конфигурация" } if(obj) { var row = vt.Add() row.Имя = event.name row.Событие = toV8Value(event.property("Событие")).presentation() row.Обработчик = toV8Value(event.property("Обработчик")).presentation() row.Объект = obj.name row.Метаданные = mdClassName row.mdobj = obj row.event = event } } } vt.Sort("Метаданные,Объект,Имя") form.ЭлементыФормы.Конфигурация.Заголовок = container.identifier return vt } function makeReport() { var source = ТаблицаПодписок() if(!source) return var tree = form.Результат tree.Rows.Clear() var lastMdName, lastMdRow, lastObjName, lastObjRow for(var rows = new Enumerator(source); !rows.atEnd(); rows.moveNext()) { var row = rows.item() if(row.Метаданные !== lastMdName) { lastMdName = row.Метаданные lastMdRow = tree.Rows.Add() lastMdRow.Событие = lastMdName lastMdRow.mdobj = row.mdobj lastObjName = undefined } if(row.Объект !== lastObjName) { lastObjName = row.Объект lastObjRow = lastMdRow.Rows.Add() lastObjRow.Событие = lastObjName lastObjRow.mdobj = row.mdobj } var tr = lastObjRow.Rows.Add() tr.Событие = row.Событие tr.Имя = row.Имя tr.Обработчик = row.Обработчик tr.mdobj = row.event } for(var rows = new Enumerator(tree.Rows); !rows.atEnd(); rows.moveNext()) form.ЭлементыФормы.Результат.Развернуть(rows.item(), false) } function macrosОткрытьОтчет() { form.Открыть() } function CmdPanelСформировать(Кнопка) { makeReport() } function РезультатПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки) { if(ДанныеСтроки.val.mdobj) ОформлениеСтроки.val.Cells.Событие.УстановитьКартинку(ДанныеСтроки.val.mdobj.picture) } String.prototype.right = function(len) { return this.substr(this.length - len) } function openModuleProc(name, container) { var handler = name.split(".") // Попробуем получить объект метаданных - общий модуль с указанным именем try{ var modulMdObj = container.rootObject.childObject("ОбщиеМодули", handler[0]) }catch(e){} if(modulMdObj) { // Откроем общий модуль var txtEdt = modulMdObj.openModule("Модуль") // Распарсим текст модуля var parser = snegopat.parseSources(txtEdt.text) var idxOfMethodName = parser.idxOfName(handler[1]) // Найдем индекс названия метода в списке идентификаторов if(idxOfMethodName >= 0) { var found = parser.reStream.match(new RegExp("(Pc|Fu)Nm" + ("000000" + idxOfMethodName).right(6) + "Lp")) if(found) { var line = parser.lexem(parser.posToLexem(found.index + 2)).line txtEdt.setCaretPos(line + 1, 1) // Чтобы процедура по-любому развернулась и окно проскроллилось txtEdt.setSelection(line, 1, line, txtEdt.line(line).length + 1) } } } } function РезультатВыбор(Элемент, ВыбраннаяСтрока, Колонка, СтандартнаяОбработка) { СтандартнаяОбработка.val = false var mdobj = ВыбраннаяСтрока.val.mdobj if(Колонка.val.Имя == "Обработчик") openModuleProc(ВыбраннаяСтрока.val.Обработчик, mdobj.container) else { try{ if(mdobj.container == metadata.ib && !mdobj.container.treeVisible) stdcommands.Config.OpenDBCfg.send() mdobj.activateInTree() }catch(e){} } }