Ссылка на файл документа в названии документа

Текущая ситуация

За каждым документом в Business Studio может быть закреплен файл или указана ссылка на такой файл. При выводе отчетов в HTML (HTML-публикация или Business Studio Portal) в отчете по документу можно вывести на показ параметр "Файл". Пользователю в отчете будет представлена гиперссылка, при нажатии на которую будет открыт конкретный указанный файл или будет осуществлен переход по указанной ссылке.

Рисунок 1. Ссылка на файл документа из отчета по документу

С другой стороны, в HTML все упоминания документа в отчетах других объектов имеют ссылку на документ (при условии, что есть куда ссылаться). И уже после перехода по этой ссылке будет доступна ссылка для загрузки файла документа.

Рисунок 2. Ссылка на документ из отчета по единице деятельности

В отчетах любых объектов также можно выводить не документ, а ссылку на файл. При этом такая ссылка будет иметь текст, отличный от названия документа (см. Рисунок 6).

Постановка задачи

В отчете формата MS Word по единице деятельности в таблице со списком нормативно-справочных документов название документа сделать гиперссылкой:

  1. При выводе в HTML – ссылка на загрузку файла или ссылка для перехода на документ по указанной ссылке.
  2. При выводе в Word – ссылка для перехода на документ по указанной ссылке.

Таблица должна состоять из 2х столбцов: № пп (нумератор) и Документ (название документа).

Исходные данные

Решение описывается с момента, когда в шаблоне отчета создана необходимая привязка типа "Список", которую можно видеть таблицей.

Рисунок 3. Вид привязки в дереве привязок
Рисунок 4. Вид необходимой привязки типа Список в шаблоне отчета

Настройка сложной привязки "Нормативно-справочные документы" приведена в таблице ниже.

Название привязки Тип привязки Путь к привязке
1. Нормативно-справочные документы Список Процессы.Нормативно-справочные документы
2. Документ Объект БизнесМодель.СписокНСДПроцессов.Документ
3. Файл Объект БизнесМодель.СписокНСДПроцессов.Файл
Таблица 1. Настройка привязки "Нормативно-справочные документы"

Данная привязка выводит таблицу с названиями нормативно-справочных документов единицы деятельности и ссылками на их файлы.

В качестве примера возьмем единицу деятельности А1, который имеет свойства, представленные на рисунке ниже.

Рисунок 5. Вид закладки "Нормативно-справочные документы" в окне свойств единицы деятельности
Рисунок 6. Вид данных, сформированных по необходимой привязке, в выполненном отчете в HTML-публикации до решения задачи

Концепция решения

После того, как отчет будет сформирован (Business Studio создаст все необходимые ссылки на файлы документа), будем запоминать ссылку на файл и применять эту ссылку для соответствующего названия документа. Столбец "Файл" после этого удалим.

Шаги решения

Кодом VBA:

  • для каждой ячейки столбца "Файл" заполнить адрес гиперссылки;
  • для ячейки той же строки столбца "Документ" запомнить название документа;
  • для ячейки той же строки столбца "Документ" вставить гиперссылку с названием документа и ссылкой на файл.

После окончания переноса всех гиперссылок  удалить столбец "Файл" и привести таблицу к обычному виду.

Sub ПослеВыполненияОтчета(ob As Variant, app As Variant)

'ВВОДНАЯ ЧАСТЬ

'название закладки для привязки типа Список, формирующей нужную таблицу
Dim BookmarkName As String
BookmarkName = "Нормативно_справочные_до_3be042ab"

Dim columnFile, columnDocName As Integer
columnDocName = 2 'номер столбца, в котором названия документа
columnFile = 3 'номер столбца, в котором названия файла документа

'служебные
Dim linkFileText, nameDoc, hLinkAdress As String
Dim TableDocs As Table

'ПРОЦЕДУРНАЯ ЧАСТЬ

ActiveWindow.View.ShowFieldCodes = Not ActiveWindow.View.ShowFieldCodes 'Alt+F9 - видим не коды полей, а значения

If BookmarkIs(BookmarkName) Then 'если есть необходимая закладка

    '1. Вставляем гиперссылки в названия документов

    'получаем таблицу по названию привязки
    Set TableDocs = Application.ActiveDocument.Bookmarks(BookmarkName).Range.Tables(1)

    countRowsTableDocs = TableDocs.Rows.Count 'количество строк таблицы

    For i = 2 To countRowsTableDocs 'будем проходить по всем строкам таблицы, кроме первой

        On Error Resume Next 'игнор error 5991, если какие-то ячейки имеют вертикальное объединение
        
        nameDoc = ""
        linkFileText = ""
        hLinkAdress = ""
        
        'Определяем текст в ячейке с файлом
        linkFileText = TableDocs.Cell(i, columnFile).Range.Text

        If Len(linkFileText) <> 2 Then 'если ячейка не пустая (только 2 служебных символа)

            TableDocs.Cell(i, columnFile).Range.Select 'работаем с ячейкой названия файла

            For Each hLink In Selection.Hyperlinks
                hLinkAdress = hLink.Address 'определяем адрес гиперссылки
            Next hLink

            If Len(hLinkAdress) <> 0 Then 'если гиперссылка есть

                'работаем с ячейками Названий документа
                nameDoc = TableDocs.Cell(i, columnDocName).Range.Text
                nameDoc = Left$(nameDoc, (Len(nameDoc) - 2)) 'удаляем 2 последних символа - получаем чистый текст

                'Вставляет гиперссылку в ячейку с названием документа
                TableDocs.Cell(i, columnDocName).Range.Select

                ActiveDocument.Hyperlinks.Add _
                    Anchor:=Selection.Range, _
                    Address:=hLinkAdress, _
                    SubAddress:="", _
                    ScreenTip:="Перейти к файлу документа (в новом окне)", _
                    TextToDisplay:=nameDoc, _
                    Target:="_blank"

            End If

        End If

    Next i

    '2. Удаляем лишнее и наводим красоту в таблице

    'Запоминаем ширину столбца с Нумератором (первый столбец)
    TableDocs.Columns(1).Select
    ColumnWidth = Selection.Columns.PreferredWidth

    'Удаляем столбец с названием файла
    TableDocs.Columns(columnFile).Delete

    'Расширяем таблицу на 100% страницы
    TableDocs.PreferredWidthType = wdPreferredWidthPercent
    TableDocs.PreferredWidth = 100

    'Возвращаем ширину для столбца нумератора
    TableDocs.Columns(1).PreferredWidthType = wdPreferredWidthPercent
    TableDocs.Columns(1).PreferredWidth = ColumnWidth

End If
    
End Sub

Function BookmarkIs(BookmarkName As String) As Boolean

'Проверка на корректность названия привязки

Dim Bkm As Bookmark 'переменная типа Закладка


BookmarkIs = False 'сначала считаем, что нужной закладки нет

For Each Bkm In ActiveDocument.Bookmarks 'перебираем все закладки в документе

    If Bkm.Name = BookmarkName Then 'если нашли закладку с нашим именем
    
        BookmarkIs = True 'отмечаем, что закладка есть
        
    End If
 
Next
    
End Function

Результат

Рисунок 7. Вид данных, сформированных по необходимой привязке, в выполненном отчете в HTML-публикации после решения задачи

При этом решении следует помнить о том, что в зависимости от направления вывода отчета (документ Word/Excel или HTML-публикация/Business Studio Portal) и способа закрепления за документом файла, ссылки на файлы документов могут быть не всегда.

Способ закрепления файла Документ есть в дереве HTML Документа нет в дереве HTML
Документ имеет закрепленный файл непосредственно Ссылка на указанный файл Ссылки нет
Документ имеет ссылку на файл вида http:// , ftp:// Ссылка на указанный файл Ссылка на указанный файл
Документ имеет ссылку на локальный файл на компьютере пользователя Business Studio Ссылка на документ в HTML Ссылки нет
Таблица 2. Возможные свойства гиперссылок в зависимости от направления вывода отчета и способа закрепления за документом файла
« ПредыдущаяНа уровень вышеСледующая »
Driven by DokuWiki