Имя: Пароль:
1C
1C 7.7
v7: TurboMD выгрузить макет
,
0 Хрюкин
 
23.09.21
15:56
Подскажите, как в turbo md выгрузить макеты. Нажимаю Ctrl-M Форма и модуль выгружаются, а макеты нет.
1 Volodja
 
23.09.21
16:38
TurboMD это вроде не умеет.
Но можно макет вытаскивать Gcomp-ом  или Йокселем.
2 Volodja
 
23.09.21
16:42
Вообще я себе вот такую функцию написал:

Функция ПолучитьТаблицуMXL(Знач ТаблицаMXL="",Знач поУмолчанию="") Экспорт
    ТаблицаMXL=СокрЛП(?(ПустаяСтрока(ТаблицаMXL)=1,поУмолчанию,ТаблицаMXL));
    поУмолчанию=СокрЛП(?(ПустаяСтрока(поУмолчанию)=1,ТаблицаMXL,поУмолчанию));
    ТаблицаMXL=ТаблицаMXL+?(Найти(вРег(ТаблицаMXL),".MXL")>0,"",".MXL");
    ФайлТаблицы=РекурсивныйПоискФайла(ПолучитьКаталогMXL(1),ТаблицаMXL);
    Если ФС.СуществуетФайл(ФайлТаблицы)=0 Тогда
        ФайлТаблицы=РекурсивныйПоискФайла(ПолучитьКаталогMXL(2),ТаблицаMXL);
        Если ФС.СуществуетФайл(ФайлТаблицы)=0 Тогда
            ФайлТаблицы=поУмолчанию;
        КонецЕсли;
    КонецЕсли;
    Возврат ФайлТаблицы;
КонецФункции

Программа сначала ищет нужный макет в условном каталоге и если не находит его, то берет из метаданных. Это позволяет редактировать внешние макеты на лету, не выгоняя пользователей
3 Volodja
 
23.09.21
16:44
Использую так

    Таб=СоздатьОбъект("Таблица");
    ФайлПН=ПолучитьТаблицуMXL("ПриходнаяНакладная");
    Таб.ИсходнаяТаблица(ФайлПН);
4 Ёпрст
 
23.09.21
20:55
(0) использовать свой класс таблица.
Была тема на 1cpp
5 acanta
 
23.09.21
21:03
А докфайл в фаре разве не макеты копирует? Расширение добавить и все..
6 ADirks
 
24.09.21
07:33
для выгрузки макетов в скрипте TurboMD_Artur.vbs можно добавить

Sub UnloadCurrentWndMXL()
    Dim w, d, page
    
    Set w = Windows.ActiveWnd
    If w Is Nothing Then
        MsgBox "Нет активного окна", vbOKOnly, "TurboMD"
        Exit Sub
    End If
    Set d = w.Document
    If d.ID < 2 Then
        MsgBox "Окно ни форма, ни модуль", vbOKOnly, "TurboMD"
        Exit Sub
    End If

    'анализ файла turbomd.prm
    AnalyzeTurboMDPrm 1

    If d = docText Then     ' Просто модуль
        Exit Sub
    Else
        If d = docWorkBook Then ' Форма
            For i = 2 To d.CountPages - 1
                set page = d.Page(i)
                If page = docTable Then
                    name = page.name
                    pos = InStrRev(name, ".")
                    name = Left(name, pos-1) & "." & d.NamePage(i)
                    UnloadDoc page, name ' Выгружаем mxl
                End If
            Next

        End If
    End If

    WriteToTurboMDPrm 1
End Sub
7 Volodja
 
24.09.21
08:28
(6) У меня данный скрипт выдал ошибку.
Поправил на:
             UnloadDoc  page
            'UnloadDoc page, name
т.к.
Sub UnloadDoc(doc)
принимает 1 параметр
8 ADirks
 
24.09.21
09:43
(7) ну тогда весь скрипт. что-то допиливали там, вдруг пригодится

'Пример скрипта, позволяющего выгрузить в файл
'текущую редактируемую форму и модуль
'(либо просто модуль проведения или вида расчета)
'во внешний файл.
'При этом выгружается текущее состояние формы/модуля
'без необходимости сохранять конфигурацию

Dim BaseDir
BaseDir = IBDir & "unpack\" ' Базовый каталог для выгрузки

Dim TurboMdPrmName
TurboMdPrmName = IBDir & "TurboMd.prm"

Dim Collection

' Процедура создания ветки каталогов
Sub MakeDir(Dir)
    Set fso = CreateObject("Scripting.FileSystemObject")
    If Left(Dir, 2) = "\\" Then
        'UNC Path
        pos = InStr(3, Dir, "\")    'Server name
        p = Left(Dir, pos)
        Dir = Mid(Dir, pos + 1)
    Else
        p = ""
    End If
    pos = 1
    While pos <> 0
        pos = InStr(Dir, "\")
        If pos = 0 Then
            p = p & Dir
        Else
            p = p & Left(Dir, pos)
            Dir = Mid(Dir, pos + 1)
        End If
        If fso.FolderExists(p) = False Then fso.CreateFolder p
    Wend
End Sub

' функции работы со списком модулей
Sub AddDocToList(ModuleName, FileName)
        if Collection.Exists(ModuleName) then
            Collection.Remove ModuleName
        end if
        Collection.Add ModuleName, FileName
end sub 'AddDocToList

Sub RemoveDocFromList(doc)
        if Collection.Exists(doc.Name) then
            Collection.Remove doc.Name
        end if
End Sub 'RemoveDocFromList()

' Анализ файла turbomd.prm
Sub AnalyzeTurboMDPrm(NullParam) ' параметр нужен, чтобы не был виден в списке макросов
    set Collection = CreateObject("Scripting.Dictionary")

    Set fso = CreateObject("Scripting.FileSystemObject")
    
    On Error Resume Next
    set file = fso.OpenTextFile(TurboMdPrmName, 1) 'чтение
    On Error Goto 0
    If IsEmpty(file) Then Exit Sub

    Do While file.AtEndOfStream <> True
        CurrLine = file.ReadLine
        pos = InStr(CurrLine,"=")
        if pos <> 0 then
            ModuleName = Left(CurrLine, pos-1)
            FileName = Mid(CurrLine, pos+1)
            AddDocToList ModuleName, FileName
        end if
    Loop
    file.Close
end sub 'AnalyzeTurboMDPrm

' добавление соответствия в файл TurboMD.prm
Sub WriteToTurboMDPrm(NullParam)
    Set fso = CreateObject("Scripting.FileSystemObject")
    set file = fso.CreateTextFile(TurboMdPrmName, 2) 'запись

        items = Collection.Items
        keys = Collection.Keys
        For i = 0 To Collection.Count -1
            file.WriteLine keys(i) & "=" & items(i)
        Next
        file.Close
end sub 'WriteToTurboMDPrm

'Выгрузка документа
Sub UnloadDoc(doc, Name)
    'Формируем имя файла
    fName = Replace(Name, ".", "\")
    If doc = docTable Then fName = fName & ".mxl" Else fName = fName & ".txt"
    FullName = BaseDir & fName
    
    'Из имени файла выделяем каталог
    lastdec = InStrRev(FullName, "\")
    Dir = Left(FullName, lastdec - 1)
    'И создаем этот каталог
    MakeDir Dir
    ' Выгружаем документ в файл
    doc.SaveToFile FullName

    'Message Name & "   " & FullName
    AddDocToList Name, "unpack\" & fName

End Sub

'Собственно макрос для выгрузки активного окна
Sub UnloadCurrentWnd()
    Dim w, d, page
    
    Set w = Windows.ActiveWnd
    If w Is Nothing Then
        MsgBox "Нет активного окна", vbOKOnly, "TurboMD"
        Exit Sub
    End If
    Set d = w.Document
    If d.ID < 2 Then
        MsgBox "Окно ни форма, ни модуль", vbOKOnly, "TurboMD"
        Exit Sub
    End If

    'анализ файла turbomd.prm
    AnalyzeTurboMDPrm 1

    If d = docText Then     ' Просто модуль
        UnloadDoc d, d.Name
    Else
        If d = docWorkBook Then ' Форма
            UnloadDoc d.Page(0), d.Page(0).Name ' Выгружаем диалог
            UnloadDoc d.Page(1), d.Page(1).Name ' Выгружаем модуль
            
            'For i = 2 To d.CountPages - 1
            '    set page = d.Page(i)
            '    If page = docTable Then
            '        name = page.name
            '        pos = InStrRev(name, ".")
            '        name = Left(name, pos-1) & "." & d.NamePage(i)
            '        UnloadDoc page, name ' Выгружаем mxl
            '    End If
            'Next

        End If
    End If

    WriteToTurboMDPrm 1

End Sub

Sub UnloadCurrentWndMXL()
    Dim w, d, page
    
    Set w = Windows.ActiveWnd
    If w Is Nothing Then
        MsgBox "Нет активного окна", vbOKOnly, "TurboMD"
        Exit Sub
    End If
    Set d = w.Document
    If d.ID < 2 Then
        MsgBox "Окно ни форма, ни модуль", vbOKOnly, "TurboMD"
        Exit Sub
    End If

    'анализ файла turbomd.prm
    AnalyzeTurboMDPrm 1

    If d = docText Then     ' Просто модуль
        Exit Sub
    Else
        If d = docWorkBook Then ' Форма
            For i = 2 To d.CountPages - 1
                set page = d.Page(i)
                If page = docTable Then
                    name = page.name
                    pos = InStrRev(name, ".")
                    name = Left(name, pos-1) & "." & d.NamePage(i)
                    UnloadDoc page, name ' Выгружаем mxl
                End If
            Next

        End If
    End If

    WriteToTurboMDPrm 1
End Sub

Sub RemoveAllFromTurboMD()
    set Collection = CreateObject("Scripting.Dictionary")
    WriteToTurboMDPrm 1
End Sub

'Собственно макрос для выгрузки активного окна
Sub RemoveLinkToCurrentWnd()
    Set w = Windows.ActiveWnd
    If w Is Nothing Then
        MsgBox "Нет активного окна", vbOKOnly, "TurboMD"
        Exit Sub
    End If
    Set d = w.Document
    If d.ID < 1 Then
        MsgBox "Окно ни форма, ни модуль", vbOKOnly, "TurboMD"
        Exit Sub
    End If

    'анализ файла turbomd.prm
    AnalyzeTurboMDPrm 1

    If d = docText Then     ' Просто модуль
        RemoveDocFromList d
    Else
        If d = docWorkBook Then ' Форма
                RemoveDocFromList d.Page(0) ' Выгружаем диалог
                RemoveDocFromList d.Page(1) ' Выгружаем модуль
        End If
    End If

    WriteToTurboMDPrm 1
End Sub 'RemoveLink_to_CurrentWnd

'Макрос для загрузки всех распакованных файлов обратно в мдшник
Sub LoadFromFilesToMD()
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set f = fso.OpenTextFile(IBDir & "turbomd.prm", 1, True)
    On Error Resume Next
    While f.AtEndOfStream = False
        t = f.ReadLine()
        eq = InStr(t, "=")
        If eq > 0 Then
            dName = Trim(Left(t, eq - 1))
            fName = Trim(Mid(t, eq + 1))
            If Mid(fName, 2, 1) <> ":" And Left(fName, 2) <> "\\" Then fName = IBDir & fName
            Set doc = Documents(dName)
            If Err <> 0 Then
                Message Err.Description, mRedErr
                Err.Clear
            Else
                If doc.LoadFromFile(fName) <> True Then
                    Message "Не удалось загрузить " & doc.Name & " из " & fName, mBlackErr
                Else
                    Message doc.Name & " загружен из " & fName, mInformation
                End If
                If Err <> 0 Then
                    Message Err.Description, mRedErr
                    Err.Clear
                End If
            End If
        End If
    Wend
End Sub

' Макрос для быстрого открытия файла TurboMD.prm
Sub OpenTurboMDPrm()
    Documents.Open IBDir & "turbomd.prm"
End Sub

Sub SaveMD()
    MetaData.SaveMDToFile IBDir & "1cv7new.md", False
End Sub



Sub ClearTurboMDPrm()
    Set FSO = CreateObject("Scripting.FileSystemObject")
    
    If FSO.FileExists(TurboMdPrmName) Then
        Set fCur = FSO.GetFile(TurboMdPrmName)
        If fCur.Size > 0 Then
            FSO.CopyFile TurboMdPrmName, TurboMdPrmName & "~", True
            set File = FSO.CreateTextFile(TurboMdPrmName, 2)
            File.Close
        End If
    End If
End Sub
                                                                  
'------------------------------------------------------------------
Sub Configurator_MetaDataSaved(FileNAme)
    ClearTurboMDPrm
End Sub
9 Хрюкин
 
24.09.21
14:43
(2) Спасибо. А можно еще модуль функции РекурсивныйПоискФайла()?
Ругается, что функция не обнаружена.
10 Volodja
 
24.09.21
14:55
(9) Держи
//  ***********************************************************
// Приводит строку каталога к виду: _Каталог\
Функция СтрокаКаталога(Знач _ИмяКаталога) Экспорт
    _ИмяКаталога=СокрЛП(_ИмяКаталога);
    Если ПустаяСтрока(_ИмяКаталога)=1 Тогда
        Возврат "";
    КонецЕсли;
    Возврат _ИмяКаталога+?(Прав(_ИмяКаталога,1)="\","","\");
КонецФункции
//  ***********************************************************
//    _Размещение=1, получить каталог внутри инф.базы - локальная
//    _Размещение=2, получить каталог - общий
//  ***********************************************************
Функция ПолучитьКаталогДляИБ(_ИмяПапки,_Размещение=1) Экспорт
    Если _Размещение=1 Тогда
        Каталог=КаталогИБ()+_ИмяПапки;
    Иначе
        Каталог=Лев(КаталогИБ(),СтрДлина(КаталогИБ())-1);
        Каталог=Лев(Каталог,НайтиПрав(Каталог,"\"));
        Каталог=Каталог+_ИмяПапки;
    КонецЕсли;
    Если ФС.СуществуетФайл(Каталог)=0 Тогда
        ФС.СоздатьКаталог(Каталог);
    КонецЕсли;
    Возврат Каталог;
КонецФункции
//  ***********************************************************
Функция ПолучитьКаталогMXL(_Размещение=1) Экспорт
    Возврат ПолучитьКаталогДляИБ("ExtMXL",_Размещение);
КонецФункции
//  ***********************************************************

// Находит файл начиная с _сКаталога. Возвращает полное имя файла
Функция РекурсивныйПоискФайла(Знач _сКаталога,_ИмяФайла) Экспорт
    _сКаталога=СтрокаКаталога(СокрЛП(_сКаталога));        //+?(Прав(СокрЛП(_сКаталога),1)="\","","\");
    Состояние("# "+_сКаталога);
    Если ФС.СуществуетФайл(_сКаталога+_ИмяФайла)=1 Тогда
        Возврат _сКаталога+_ИмяФайла;
    КонецЕсли;
    _ФС=СоздатьОбъект("ФС");
    _Файл=_ФС.НайтиПервыйФайл(_сКаталога+"*.*");
    Пока ПустаяСтрока(_Файл) = 0 Цикл
        Если Лев(_Файл,1)<>"." Тогда
            _АтрибутыФайла="";
            _ФС.АтрибутыФайла(_сКаталога+_Файл,,_АтрибутыФайла);
            _ЭтоКаталог=Число(Сред(_АтрибутыФайла,4,1));
            Если _ЭтоКаталог=1 Тогда
                _Файл=РекурсивныйПоискФайла(_сКаталога+_Файл,_ИмяФайла);
                Если ПустаяСтрока(_Файл)=0 Тогда
                    Возврат _Файл;
                КонецЕсли;
            КонецЕсли;
        КонецЕсли;
        _Файл=_ФС.НайтиСледующийФайл();
    КонецЦикла;
    Возврат "";
КонецФункции
11 Volodja
 
24.09.21
15:12
(8) А можно файлом сразу кинуть? а то здесь эти блоки [+ Code] Что-то раскрыл, что-то пропустил, запутался
12 Ёпрст
 
24.09.21
16:38
(6)охренеть.. посмотрел у себя, аж целых 3 скрипта для турбомд, и в одном таки да, есть выгрузка мокселя :)))

(0) на вот, занимайся
https://cloud.mail.ru/public/xC6h/TY7rQRghj
13 Ёпрст
 
24.09.21
17:01
Единственный минус скрипта, если просто выгрузить моксель, то он его прекрасно выгрузит.
А вот при загрузке, если нет выгруженной формы или текста модуля - не загрузит.
Т.е вместе с мокселем надо хотя бы форму\модуль выгрузить
14 Volodja
 
27.09.21
10:15
(13) А в этом скрипте можно отключить возможность, чтобы все-таки не заставлял принудительно сохранять конфигурацию?
А то кое-что проверил, закрываю конфу а он не выпускает меня без сохранения.
15 Ёпрст
 
27.09.21
10:35
(14) так не сохраняй
16 Volodja
 
27.09.21
10:48
(15) выйти не дает без сохранения
17 Volodja
 
27.09.21
10:49
я макрос выгружаю, тогда и закрываю без сохранения
Глупец, лишенный способности посмеяться над собой вместе с другими, не сможет долго выносить программирование. Фредерик Брукс-младший