Как отобразить файл Word в ПолеHTMLДокумента в 1С 8.3.14 и новее?

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

С выходом версии платформы 1С:Предприятие 8.3.14 разработчики столкнулись с неприятной проблемой: привычный и ранее безотказно работавший механизм отображения файлов Microsoft Word через формат веб-архива .mht в элементе формы ПолеHTMLДокумента полностью перестал функционировать. Выясним причину этого поведения и подробно разберем, как адаптировать наши программные решения под современные требования платформы.

Почему перестал работать формат MHT?

Проанализируем ситуацию с технической стороны. Начиная с релиза 8.3.14, фирма 1С перевела внутренний движок отображения HTML-документов с устаревшего Internet Explorer (MSHTML) на современный и кроссплатформенный WebKit (а в более поздних версиях — на Chromium/Blink). Это нововведение позволило использовать современные стандарты верстки и скриптов, однако привело к отказу от поддержки специфических форматов Microsoft. Формат веб-архива .mht (MHTML), который активно генерировался объектом Word COM для упаковки всего документа с картинками в один файл, современными браузерными движками по умолчанию не поддерживается.

Попытки заменить формат сохранения на PDF (wdFormatPDF = 17) и передать его напрямую в поле HTML-документа также не приводят к желаемому результату без дополнительных манипуляций, так как чистый WebKit не умеет рендерить PDF "из коробки" внутри контейнера без встроенного плагина.

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

Решение 1. Конвертация в Filtered HTML с сохранением локальных ресурсов

Если на рабочих местах пользователей гарантированно установлен Microsoft Word, мы можем использовать COM-соединение для сохранения документа в формате отфильтрованного веб-документа (Filtered HTML). В отличие от обычного HTML, этот формат очищает документ от избыточной разметки MS Office, делая код более легким и совместимым с WebKit.

Разберем по шагам, как реализовать этот алгоритм:

  1. Создаем временный каталог на локальном диске пользователя. Это критически важно, так как при конвертации Word создаст не только файл .html, но и отдельную папку с картинками и стилями.
  2. Инициализируем COM-объект Word и открываем исходный документ.
  3. Сохраняем файл с константой формата wdFormatFilteredHTML = 10.
  4. Передаем путь к полученному файлу в ПолеHTMLДокумента через метод Перейти().

Посмотрим на пример программной реализации этого метода:


&НаКлиенте
Процедура ОтобразитьДокументWord(ПолныйПутьКФайлу)
    
    // Шаг 1. Подготовка путей во временном каталоге
    ИмяВременнойПапки = КаталогВременныхФайлов() + "WordHTML_" + СтрЗаменить(Строка(Новый УникальныйИдентификатор), "-", "");
    СоздатьКаталог(ИмяВременнойПапки);
    
    ПутьКHTML = ИмяВременнойПапки + "\document.html";
    
    // Константа MS Word для Filtered HTML
    wdFormatFilteredHTML = 10;
    
    // Шаг 2. COM-соединение с Word
    Попытка
        WordПриложение = Новый COMОбъект("Word.Application");
        WordПриложение.Visible = Ложь;
    Исключение
        ВызватьИсключение "Не удалось запустить Microsoft Word. Убедитесь, что приложение установлено.";
    КонецПопытки;
    
    // Шаг 3. Конвертация
    Попытка
        ДокументWord = WordПриложение.Documents.Open(ПолныйПутьКФайлу, Ложь, Истина); // Открываем только для чтения
        ДокументWord.SaveAs2(ПутьКHTML, wdFormatFilteredHTML);
        ДокументWord.Close();
        WordПриложение.Quit();
    Исключение
        WordПриложение.Quit();
        ВызватьИсключение "Ошибка при конвертации документа: " + ОписаниеОшибки();
    КонецПопытки;
    
    // Шаг 4. Загрузка в ПолеHTMLДокумента формы
    // ДляПоляHTMLДокумента — это имя элемента формы типа ПолеHTMLДокумента
    Элементы.ДляПоляHTMLДокумента.Документ.location.href = "file:///" + СтрЗаменить(ПутьКHTML, "\", "/");
    
КонецПроцедуры

Преимущества: Простота реализации, высокая точность рендеринга текста, таблиц и встроенных изображений, так как WebKit отлично считывает локальные файлы картинок из сопутствующей папки по относительным путям.

Недостатки: Требуется наличие установленного Microsoft Word на клиенте; необходимость очистки временных папок после закрытия формы.

Решение 2. Конвертация в HTML с упаковкой изображений в Base64

В случаях, когда создание дополнительных папок на диске крайне нежелательно и требуется передавать документ в виде единой строки (например, через временное хранилище между сервером и клиентом), можно применить метод встраивания ресурсов.

Суть метода заключается в том, что мы программно парсим полученный после конвертации HTML-код, находим все теги <img>, считываем файлы картинок из локальной папки ресурсов, кодируем их в формат Base64 и подставляем полученную строку непосредственно в атрибут src тега.

Рассмотрим концептуальную схему парсинга кода после конвертации в HTML:


// Примерный алгоритм обработки HTML-текста в 1С
Функция УпаковатьКартинкиВHTML(ТекстHTML, ПутьКПапкеРесурсов) Экспорт
    
    // Регулярным выражением или простым поиском подстроки находим все вхождения тегов картинок
    // Для каждого найденного имени файла картинки:
    // 1. Читаем файл картинки в ДвоичныеДанные:
    //    ДДКартинки = Новый ДвоичныеДанные(ПутьКПапкеРесурсов + "\" + ИмяФайлаКартинки);
    // 2. Кодируем в Base64:
    //    СтрокаBase64 = ПолучитьBase64СтрокуИзДвоичныхДанных(ДДКартинки);
    // 3. Заменяем в HTML: src="ИмяФайла.png" на src="data:image/png;base64,СтрокаBase64"
    
    Возврат ОбработанныйТекстHTML;
КонецФункции

Этот способ позволяет получить один монолитный файл HTML, который можно легко записать в реквизит формы и отобразить в ПолеHTMLДокумента на любом клиенте без привязки к локальным путям файловой системы.

Решение 3. Использование JavaScript-библиотек (без использования MS Word на клиенте)

Современный WebKit-движок внутри 1С предоставляет полноценную поддержку стандартов JavaScript. Это открывает перед нами возможность рендерить современные документы формата .docx непосредственно на стороне клиента с помощью сторонних JS-библиотек. Отличным примером является библиотека docx-preview.js.

Этот подход избавляет от необходимости устанавливать пакет MS Office на рабочие станции пользователей. Посмотрим, как это работает:

  1. Файл DOCX считывается в 1С в виде двоичных данных и передается на клиент.
  2. В ПолеHTMLДокумента загружается базовый HTML-шаблон, содержащий подключение библиотеки docx-preview.min.js.
  3. Через встроенные механизмы взаимодействия 1С и JavaScript (например, метод ВыполнитьСкрипт() или через событие ПриНажатии) двоичные данные файла, переведенные в Base64-строку, передаются внутрь HTML-страницы.
  4. Скрипт JavaScript преобразует Base64-строку в массив байтов (ArrayBuffer) и с помощью функции библиотеки рендерит документ в указанный контейнер <div>.

Этот метод гарантирует стабильную кроссплатформенную работу даже на операционных системах Linux и macOS, где COM-объект Word недоступен по определению.

Решение 4. Конвертация в PDF с отображением через PDF.js

Если для документов критически важно сохранение сложной оригинальной разметки (многоколоночный текст, сложные формулы, точные отступы абзацев), лучшим решением будет предварительная конвертация файла Word в PDF. Сделать это можно на стороне сервера (например, средствами пакета LibreOffice в фоновом режиме или COM-объектом Word, если сервер работает под управлением Windows).

Для отображения PDF-файла в WebKit-движке 1С используется популярная библиотека PDF.js от Mozilla. Вы загружаете код библиотеки в макет вашей конфигурации, инициализируете его внутри HTML-поля и передаете путь к файлу PDF или его двоичные данные. Библиотека предоставляет полноценный интерфейс просмотра с возможностью масштабирования, поиска по тексту и перехода по страницам.

Решение 5. Современный штатный механизм платформы 1С

Для тех, кто использует современные версии платформы 1С:Предприятие (начиная с версий 8.5.3 / 8.5.4), разработчики платформы реализовали долгожданное нативное решение этой проблемы.

В платформе появился специализированный элемент управления — Поле отображаемого документа (RepresentableDocumentField). Этот элемент разработан специально для решения задач предпросмотра различных типов документов без написания сложного кода обхода ограничений браузеров.

Основные особенности штатного механизма:

Подведем итог. Переход платформы 1С на современные веб-технологии закрыл старые "костыли" работы с файлами через устаревший формат MHT. Однако взамен разработчики получили мощный инструментарий в виде поддержки современных JS-библиотек прямо внутри форм 1С, а в последних версиях платформы — и готовые нативные элементы отображения офисных документов, решающие эти задачи в одну строку кода.

← На главную