Как отобразить PDF-файл в поле HTML-документа 1С?

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

Отображение PDF-документов непосредственно внутри формы 1С — задача востребованная, но часто вызывающая трудности у разработчиков. Особенно остро проблема проявляется на платформе 8.3.15 и смежных версиях, где встроенный движок Поля HTML-документа имеет ряд ограничений по безопасности и поддержке плагинов. В этой статье мы разберем, почему стандартные подходы с прямыми ссылками на файлы не работают, и рассмотрим наиболее надежные способы реализации этой задачи.

Почему не работают стандартные методы?

Рассмотрим ситуацию: у нас есть данные PDF в ХранилищеЗначения. Типичная ошибка — попытаться передать путь к временному файлу или адрес из временного хранилища напрямую в тег <embed> или <iframe>. Проанализируем причины неудачи:

  1. Ограничения протокола eurl: Адрес, который возвращает функция ПоместитьВоВременноеХранилище, является внутренней ссылкой 1С. Встроенный браузер (будь то WebKit или Internet Explorer в режиме совместимости) не знает, как обрабатывать этот протокол внутри HTML-контента.
  2. Безопасность локальных путей: Даже если записать PDF во временный файл на диск, современные движки браузеров блокируют доступ к локальным ресурсам (протокол file:///) из соображений безопасности.
  3. Отсутствие встроенного вьюера: В старых версиях платформы 1С поле HTML полагалось на установленные в системе плагины (например, Adobe Acrobat Reader). Если плагин не интегрирован в браузер, тег <embed> просто отобразит пустое окно.

Для решения этих проблем мы разберем три основных метода: использование Base64, библиотеку PDF.js и правильное формирование путей к файлам.

Метод 1: Использование Base64 (Data URI)

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


// Получаем двоичные данные из хранилища
ДвоичныеДанные = Параметры.Ключ.ДанныеХЗ.Получить();

// Преобразуем данные в строку Base64
СтрокаBase64 = Base64Строка(ДвоичныеДанные);

// Формируем HTML-текст с использованием Data URI
ТекстHTML = "<html>
             |<head>
             |    <style>
             |        body, html { margin: 0; padding: 0; height: 100%; overflow: hidden; }
             |        embed { width: 100%; height: 100%; }
             |    </style>
             |</head>
             |<body>
             |    <embed src=""data:application/pdf;base64," + СтрокаBase64 + """ type=""application/pdf"" />
             |</body>
             |</html>";

Важное примечание: Метод с Base64 отлично работает для небольших документов (до 2–5 Мб). При работе с очень большими файлами Поле HTML-документа может потреблять значительный объем памяти или вовсе отказаться рендерить строку огромной длины, особенно если используется старый движок Internet Explorer.

Метод 2: Использование библиотеки PDF.js (Рекомендуемый)

Проанализируем более профессиональный подход. Библиотека PDF.js от Mozilla позволяет отрисовывать PDF-файлы с помощью JavaScript на элементе canvas. Это самый стабильный метод, так как он не зависит от системных плагинов Acrobat Reader.

Выясним алгоритм действий:

  1. Скачайте библиотеку PDF.js и добавьте её основной код в макет конфигурации (тип макета — Текстовый документ).
  2. В HTML-коде подключите этот скрипт.
  3. Передайте данные PDF в формате Base64 в JavaScript-функцию, которая выполнит рендеринг.

Посмотрим на упрощенную структуру HTML для этого метода:


<html>
<head>
    <script>
        // Здесь должен быть код библиотеки pdf.js или ссылка на него
    </script>
</head>
<body>
    <canvas id=""pdf-canvas""></canvas>
    <script>
        var pdfData = atob('[Здесь_Ваша_Строка_Base64]');
        // Код инициализации PDF.js для отрисовки pdfData на canvas
    </script>
</body>
</html>

Этот метод гарантирует идентичное отображение документа у всех пользователей, независимо от настроек их операционной системы и установленного ПО для чтения PDF.

Метод 3: Работа с временными файлами через корректные пути

Если вы все же решили использовать временные файлы, необходимо правильно подготовить путь для браузера. Простого системного пути C:\Temp\file.pdf недостаточно. Разберем, как правильно сформировать адрес.

Во-первых, необходимо заменить все обратные слеши на прямые. Во-вторых, добавить протокол file:///. Проанализируем пример кода:


ИмяФайла = ПолучитьИмяВременногоФайла(".pdf");
ДвоичныеДанные = Параметры.Ключ.ДанныеХЗ.Получить();
ДвоичныеДанные.Записать(ИмяФайла);

// Превращаем путь в пригодный для HTML
ПутьДляБраузера = СтрЗаменить(ИмяФайла, "\", "/");
ПутьДляБраузера = "file:///" + ПутьДляБраузера;

ТекстHTML = "<html><body>
             |<iframe src=""" + ПутьДляБраузера + """ width=""100%"" height=""100%""></iframe>
             |</body></html>";

Внимание: Этот метод может не сработать в последних версиях платформы (8.3.18+) при использовании движка Chromium, так как современные политики безопасности запрещают загрузку локальных файлов в iframe. В таких случаях используйте Метод 1 или Метод 2.

Дополнительные советы для платформы 8.3.15

Выясним несколько нюансов, специфичных для версии 8.3.15:

Подводя итог, для реализации просмотра PDF внутри 1С наиболее универсальным и современным способом является передача данных через Base64 в сочетании с библиотекой PDF.js. Это избавляет от проблем с путями, правами доступа к дислокации временных файлов и зависимостей от стороннего ПО на стороне клиента.

← На главную