Отображение PDF-документов непосредственно внутри формы 1С — задача востребованная, но часто вызывающая трудности у разработчиков. Особенно остро проблема проявляется на платформе 8.3.15 и смежных версиях, где встроенный движок Поля HTML-документа имеет ряд ограничений по безопасности и поддержке плагинов. В этой статье мы разберем, почему стандартные подходы с прямыми ссылками на файлы не работают, и рассмотрим наиболее надежные способы реализации этой задачи.
Рассмотрим ситуацию: у нас есть данные PDF в ХранилищеЗначения. Типичная ошибка — попытаться передать путь к временному файлу или адрес из временного хранилища напрямую в тег <embed> или <iframe>. Проанализируем причины неудачи:
ПоместитьВоВременноеХранилище, является внутренней ссылкой 1С. Встроенный браузер (будь то WebKit или Internet Explorer в режиме совместимости) не знает, как обрабатывать этот протокол внутри HTML-контента.file:///) из соображений безопасности.<embed> просто отобразит пустое окно.Для решения этих проблем мы разберем три основных метода: использование Base64, библиотеку PDF.js и правильное формирование путей к файлам.
Этот способ позволяет внедрить содержимое 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.
Проанализируем более профессиональный подход. Библиотека PDF.js от Mozilla позволяет отрисовывать PDF-файлы с помощью JavaScript на элементе canvas. Это самый стабильный метод, так как он не зависит от системных плагинов Acrobat Reader.
Выясним алгоритм действий:
PDF.js и добавьте её основной код в макет конфигурации (тип макета — Текстовый документ).Посмотрим на упрощенную структуру 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.
Если вы все же решили использовать временные файлы, необходимо правильно подготовить путь для браузера. Простого системного пути 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:
Поле HTML-документа будет использовать движок Internet Explorer. В этом случае наличие установленного Adobe Reader в системе критично.Использовать стандартные расширения HTML-конструкций. В этом режиме поддержка PDF работает "из коробки" гораздо лучше.ЗапуститьПриложение(ИмяФайла). Это откроет PDF во внешнем приложении пользователя, что часто удобнее для чтения и печати.Подводя итог, для реализации просмотра PDF внутри 1С наиболее универсальным и современным способом является передача данных через Base64 в сочетании с библиотекой PDF.js. Это избавляет от проблем с путями, правами доступа к дислокации временных файлов и зависимостей от стороннего ПО на стороне клиента.