С выходом платформы 1С:Предприятие 8.3.24 разработчики получили долгожданный инструмент для прямой работы с PDF-файлами — объект ДокументPDF. Он позволяет программно читать, объединять и отображать документы без использования внешних библиотек. Однако на практике многие столкнулись с проблемой: при использовании метода Показать() вместо текста отображаются нечитаемые символы (что мешает печати пособий) или пустые блоки, хотя в Adobe Acrobat этот же файл выглядит идеально. Рассмотрим подробно, почему это происходит и как решить данную проблему.
Разберем ситуацию: когда мы открываем файл через специализированное ПО (например, Adobe Acrobat Reader), программа использует мощные внутренние алгоритмы рендеринга и огромную базу встроенных шрифтов. В случае отсутствия конкретного шрифта Acrobat умеет выполнять интеллектуальную подстановку (font substitution).
Встроенный просмотрщик 1С использует собственный движок. Основные причины проблем с визуализацией следующие:
Type 1 или CID-шрифты. Ранние сборки платформы 8.3.24 (включая 8.3.24.1548) имели ограниченную поддержку таких таблиц для кириллицы.Показать() вызывается на клиенте, процесс подготовки или формирования данных может происходить на сервере, где набор доступных шрифтов может отличаться.Проанализируем первый и самый очевидный шаг. Если документ использует стандартные, но редкие шрифты (например, ГОСТовские шрифты для чертежей), их необходимо установить в операционную систему.
Важные нюансы установки:
ДокументPDF доступен на сервере и может использоваться для предварительной обработки документа.msttcorefonts или вручную скопировать .ttf файлы в директорию /usr/share/fonts, после чего обновить кеш шрифтов командой fc-cache -f -v.Если у нас есть возможность влиять на процесс генерации PDF-файла (например, файл создается сторонней системой по нашему заказу), необходимо настроить полное встраивание шрифтов (Full Embed). Рассмотрим разницу:
ДокументPDF отобразит текст корректно на любом устройстве.Попробуем также пересохранить проблемный документ в стандарт PDF/A. Этот стандарт по определению требует наличия всех ресурсов внутри файла, что автоматически решает проблему с отсутствующими шрифтами в 1С.
Если системные шрифты не помогают, а объект ДокументPDF продолжает отображать текст некорректно, воспользуемся проверенным обходным путем. Вместо метода Показать(), задействуем движок браузера, который обычно лучше справляется с рендерингом PDF.
Для этого создадим на форме Поле HTML документа и выведем файл следующим образом:
&// На Клиенте
Процедура ОтобразитьPDFВПолеHTML(ДанныеФайла)
// Помещаем данные во временное хранилище, чтобы браузер мог их прочитать
АдресФайла = ПоместитьВоВременноеХранилище(ДанныеФайла, ЭтаФорма.УникальныйИдентификатор);
// Формируем простейший HTML-контейнер
ТекстHTML = "<html>
|<body style='margin:0;padding:0;overflow:hidden;'>
|<embed src='" + АдресФайла + "' type='application/pdf' width='100%' height='100%' />
|</body>
|</html>";
Элементы.ПолеHTMLПросмотра.УстановитьТекст(ТекстHTML);
КонецПроцедуры
Этот метод позволяет использовать системные компоненты (например, WebView2 в Windows), которые отображают PDF так же качественно, как современные браузеры.
Выясним, какую версию платформы мы используем. В версии 8.3.24.1548 функционал был достаточно сырым. В более поздних релизах (начиная с 8.3.24.2000 и в ветке 8.3.25) разработчики 1С внесли множество исправлений в механизмы работы с текстом в PDF. Если проблема сохраняется, обновление платформы — обязательный шаг.
Также не забудем проверить свойство ТипФайла объекта ДокументPDF. Иногда явное указание типа при чтении помогает платформе правильно интерпретировать поток данных:
ДокументPDF = Новый ДокументPDF;
// Можно попробовать явно указать тип, если читаем из потока
ДокументPDF.Прочитать(Поток);
// Проверяем тип после чтения
Если ДокументPDF.ТипФайла = ТипФайлаДокументаPDF.PDF Тогда
ДокументPDF.Показать("Просмотр документа");
КонецЕсли;
Проанализируем одно из заблуждений, встретившихся в обсуждении. Утверждение о том, что ДокументPDF недоступен на сервере — ошибочно. Согласно официальной документации, этот объект доступен в контексте Сервера, Толстого клиента и Внешнего соединения. Это позволяет нам выполнять «тяжелые» операции (например, склейку нескольких PDF-чертежей в один многостраничный файл) в фоновом задании на сервере, не блокируя работу пользователя.
Резюме: для стабильной работы с PDF в 1С 8.3.24 рекомендуется использовать платформу последних сборок, устанавливать шрифты на всех узлах системы и, в случае работы со сложными инженерными чертежами, отдавать предпочтение встраиванию шрифтов при генерации файлов или использованию Поля HTML документа для визуализации.