' Создание новой версии
' Скрипт на кнопку в карточке (свойство кнопочного типа)
' v 2.0.0

Option Explicit

Function DoEvent(UserSession, CardFrame, CardData, ActivateFlags, ModeID, FolderID, PropValue)

    DoEvent = 0
    Dim CardData2, FileList2, Ver, State, FolderID2

    If GetProp(CardData, "состояние", vbNullString) <> "Действующий" Then
        MsgBox "Хуй вам, а не новая версия!", vbOKOnly, "Порицание"
        Exit Function
    End If

    ' Копируем карточку
    Set CardData2 = CardData.Copy

    ' Чистим файлы
    Set FileList2 = UserSession.CardManager.CardData(MainInfo(CardData2).Value("FilesID"))
    Sect(FileList2, "FileReferences").Rows.Clear
    MainInfo(FileList2).Value("Count") = 0

    ' Чистим ссылки
    Sect(CardData2, "CardReferences").Rows.Clear

    ' Проставляем версию
    Ver = GetProp(CardData, "версия", 0) + 1
    SetProp CardData2, "версия", Ver, CStr(Ver)

    ' Пишем состояние
    State = "превед!"
    SetProp CardData2, "состояние", State, State

    ' Помещаем в папку
    FolderID2 = GetProp(CardData, "папка", FolderID)
    FolderCard(UserSession).CreateShortcut FolderID2, CardData2.ID, True

    ' Выводим на экран новую карточку
    CardFrame.Host.ShowCard CardData2.ID

End Function

' Получение карточки папок
Function FolderCard(UserSession)
    Set FolderCard = UserSession.CardManager.Dictionary("{DA86FABF-4DD7-4A86-B6FF-C58C24D12DE2}")
End Function

' Получение секции карточки по имени
Function Sect(CardData, Alias)
    Set Sect = CardData.Sections(CardData.Type.AllSections.GetByAlias(Alias).ID)
End Function

' Получение подчиненной секции по имени
Function SubSect(RowData, Alias)
    Set SubSect = RowData.ChildSections(RowData.Section.Type.ChildSections.GetByAlias(Alias).ID)
End Function

' Нулевая строка секции MainInfo
Function MainInfo(CardData)
    Set MainInfo = Sect(CardData, "MainInfo").FirstRow
End Function

' Строка свойства
Function Prop(CardData, Alias)
    Set Prop = Nothing
    Dim Row: For Each Row In Sect(CardData, "Properties").Rows
        If Row.Value("Name") = Alias Then
            Set Prop = Row
            Exit Function
        End If
    Next
End Function

' Получение значения свойства
Function GetProp(CardData, Alias, DefaultValue)
    Dim Row: Set Row = Prop(CardData, Alias)
    If Row Is Nothing Then
        GetProp = DefaultValue
    Else
        GetProp = Row.Value("Value")
        If IsNull(GetProp) Then GetProp = DefaultValue
    End If
End Function

' Установка значения свойства
Sub SetProp(CardData, Alias, Value, DisplayValue)
    Prop(CardData, Alias).Value("Value") = Value
    Prop(CardData, Alias).Value("DisplayValue") = DisplayValue
End Sub

3 Comments

  1. Порицание: "Хуй вам, а не новая версия!" - это, конечно, пять!

    1. © Виктор Кондратюк

  2. вот еще проверенный вариант:

    'Создание технического документа
    
    Option Explicit
        Function DoEvent(UserSession, CardFrame, CardData, ActivateFlags, ModeID, FolderID)
        Dim TemplateID, Template, NewDoc, FolderID2, LinkedID, LinkedCard
        DoEvent = 16 OR 32 OR 64
    
    '1 Задать вопрос пользоватею
        If MsgBox("Вы уверены что хотите создать технический документ?", vbYesNo Or vbInformation, "Внимание!") = vbNo Then
            Exit Function
        End If
    
    '2 Копируем новый документ по шаблону
        TemplateID = "{2E1CA821-9B32-4C3D-984F-3F90EB4925EE}"
        If IsNull(TemplateID) Then Exit Function
        Set Template = UserSession.CardManager.CardData(TemplateID)
        Set NewDoc = Template.Copy
        NewDoc.IsTemplate = False
        
    '3 Помещаем в папку
        FolderID2 = "{342F96B6-C9E6-4D7A-A514-ED2614FE7A4A}"
        FolderCard(UserSession).CreateShortcut FolderID2, NewDoc.ID, True    
    
    '4 Делаем ссылки
        LinkedID = NewDoc.ID
        Set LinkedCard = UserSession.CardManager.CardData(LinkedID)
        AddCardReference CardData, UserSession, LinkedCard.ID, "Технический документ"
        AddCardReference LinkedCard, UserSession, CardData.ID, "Заявка на экспертизу"
    
    '5 Выводим на экран новую карточку
        CardFrame.Host.ShowCard NewDoc.ID
    End Function
    
    ' Получение карточки папок
    Function FolderCard(UserSession)
        Set FolderCard = UserSession.CardManager.Dictionary("{DA86FABF-4DD7-4A86-B6FF-C58C24D12DE2}")
    End Function
    
    ' Копирование значения свойства2
    Sub CopyProp2(SrcCardData, DestCardData, PropName)
        CopyProp SrcCardData, PropName, DestCardData, PropName
    End Sub
    
    ' Копирование значения свойства
    Sub CopyProp(SrcCardData, SrcPropName, DestCardData, DestPropName)
        Dim SrcProp
        Set SrcProp = Prop(SrcCardData, SrcPropName)
        SetProp DestCardData, DestPropName, SrcProp.Value("Value"), SrcProp.Value("DisplayValue")
    End Sub
    
    ' Получение секции карточки по имени
    Function Sect(CardData, Alias)
        Set Sect = CardData.Sections(CardData.Type.AllSections.GetByAlias(Alias).ID)
    End Function
    
    ' Получение подчиненной секции по имени
    Function SubSect(RowData, Alias)
        Set SubSect = RowData.ChildSections(RowData.Section.Type.ChildSections.GetByAlias(Alias).ID)
    End Function
    
    ' Нулевая строка секции MainInfo
    Function MainInfo(CardData)
        Set MainInfo = Sect(CardData, "MainInfo").FirstRow
    End Function
    
    ' Строка свойства
    Function Prop(CardData, Alias)
        Set Prop = Nothing
        Dim Row: For Each Row In Sect(CardData, "Properties").Rows
            If Row.Value("Name") = Alias Then
                Set Prop = Row
                Exit Function
            End If
        Next
    End Function
    
    ' Получение значения свойства
    Function GetProp(CardData, Alias, DefaultValue)
        Dim Row: Set Row = Prop(CardData, Alias)
        If Row Is Nothing Then
            GetProp = DefaultValue
        Else
            GetProp = Row.Value("Value")
            If IsNull(GetProp) Then GetProp = DefaultValue
        End If
    End Function
    
    ' Установка значения свойства
    Sub SetProp(CardData, Alias, Value, DisplayValue)
        Prop(CardData, Alias).Value("Value") = Value
        Prop(CardData, Alias).Value("DisplayValue") = DisplayValue
    End Sub
    
    ' Вывести предупреждение
    Sub ReportWarning(Msg)
        MsgBox Msg, vbExclamation Or vbOKOnly, "Предупреждение"
    End Sub
    
    ' Добавление ссылки
    Sub AddCardReference(CardData, UserSession, Link, LinkDesc)
        Dim Refs, Row
        Set Refs = Sect(CardData, "CardReferences")
        Set Row = Refs.CreateRow
        Row.Value("Link") = Link
        Row.Value("CreationDate") = Now
        Row.Value("CreatedBy") = StaffObject(UserSession).GetCurrentUserID
        Row.Value("LinkDesc") = LinkDesc
    End Sub
    
    ' Получение StaffObject
    Function StaffObject(UserSession)
        Set StaffObject = CreateObject("TOHelperObjects.StaffObject")
        Set StaffObject.UserSession = UserSession
    End Function