Каталог решений - Учим БСП печатать активные ссылки и подложку в документе WORD

Учим БСП печатать активные ссылки и подложку в документе WORD

Учим БСП печатать активные ссылки и подложку в документе 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, "Ссылка", текБлокРазбора); 
			ЭтоСсылка = Ложь;
		КонецЕсли;	
		// }
		
...	
КонецПроцедуры
С помощью двух простых функций определяем начало и конец блока ссылки, листинг ниже:

has been added to your cart:
Оформление заказа