В процессе разработки на платформе 1С:Предприятие 8.3 часто возникает задача организовать предварительный просмотр PDF-документов (сканов счетов, договоров или актов) непосредственно в интерфейсе управляемой формы. Традиционный подход с сохранением файла во временный каталог пользователя и открытием через внешнее приложение не всегда удобен: это засоряет диск, создает риски безопасности и требует наличия установленного стороннего ПО. Рассмотрим подробнее, как реализовать «чистый» просмотр PDF, используя поле HTML-документа и внутренние механизмы платформы.
Самый простой способ — сформировать HTML-код, который указывает на данные, уже находящиеся в памяти сервера или временном хранилище. Для этого мы будем использовать теги <embed> или <iframe>. Разберем по шагам, как это работает на стороне сервера и клиента.
Проанализируем ситуацию: когда мы помещаем файл в ВременноеХранилище, платформа присваивает ему уникальный адрес вида e1cib/tempstorage/.... Этот адрес можно передать в атрибут src HTML-тега. Посмотрим на пример кода, который подготавливает такой HTML-текст:
&НаСервере
Процедура ОбновитьПолеHTMLНаСервере()
// Получаем двоичные данные файла (например, из присоединенных файлов БСП)
ДанныеФайла = РаботаСФайлами.ДанныеФайла(Объект.СсылкаНаФайл);
АдресХранилища = ДанныеФайла.СсылкаНаДвоичныеДанныеФайла;
// Определяем MIME-тип для корректной интерпретации браузером
ТипКонтента = "application/pdf";
// Формируем структуру HTML
ТекстHTML =
"<html>
|<body style=""margin:0; padding:0; overflow:hidden;"">
| <embed src=""" + АдресХранилища + """
| type=""" + ТипКонтента + """
| width=""100%""
| height=""100%"" />
|</body>
|</html>";
// Реквизит формы с типом "Строка", связанный с Полем HTML-документа
СодержимоеHTML = ТекстHTML;
КонецПроцедуры
Важно помнить, что при использовании этого метода в Тонком клиенте под управлением операционной системы Windows встроенный браузер (часто это движок Internet Explorer) может выдать ошибку DNS_FAIL. Это происходит потому, что браузерный компонент пытается разрешить e1cib как доменное имя в интернете. Если вы столкнулись с такой проблемой, перейдем к более надежному способу.
Чтобы избежать проблем с разрешением внутренних ссылок 1С, мы можем внедрить содержимое PDF-файла непосредственно в тело HTML-документа. Для этого переведем двоичные данные в строку Base64. Этот метод гарантирует, что браузер получит данные мгновенно, не пытаясь скачивать их по внешним ссылкам.
Рассмотрим, как реализовать этот алгоритм:
ДвоичныеДанные PDF-файла на сервере.Base64Строка().src тега iframe или embed, используя префикс data:application/pdf;base64,.Проанализируем пример реализации:
&НаСервере
Функция ПолучитьHTMLСBase64(СсылкаНаДокумент)
ДвоичныеДанные = СсылкаНаДокумент.ПолучитьОбъект().ДанныеФайла.Получить();
Если ДвоичныеДанные = Неопределено Тогда
Возврат "<html><body>Файл не найден</body></html>";
КонецЕсли;
СтрокаBase64 = Base64Строка(ДвоичныеДанные);
// Удаляем возможные переносы строк, которые иногда добавляет Base64Строка
СтрокаBase64 = СтрЗаменить(СтрокаBase64, Символы.ПС, "");
СтрокаBase64 = СтрЗаменить(СтрокаBase64, Символы.ВК, "");
ШаблонHTML =
"<html>
|<style> body { margin: 0; } </style>
|<body>
| <iframe src=""data:application/pdf;base64, " + СтрокаBase64 + """
| width=""100%"" height=""100%"" frameborder=""0"">
| </iframe>
|</body>
|</html>";
Возврат ШаблонHTML;
КонецФункции
Преимущество этого метода: полная автономность. Файл не создается на диске, и браузеру не нужно знать о существовании временного хранилища 1С. Ограничение: очень тяжелые файлы (десятки мегабайт) могут замедлить отрисовку формы, так как объем текстовых данных в памяти существенно возрастает.
Начиная с релизов платформы 8.3.14, у разработчиков появилась возможность управлять тем, какой движок использует ПолеHTMLДокумента. Если в свойствах элемента формы установить использование Chromium (вместо стандартного IE), многие проблемы с отображением PDF исчезают сами собой.
Выясним причину: современные версии Chromium имеют встроенный просмотрщик PDF (PDF Viewer), который корректно обрабатывает даже простые навигационные ссылки e1cib. Чтобы включить этот режим, в конфигураторе выберите ваше поле HTML и в палитре свойств найдите пункт Режим использования расширения или установите его программно при создании формы:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Установка современного движка для корректного отображения PDF
Элементы.ПолеПросмотраPDF.ИспользоватьChromium = Истина;
КонецПроцедуры
Если ваша конфигурация должна работать в условиях, где у пользователей нет ни Acrobat Reader, ни современных браузеров, мы можем пойти по пути внедрения JavaScript-библиотеки PDF.js от Mozilla прямо в макет 1С.
Разберем этот сложный, но самый профессиональный подход:
pdf.js и pdf.worker.js в общие макеты как двоичные данные.Этот способ позволяет реализовать полноценный интерфейс просмотра: с постраничной навигацией, поиском по тексту и масштабированием, не покидая окно 1С. Рассмотрим упрощенную схему интеграции через макет:
// В коде 1С
ТекстБиблиотеки = ПолучитьМакет("PDF_JS").ПолучитьТекст();
ДанныеФайла = Base64Строка(ДвоичныеДанныеPDF);
ТекстHTML = СтрЗаменить(МакетHTML, "[LIB_JS]", ТекстБиблиотеки);
ТекстHTML = СтрЗаменить(ТекстHTML, "[DATA_PDF]", ДанныеФайла);
При реализации любого из перечисленных методов, следует обратить внимание на несколько критических моментов:
1. MIME-типы: Всегда явно указывайте type="application/pdf" в тегах. Без этого поле HTML может решить, что данные являются обычным текстом или бинарным мусором.
2. Очистка хранилища: Если вы используете метод с e1cib/tempstorage, помните, что время жизни ссылки ограничено сеансом пользователя или временем жизни формы. При получении ссылки на сервере указывайте уникальный идентификатор формы: ПоместитьВоВременноеХранилище(Данные, ЭтаФорма.УникальныйИдентификатор).
3. Настройки безопасности IE: Если используется старый движок, убедитесь, что в настройках безопасности Windows для зоны "Internet" или "Local Intranet" разрешено выполнение сценариев и отображение смешанного содержимого. Часто именно блокировки безопасности становятся причиной появления «белого экрана» вместо документа.
Таким образом, мы проанализировали основные способы отображения PDF без создания файлов на клиенте. Для простых задач идеально подходит Base64 в теге iframe, а для современных систем — использование встроенного движка Chromium.