Как распечатать макет HTML в 1С 8.3

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При разработке нестандартных печатных форм разработчики иногда выбирают формат HTML из-за гибкости верстки. Однако при попытке вывести сформированный HTML-код через стандартный объект ТекстовыйДокумент вместо отформатированного документа на экран выводятся исходные теги разметки. Выясним причину такого поведения платформы и подробно разберем все способы корректного вывода и печати HTML-макетов, а также надежные альтернативные решения.

Почему ТекстовыйДокумент не отображает HTML-разметку

Проанализируем базовый механизм работы платформы: объект ТекстовыйДокумент спроектирован исключительно для работы с простым неформатированным текстом (plain text). Когда мы передаем в него строку, содержащую HTML-теги, платформа не производит парсинг и рендеринг веб-разметки, а отображает переданную строку как обычный текст.

Для того чтобы документ отобразился в виде сверстанной страницы и был отправлен на принтер, требуется движок рендеринга (браузер). Рассмотрим рабочие варианты реализации такой печати.

Способ 1. Использование элемента формы «Поле HTML документа»

Разберем по шагам, как организовать предварительный просмотр и печать HTML-макета прямо внутри управляемой формы 1С:

  1. Добавим в форму реквизит с типом Строка (например, с именем ТекстHTML).
  2. Разместим данный реквизит на форме и установим для элемента формы вид Поле HTML документа.
  3. Заполним реквизит подготовленной строкой HTML с подставленными значениями.
  4. Вызовем печать через объектную модель документа или встроенный скрипт.

Посмотрим на пример кода формирования и вывода HTML-макета на форме:


&НаСервере
Процедура СформироватьДокументНаСервере()
    Макет = РеквизитФормыВЗначение("Объект").ПолучитьМакет("Акт");
    ИсходныйТекстHTML = Макет.ПолучитьТекст();
    
    // Заменяем параметры в шаблоне
    ИсходныйТекстHTML = СтрЗаменить(ИсходныйТекстHTML, "{Организация}", Объект.Организация.Наименование);
    ИсходныйТекстHTML = СтрЗаменить(ИсходныйТекстHTML, "{Сумма}", Формат(Объект.СуммаДокумента, "ЧДЦ=2"));
    
    ТекстHTML = ИсходныйТекстHTML;
КонецПроцедуры

&НаКлиенте
Процедура ПечатьHTML(Команда)
    // Печать средствами браузерного движка платформы
    Элементы.ПолеHTML.Документ.defaultView.print();
КонецПроцедуры

Также можно внедрить в сам HTML-шаблон автоматический запуск диалога печати сразу при загрузке документа, добавив в секцию <head> команду JavaScript window.print();.

Способ 2. Открытие HTML во внешнем браузере для печати

Если печатную форму необходимо открыть стандартными средствами операционной системы без создания специальной формы в 1С, сохраним сгенерированный HTML во временный файл и откроем его в браузере по умолчанию.

Рассмотрим пример реализации:


&НаКлиенте
Процедура РаспечататьЧерезБраузер()
    ПутьКФайлу = ПолучитьИмяВременногоФайла("html");
    
    ТекстДляЗаписи = ПолучитьЗаполненныйHTMLНаСервере();
    
    Запись = Новый ЗаписьТекста(ПутьКФайлу, КодировкаТекста.UTF8);
    Запись.Записать(ТекстДляЗаписи);
    Запись.Закрыть();
    
    // Запуск файла в системном браузере
    ЗапуститьПриложение(ПутьКФайлу);
КонецПроцедуры

В открывшемся окне браузера пользователь сможет воспользоваться стандартным диалогом предварительного просмотра и отправить документ на любой доступный принтер.

Способ 3. Вывод печатной формы через шаблон MS Word

В ситуациях, когда требуется строгая верстка объемных текстовых договоров или актов со сложным форматированием, отличной альтернативой 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);
КонецПроцедуры

Способ 4. Корректная настройка табличного документа

Часто переход на HTML или Word обусловлен тем, что в стандартном объекте ТабличныйДокумент «съезжают» колонки и строки при автопереносе длинного текста. Однако макет типа ТабличныйДокумент остается наиболее производительным и нативным инструментом 1С.

Проанализируем правила, которые позволяют избежать искажения верстки в табличном документе:

  1. Объединение ячеек под длинный текст: для абзацев и реквизитов с переменной длиной объединяем несколько колонок и включаем в свойствах ячейки свойство РазмещениеТекста = Переносить.
  2. Фиксация параметров страницы: программно задаем параметры перед выводом на печать, чтобы документ не масштабировался произвольно.

Посмотрим на пример настройки параметров страницы:


ТабДок = Новый ТабличныйДокумент;
ТабДок.ОриентацияСтраницы = ОриентацияСтраницы.Портрет;
ТабДок.АвтоМасштаб = Истина;
ТабДок.ПолеСлева = 10;
ТабДок.ПолеСправа = 10;
ТабДок.ПолеСверху = 10;
ТабДок.ПолеСнизу = 10;
ТабДок.Показать();

Таким образом, для печати HTML-макетов следует использовать встроенное Поле HTML документа либо внешний браузер, а для сложных типовых документов рассмотреть стандартный табличный документ или макеты офисных форматов.

← На главную