Changes On Branch orefkov-develop Вы: nobody
Вход

Many hyperlinks are disabled.
Use anonymous login to enable hyperlinks.

Changes In Branch orefkov-develop Excluding Merge-Ins

This is equivalent to a diff from 25bbbf6a80 to 3a0874858c

2011-12-09
09:54
Перенос разработок в основную ветку check-in: 3cef153517 user: orefkov tags: trunk
09:33
Начата разработка окружения для кодогенераторов Leaf check-in: 3a0874858c user: orefkov tags: orefkov-develop
2011-12-07
13:13
Начат скрипт по кодогенерации для будущей версии спта check-in: 0a9a17f581 user: orefkov tags: orefkov-develop
08:07
Скрываю сообщения типа 'Объект Роль.Менеджер заблокирован.' check-in: 25bbbf6a80 user: artbear tags: trunk
2011-12-06
11:08
Исправлена ошибка определения координат курсора в случае, когда альтернативный маркер позиции курсора находится ниже стандартного маркера (Попытка <?> Исключение <|> КонецПопытки). check-in: 1faf3daa2c user: kuntashov tags: trunk

Added code_gen/create_doc.js.

































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
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.





































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
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.

cannot compute difference between binary files

Changes to snippets.js.

153
154
155
156
157
158
159




160
161
162
163
164
165
166
...
523
524
525
526
527
528
529
530

531
        Message("Не удалось создать объект 'Svcsvc.Service'. Зарегистрируйте svcsvc.dll");
        return false;
    }
    //debugger;
   return sel.FilterValue(values.join("\r\n"), 1 | 4, '', 0, 0, 350, 250);    
}





////} SnippetsManager

////////////////////////////////////////////////////////////////////////////////////////
////{ SnippetParametersManager
////

function SnippetParametersManager() {
................................................................................
function GetSnippetsManager() {
    if (!SnippetsManager._instance)
        new SnippetsManager();
        
    return SnippetsManager._instance;
}

GetSnippetsManager();

////} Startup 







>
>
>
>







 







|
>

153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
...
527
528
529
530
531
532
533
534
535
536
        Message("Не удалось создать объект 'Svcsvc.Service'. Зарегистрируйте svcsvc.dll");
        return false;
    }
    //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
////

function SnippetParametersManager() {
................................................................................
function GetSnippetsManager() {
    if (!SnippetsManager._instance)
        new SnippetsManager();
        
    return SnippetsManager._instance;
}

events.connect(snegopat, "onProcessTemplate", GetSnippetsManager());

////} Startup