Учим БСП печатать активные ссылки и подложку в документе WORD
Небольшое расширение БСП для печати в WORD. Добавлена печать активных ссылок, подложки документа, и фона страницы.
- Описание
- Подробнее
Описание
Стандартный функционал БСП при печати делает все гиперссылки неактивными, оставляя их оформление, а также теряет оформление страницы документа (фон и подложку). Данное расширение исправляет эти проблемы. Для чего это нужно, например для красивых прайсов, с последующим их преобразование в PDF и рассылки клиентам.
В расширении были модифицированы следующие общего модуля "УправлениеПечатьюСлужебный":
- ОбработатьРазделДокумента()
- РазбитьТекстШаблонаНаОбласти()
- СобратьФайлДокументаDOCX()
- ИнициализироватьСтруктуруПечатнойФормы()
Разберем доработки в порядке вызова их при печати.
При инициализации макета происходит вызов процедуры РазбитьТекстШаблонаНаОбласти() именно в ней теряется вся "магия" ссылок. Проблема в том, что БСП при разборе текста делит его на два типа "параграф" и все остальное. Научим ее понимать ссылки, комментариям с "{","}" обозначен доработанный код.
&Вместо("РазбитьТекстШаблонаНаОбласти")
Процедура Расш1_РазбитьТекстШаблонаНаОбласти(ЧтениеXML, СтруктураДокумента, ПараметрыАнализа)
УровеньТэгаБлок = -1;
УровеньТэгаОбласть = -1;
УровеньАбзаца = "0";
ТекущийУровень = 0;
ПропуститьТэг = Ложь;
ТекстРаздела = "";
//{
ЭтоСсылка = Ложь; // Флаг разбора ссылки
текБлокРазбора = ""; // возможные значения "Блок", "АбзацХ", где Х - порядковый номер
//}
СтруктураРазбораXML = ИнициализироватьРазборXML();
СброситьСтатусыТэгов1С(СтруктураРазбораXML);
ИнициализироватьЗаписьВПоток(СтруктураРазбораXML, "Заголовок", "");
Если ПараметрыАнализа.ТипАнализа <> 1 Тогда
ИнициализироватьЗаписьВПоток(СтруктураРазбораXML, "Блок", "");
УровеньТэгаБлок = 0;
КонецЕсли;
Пока ЧтениеXML.Прочитать() Цикл
...
Если ЧтениеНачалаРаздела(СтруктураРазбораXML, ЧтениеXML) Тогда
СтруктураРазбораXML.БлокирующийПоток = "Раздел";
ИнициализироватьЗаписьВПоток(СтруктураРазбораXML, "Раздел", "", Ложь);
ПеренестиОткрывающиеТэгиЗаписиВПоток(СтруктураРазбораXML, "Заголовок", "Раздел", "w:body");
КонецЕсли;
// начало разбора ссылки {
Если ЧтениеНачалаБлокаСсылки(СтруктураРазбораXML, ЧтениеXML) Тогда
ИнициализироватьЗаписьВПоток(СтруктураРазбораXML, "Ссылка");
//ОстановитьЗаписьВПоток(СтруктураРазбораXML, "Абзац" + УровеньАбзаца);
ОстановитьЗаписьВПоток(СтруктураРазбораXML, текБлокРазбора);
ЭтоСсылка = Истина;
КонецЕсли;
// }
Если ЧтениеНачалаЛюбогоБлокаКромеПараграфа(СтруктураРазбораXML, ЧтениеXML) И ТекущийУровень = УровеньТэгаБлок Тогда
ИнициализироватьЗаписьВПоток(СтруктураРазбораXML, "Блок");
текБлокРазбора = "Блок"; // укажем текущий блок {}
КонецЕсли;
Если ЧтениеНачалаПараграфа(СтруктураРазбораXML, ЧтениеXML) Тогда
УровеньАбзаца = Формат(Число(УровеньАбзаца) + 1, "ЧН=0; ЧГ=0");
СтруктураРазбораXML.ТекущийУровеньАбзаца = УровеньАбзаца;
СброситьСтатусыТэгов1С(СтруктураРазбораXML, Истина);
ИнициализироватьЗаписьВПоток(СтруктураРазбораXML, "Абзац" + УровеньАбзаца);
ИнициализироватьЗаписьВПоток(СтруктураРазбораXML, "Строки" + УровеньАбзаца);
ОстановитьЗаписьВПоток(СтруктураРазбораXML, "Строки" + УровеньАбзаца);
текБлокРазбора = "Абзац" + УровеньАбзаца; // укажем текущий блок {}
КонецЕсли;
...
// учтем флаг разбора ссылки {
//Если ЧтениеНачалаСтроки(СтруктураРазбораXML, ЧтениеXML) Тогда
Если ЧтениеНачалаСтроки(СтруктураРазбораXML, ЧтениеXML) И НЕ ЭтоСсылка Тогда
// }
ВозобновитьЗаписьВПоток(СтруктураРазбораXML, "Строки" + УровеньАбзаца);
ИнициализироватьЗаписьВПоток(СтруктураРазбораXML, "СтрокаПарам" + УровеньАбзаца);
ОстановитьЗаписьВПоток(СтруктураРазбораXML, "Абзац" + УровеньАбзаца);
СтруктураРазбораXML.ИмяПотокаФормата = "СтрокаПарам" + УровеньАбзаца;
КонецЕсли;
...
// учтем флаг разбора ссылки {
//Если ЧтениеКонцаСтроки(СтруктураРазбораXML, ЧтениеXML) Тогда
Если ЧтениеКонцаСтроки(СтруктураРазбораXML, ЧтениеXML) И НЕ ЭтоСсылка Тогда
// }
Если СтруктураРазбораXML.СтатусТэга1С = 0 И СтруктураРазбораXML.РазобранныеСтроки.Количество() = 0 Тогда
ПеренестиЗаписьВПоток(СтруктураРазбораXML, "Строки" + УровеньАбзаца, "Абзац" + УровеньАбзаца);
ИначеЕсли СтруктураРазбораXML.РазобранныеСтроки.Количество() > 0 Тогда
...
КонецЕсли;
...
КонецЕсли;
Если ЧтениеКонцаПараграфа(СтруктураРазбораXML, ЧтениеXML) Тогда
...
КонецЕсли;
// завершение разбора ссылки {
Если ЧтениеКонцаБлокаСсылки(СтруктураРазбораXML, ЧтениеXML) Тогда
Если текБлокРазбора = "" Тогда
текБлокРазбора = "Строки" + УровеньАбзаца;
КонецЕсли;
ВозобновитьЗаписьВПоток(СтруктураРазбораXML, текБлокРазбора);
ЗавершитьЗаписьВПоток(СтруктураРазбораXML, "Ссылка");
ПеренестиЗаписьВПоток(СтруктураРазбораXML, "Ссылка", текБлокРазбора);
ЭтоСсылка = Ложь;
КонецЕсли;
// }
...
КонецПроцедуры
