При разработке нестандартных печатных форм разработчики иногда выбирают формат HTML из-за гибкости верстки. Однако при попытке вывести сформированный HTML-код через стандартный объект ТекстовыйДокумент вместо отформатированного документа на экран выводятся исходные теги разметки. Выясним причину такого поведения платформы и подробно разберем все способы корректного вывода и печати HTML-макетов, а также надежные альтернативные решения.
Проанализируем базовый механизм работы платформы: объект ТекстовыйДокумент спроектирован исключительно для работы с простым неформатированным текстом (plain text). Когда мы передаем в него строку, содержащую HTML-теги, платформа не производит парсинг и рендеринг веб-разметки, а отображает переданную строку как обычный текст.
Для того чтобы документ отобразился в виде сверстанной страницы и был отправлен на принтер, требуется движок рендеринга (браузер). Рассмотрим рабочие варианты реализации такой печати.
Разберем по шагам, как организовать предварительный просмотр и печать HTML-макета прямо внутри управляемой формы 1С:
Строка (например, с именем ТекстHTML).Посмотрим на пример кода формирования и вывода HTML-макета на форме:
&НаСервере
Процедура СформироватьДокументНаСервере()
Макет = РеквизитФормыВЗначение("Объект").ПолучитьМакет("Акт");
ИсходныйТекстHTML = Макет.ПолучитьТекст();
// Заменяем параметры в шаблоне
ИсходныйТекстHTML = СтрЗаменить(ИсходныйТекстHTML, "{Организация}", Объект.Организация.Наименование);
ИсходныйТекстHTML = СтрЗаменить(ИсходныйТекстHTML, "{Сумма}", Формат(Объект.СуммаДокумента, "ЧДЦ=2"));
ТекстHTML = ИсходныйТекстHTML;
КонецПроцедуры
&НаКлиенте
Процедура ПечатьHTML(Команда)
// Печать средствами браузерного движка платформы
Элементы.ПолеHTML.Документ.defaultView.print();
КонецПроцедуры
Также можно внедрить в сам HTML-шаблон автоматический запуск диалога печати сразу при загрузке документа, добавив в секцию <head> команду JavaScript window.print();.
Если печатную форму необходимо открыть стандартными средствами операционной системы без создания специальной формы в 1С, сохраним сгенерированный HTML во временный файл и откроем его в браузере по умолчанию.
Рассмотрим пример реализации:
&НаКлиенте
Процедура РаспечататьЧерезБраузер()
ПутьКФайлу = ПолучитьИмяВременногоФайла("html");
ТекстДляЗаписи = ПолучитьЗаполненныйHTMLНаСервере();
Запись = Новый ЗаписьТекста(ПутьКФайлу, КодировкаТекста.UTF8);
Запись.Записать(ТекстДляЗаписи);
Запись.Закрыть();
// Запуск файла в системном браузере
ЗапуститьПриложение(ПутьКФайлу);
КонецПроцедуры
В открывшемся окне браузера пользователь сможет воспользоваться стандартным диалогом предварительного просмотра и отправить документ на любой доступный принтер.
В ситуациях, когда требуется строгая верстка объемных текстовых договоров или актов со сложным форматированием, отличной альтернативой HTML выступает макет на основе документа Microsoft Word. Шаблон загружается в конфигурацию или внешнюю обработку как макет типа ДвоичныеДанные.
Разберем по шагам программное заполнение макета через COM-объект Word.Application:
&НаКлиенте
Процедура СформироватьДоговорWord()
ИмяВременногоФайла = ПолучитьИмяВременногоФайла("doc");
// Получаем двоичные данные макета и сохраняем во временный файл
МакетДвоичныеДанные = ПолучитьМакетWordНаСервере();
МакетДвоичныеДанные.Записать(ИмяВременногоФайла);
Попытка
Word = Новый COMОбъект("Word.Application");
Word.Visible = Истина;
Исключение
Сообщить("Не удалось запустить Microsoft Word. Убедитесь, что приложение установлено.");
Возврат;
КонецПопытки;
ДокументWord = Word.Documents.Add(ИмяВременногоФайла);
// Замена закладок или параметров в тексте документа
ПоискИЗамена = ДокументWord.Content.Find;
ПоискИЗамена.Execute("{Организация}", , , , , , , , , Строка(Объект.Организация), 2);
ПоискИЗамена.Execute("{Номер}", , , , , , , , , Строка(Объект.Номер), 2);
КонецПроцедуры
Часто переход на HTML или Word обусловлен тем, что в стандартном объекте ТабличныйДокумент «съезжают» колонки и строки при автопереносе длинного текста. Однако макет типа ТабличныйДокумент остается наиболее производительным и нативным инструментом 1С.
Проанализируем правила, которые позволяют избежать искажения верстки в табличном документе:
Посмотрим на пример настройки параметров страницы:
ТабДок = Новый ТабличныйДокумент;
ТабДок.ОриентацияСтраницы = ОриентацияСтраницы.Портрет;
ТабДок.АвтоМасштаб = Истина;
ТабДок.ПолеСлева = 10;
ТабДок.ПолеСправа = 10;
ТабДок.ПолеСверху = 10;
ТабДок.ПолеСнизу = 10;
ТабДок.Показать();
Таким образом, для печати HTML-макетов следует использовать встроенное Поле HTML документа либо внешний браузер, а для сложных типовых документов рассмотреть стандартный табличный документ или макеты офисных форматов.