В предыдущей статье мы научили БСП выводить ссылки в WORD. Теперь разберем как вывести различные ссылки в строки таблицы.
Для начала подготовим макет документа WORD. В макете мы будем выводить ссылку в картинке, для этого дадим рисунку уникальное имя.
Теперь обработаем название рисунка и вставим уникальную ссылку.
В процедуре Печать() все как обычно здесь она приведена, для того чтобы было понятно откуда происходит вызов функции ПечатьWord()
Процедура Печать(МассивОбъектов, ПараметрыПечати, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
ИмяМакета = "ИмяМакета";
ПечатнаяФорма = УправлениеПечатью.СведенияОПечатнойФорме(КоллекцияПечатныхФорм, ИмяМакета);
Если ПечатнаяФорма <> Неопределено Тогда
МакетИДанныеОбъекта = УправлениеПечатьюВызовСервера.МакетыИДанныеОбъектовДляПечати("Обработка.ПечатьВВорд", ИмяМакета, МассивОбъектов);
ОфисныеДокументы = Новый Соответствие;
Для Каждого Ссылка Из МассивОбъектов Цикл
АдресХранилищаОфисныйДокумент = ПечатьWord(Ссылка, МакетИДанныеОбъекта, ИмяМакета, ПараметрыПечати);
ОфисныеДокументы.Вставить(АдресХранилищаОфисныйДокумент, ИмяДокумента);
КонецЦикла;
ПечатнаяФорма.ОфисныеДокументы = ОфисныеДокументы;
КонецЕсли;
КонецПроцедуры
Теперь рассмотрим функцию ПечатьWord()
Здесь нужно при добавлении каждой ссылки обновлять таблицу связей документа. Для этого добавим в конец строки переменной ПечатнаяФорма.СтруктураДокумента.СвязиКонтента данные о новой ссылке. В листинге шаблон добавления описан в переменной ШаблонСсылкиВТаблицеСвязей (см. листинг).
Для чего все это нужно?) Дело в том в XML-структуре документ в ссылке не хранится прямой адрес, а указан ИД из таблицы связей контекста (которая является отдельным файлом XML). Полученный таким образом ИД в дальнейшем будет использован для подстановки в ссылку.
Следует отметить, что помимо переменной СтруктураДокумента.СвязиКонтента, БСП разбирает файл связи контекста в таблицу значений, которая также есть в структуре документа, но в данный момент эта таблица никак в дальнейшем не используется, поэтому в нее ничего не добавляем.
Теперь добавим ссылку используя полученный ИД. Для этого нам потребуется получить область макета строки таблицы и использовать два шаблона для вставки: первая вставляет всплывающую подсказку на ссылку(ТекстСсылки1), а вторая сама ссылку(ТекстСсылки2). Для добавления воспользуемся функцией СтрЗаменить() вот тут и пригодится уникальное имя рисунка, именно по нему мы и будем искать место для вставки.
ВАЖНО: Перед использованием СтрЗаменить нужно сохранить текст области в отдельную переменную, чтобы потом после вывода области вернуть текст обратно. Т.к. в отличие от обычного получения области, здесь не происходит обращения к макету, область получается из структуры, которая была инициализирована при разборе макета WORD.
Для вставки всплывающей подсказки ищем в тексте области текст: "рисПаспорт""/><wp:cNvGraphicFramePr>"
Для вставки ссылки ищем текст - "рисПаспорт""/><pic:cNvPicPr/>"
Листинг вывода в строку таблицы и замена текста в связях контента и формирование ссылок приведен ниже:
Функция ПечатьWord(ДокументСсылка, МакетИДанныеОбъекта, ИмяМакета, ПараметрыПечати)
...
ПечатнаяФорма = УправлениеПечатью.ИнициализироватьПечатнуюФорму(, , Макет);
АдресХранилищаПечатнойФормы = "";
...
//получим количество связей и инициализируем последний номер
ИдНомерСвязи = ПечатнаяФорма.СтруктураДокумента.ТаблицаСвязейКонтента.Количество();// индексы с 1, поэтому кол-во строк = последний индекс
Область = УправлениеПечатью.ОбластьМакета(Макет, Области[ИмяМакета]["ШапкаТаблицы"]);
УправлениеПечатью.ПрисоединитьОбластьИЗаполнитьПараметры(ПечатнаяФорма, Область, ДанныеОбъекта, Ложь);
Для каждого СтрокаТЧ Из ДанныеОбъекта.ТЧ Цикл
ИсходныйТекстОбласти = "";
флВставитьСсылку = Ложь;
Если ЗначениеЗаполнено(СтрокаТЧ.СсылкаКФайлу) Тогда
ИдНомерСвязи = ИдНомерСвязи + 1;
ШаблонСсылкиВТаблицеСвязей = "<Relationship Id=""" + Формат(ИдНомерСвязи, "ЧДЦ=0; ЧГ=0; ЧФ=rIdЧ") + """"
+ " Type=""http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink"""
+ " Target=""" + СтрокаТЧ.СсылкаКФайлу + """"
+ " TargetMode=""External""/>";
//добавим в конец текста связей
ПечатнаяФорма.СтруктураДокумента.СвязиКонтента = СтрЗаменить(ПечатнаяФорма.СтруктураДокумента.СвязиКонтента, "</Relationships>", ШаблонСсылкиВТаблицеСвязей + "</Relationships>");
флВставитьСсылку = Истина;
КонецЕсли;
Область = УправлениеПечатью.ОбластьМакета(Макет, Области[ИмяМакета]["СтрокаТаблицы"]);
Если флВставитьСсылку Тогда
ИсходныйТекстОбласти = Область.Текст;
ТекстСсылки1 = "<a:hlinkClick xmlns:a=""http://schemas.openxmlformats.org/drawingml/2006/main"" r:id=""" + Формат(ИдНомерСвязи, "ЧДЦ=0; ЧГ=0; ЧФ=rIdЧ") + """/>";
ТекстСсылки2 = "<a:hlinkClick r:id=""" + Формат(ИдНомерСвязи, "ЧДЦ=0; ЧГ=0; ЧФ=rIdЧ") + """/>";
Область.Текст = СтрЗаменить(Область.Текст, "рисПаспорт""/><wp:cNvGraphicFramePr>", "рисПаспорт"">" + ТекстСсылки1 + "</wp:docPr><wp:cNvGraphicFramePr>");
Область.Текст = СтрЗаменить(Область.Текст, "рисПаспорт""/><pic:cNvPicPr/>", "рисПаспорт"">" + ТекстСсылки2 + "</pic:cNvPr><pic:cNvPicPr/>");
КонецЕсли;
УправлениеПечатью.ПрисоединитьОбластьИЗаполнитьПараметры(ПечатнаяФорма, Область, СтрокаТЧ, Ложь);
Если флВставитьСсылку Тогда
Область.Текст = ИсходныйТекстОбласти;
КонецЕсли;
КонецЦикла;
АдресХранилищаПечатнойФормы = УправлениеПечатью.СформироватьДокумент(ПечатнаяФорма);
УправлениеПечатью.ОчиститьСсылки(ПечатнаяФорма, ЗакрытьОкноПечатнойФормы);
УправлениеПечатью.ОчиститьСсылки(Макет);
Возврат АдресХранилищаПечатнойФормы;
КонецФункции
Проверено на БСП 3.1.5.306.