ADDED code_gen/create_doc.js Index: code_gen/create_doc.js ================================================================== --- code_gen/create_doc.js +++ code_gen/create_doc.js @@ -0,0 +1,80 @@ +$engine JScript +$uname codegen_create_doc +$dname Генератор Документов +$addin codegen_manager +$addin stdlib +$addin vbs + +// (c) Александр Орефков orefkov at gmail.com +// Скрипт - генератор кода создания нового документа +// + +var attrTypeCategory = "{30E571BC-A897-4A78-B2E5-1EA6D48B5742}" + +codegen_manager.registerCodeGen("Документы/Новый/С заполнением всех реквизитов", genarateNewDoc) + +function genarateNewDoc(param) +{ + // Для начала выберем вид документа + var docKind = snegopat.parseTemplateString('') + if(!docKind.length) + return false + vbs.result = "док" + docKind + var varName = vbs.DoExecute('InputString result, "Укажите название группы"') + + // Получим список возможных типов + var tf = new codegen_manager.TypeFinder() + + var mdObj = param.mdCont.rootObject.childObject("Документы", docKind) + + var defLangID = stdlib.getUuidFomMDRef(param.mdCont.rootObject.property("ОсновнойЯзык")) + //var defLangMD = metadata.current.rootObject.childObject("Языки", defLangID) + var defLangMD = param.mdCont.findByUUID(defLangID) + var syn = mdObj.synonym(defLangMD.property("КодЯзыка")) + if(!syn.length) + syn = docKind + + var text = '//{ Создание документа "' + syn + '" в ' + varName +'\n' + varName + ' = Документы.' + docKind + '.СоздатьДокумент();\n' + // Обработаем реквизиты документа + text += processAttribs(" Заполнение реквизитов", "", "", varName, mdObj, tf) + // Обработаем табличные части + var tabPartsCount = mdObj.childObjectsCount("ТабличныеЧасти") + if(tabPartsCount) + { + var lineVarName = varName + "Строка", + indent = profileRoot.getValue("ModuleTextEditor/ReplaceTabOnInput") ? codegen_manager.fillLine(" ", profileRoot.getValue("ModuleTextEditor/TabSize")) : "\t" + if(tabPartsCount > 1) + text += "//{ Заполнение табличных частей\n" + for(var i = 0; i < tabPartsCount; i++) + { + var tp = mdObj.childObject("ТабличныеЧасти", i) + text += processAttribs(" Заполнение табличной части " + tp.name, + "Для Каждого Из Цикл\n\t" + lineVarName + " = " + varName + "." + tp.name + ".Добавить();\n" , "КонецЦикла;\n", + indent + lineVarName, tp, tf) + } + if(tabPartsCount > 1) + text += "//} Заполнение табличных частей\n" + } + text += "//} Создание документа " + docKind + " в " + varName + param.text = text + return true +} + +function processAttribs(comment, header, footer, line, obj, tf) +{ + var lines = [] + for(var i = 0, cnt = obj.childObjectsCount("Реквизиты"); i < cnt; i++) + { + var attr = obj.childObject("Реквизиты", i) + var l = line + "." + attr.name + " = ; // " + tf.getTypeString(attr) + var c = attr.comment + if(c.length) + l += " / " + c + lines.push(l) + } + if(lines.length) + return "//{ " + comment + "\n" + header + codegen_manager.formatAssign(lines) + footer + "//} " + comment + "\n" + else + return "" +} + ADDED code_gen/gen_mgr.js Index: code_gen/gen_mgr.js ================================================================== --- code_gen/gen_mgr.js +++ code_gen/gen_mgr.js @@ -0,0 +1,178 @@ +$engine JScript +$uname codegen_manager +$dname Менеджер генераторов кода +$addin stdlib + +// (c) Александр Орефков orefkov at gmail.com +// Скрипт - для запуска различных генераторов кода +// Данный скрипт должен быть загружен в addins.ini РАНЕЕ других скриптов - генераторов кода +var attrTypeCategory = "{30E571BC-A897-4A78-B2E5-1EA6D48B5742}" + +// Сразу загрузим форму, т.к. ее дерево будет использоваться для хранения функций-кодогенераторов +var codeGens = [], form +form = loadScriptForm(SelfScript.fullPath.replace(/js$/, 'ssf'), SelfScript.self) +form.ИспользоватьМетаданные = 1 +form.Дерево.Колонки.Добавить("caller") + +// Регистрация функции кодогенератора. +function registerCodeGen(description, caller) +{ + var descr = description.split("/") + var root = form.Дерево.Строки + for(var i = 0; i < descr.length - 1; i++) + { + var row = root.Найти(descr[i], "Генератор") + if(!row) + { + row = root.Добавить() + row.Генератор = descr[i] + row.Картинка = 0 + } + root = row.Строки + } + // Сначала попробуем найти, может такая запись уже есть. + // Это позволит перезагружать скрипты-кодогенераторы + row = root.Найти(descr[i]) + if(!row) + { + row = root.Добавить() + row.Генератор = descr[i] + } + row.Картинка = 1 + row.caller = caller +} + +// Собственно, выбор и запуск генерации +SelfScript.Self["macrosХочу Кода!!!"] = function() +{ + var pathToForm = SelfScript.fullPath.replace(/js$/, 'ssf') + // Обработку событий формы привяжем к самому скрипту + if(form.ОткрытьМодально()) + { + var mdCont = form.ИспользоватьМетаданные == 1 ? metadata.ib : metadata.current + var caller = form.ЭлементыФормы.Дерево.ТекущиеДанные.caller + var param = {mdCont:mdCont, text:"", caretToBegin:true} + if(!caller(param)) + return + var text = param.text + var txtWnd = snegopat.activeTextWindow() + if(!txtWnd || txtWnd.readOnly) + Message(text) + else + { + // Надо получить отступ + var sel = txtWnd.getSelection() + var textLine = txtWnd.line(sel.beginRow) + // Курсор может быть за концом строки + while(textLine.length < sel.beginCol - 1) + textLine += ' ' + // Оставим только часть строки перед курсором + textLine = textLine.substr(0, sel.beginCol - 1) + var m = textLine.match(/^\s+/) + if(m) // Есть пробельные символы в начале строки + text = text.replace(/\n/g, '\n' + m[0]) // Заменим переводы строк на перевод строк + отступ + text = text.replace(/\s+$/m, '') // СокрП + // Вставим текст + txtWnd.selectedText = text + if(param.caretToBegin) + txtWnd.setCaretPos(sel.beginRow, sel.beginCol) + } + } +} + +// Обработчики событий формы +function ПриОткрытии() +{ + // Если текущая конфа не открыта или не отличается от конфы ИБ, + // то нет смысла выбирать метаданные + if(!stdlib.isConfigOpen() || !stdlib.isConfigsDifferent()) + { + form.ИспользоватьМетаданные = 1 + form.ЭлементыФормы.ОткрытаяКонфигурация.Доступность = false + } + else + form.ЭлементыФормы.ОткрытаяКонфигурация.Доступность = true +} +function КоманднаяПанель1ОК(Кнопка) +{ + form.Закрыть(true) +} + +function ДеревоПриАктивизацииСтроки(Элемент) +{ + form.ЭлементыФормы.КоманднаяПанель1.Кнопки.Ок.Доступность = !!Элемент.val.ТекущиеДанные.caller +} +function ДеревоВыбор(Элемент, ВыбраннаяСтрока, Колонка, СтандартнаяОбработка) +{ + if(Элемент.val.ТекущиеДанные.caller) + form.Закрыть(true) +} +///////////////////////////////////////////////////////// +// Разные полезняшки для кодогенераторов + +// Класс для получения названий типов объекта матаданных, т.к. штатный объект ОписаниеТипов в +// режиме Конфигуратора не выдает типы, основанные на метаданных. +function TypeFinder() +{ + var types = new VBArray(metadata.current.typeList(attrTypeCategory, 1)).toArray() + for(var i in types) + { + var t = types[i].split(",") + this[t[1]] = t[0] + } +} + +TypeFinder.prototype.getTypeString = function(mdObj) +{ + var text = [] + var types = new VBArray(mdObj.types()).toArray() + for(var i in types) + text.push(this[types[i]]); + return text.join(", ") +} + +// Функция, обрабатывает переданный массив строк, выравнивая в них знаки "=" +function formatAssign(lines) +{ + var tabSize = profileRoot.getValue("ModuleTextEditor/TabSize") + var ll = [] + maxEqualPos = -1 + for(var l in lines) + { + var line = {text: lines[l]} + line.eqRealPos = line.text.indexOf("=") + if(line.eqRealPos >= 0) + { + line.eqPosInSpaces = 0 + for(var k = 0; k < line.eqRealPos; k++) + { + if(line.text.charAt(k) == "\t") + line.eqPosInSpaces += tabSize - (line.eqPosInSpaces % tabSize) + else + line.eqPosInSpaces++ + } + if(line.eqPosInSpaces > maxEqualPos) + maxEqualPos = line.eqPosInSpaces + } + ll.push(line) + } + var text = "" + for(var l in ll) + { + var line = ll[l] + if(line.eqRealPos < 0) + text += line.text + "\n" + else + text += line.text.substr(0, line.eqRealPos) + fillLine(" ", maxEqualPos - line.eqPosInSpaces) + line.text.substr(line.eqRealPos) + "\n" + } + return text +} + +// Получить строку одинаковых символов указанной длины +function fillLine(symbol, count) +{ + var text = "" + while(count--) + text += symbol + return text +} ADDED code_gen/gen_mgr.ssf Index: code_gen/gen_mgr.ssf ================================================================== --- code_gen/gen_mgr.ssf +++ code_gen/gen_mgr.ssf cannot compute difference between binary files Index: snippets.js ================================================================== --- snippets.js +++ snippets.js @@ -155,10 +155,14 @@ } //debugger; return sel.FilterValue(values.join("\r\n"), 1 | 4, '', 0, 0, 350, 250); } +SnippetsManager.prototype.onProcessTemplate = function(params) +{ + //Message("Вставляется текст из шаблона '" + params.name + "':\n" + params.text + "\nОтступ '" + params.indent + "'") +} ////} SnippetsManager //////////////////////////////////////////////////////////////////////////////////////// ////{ SnippetParametersManager //// @@ -525,7 +529,8 @@ new SnippetsManager(); return SnippetsManager._instance; } -GetSnippetsManager(); +events.connect(snegopat, "onProcessTemplate", GetSnippetsManager()); + ////} Startup