Как открыть и просмотреть PDF на мобильной платформе 1С: решение ошибки "Тип не определен (ДокументPDF)"

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

Разработка мобильных приложений на платформе 1С часто сопряжена с необходимостью работы с печатными формами и документами. Одним из самых популярных форматов обмена документами является PDF. Однако, при попытке перенести код, работающий на десктопе, в мобильное приложение, разработчики часто сталкиваются с ошибкой.

Рассмотрим ситуацию, когда при попытке инициализации объекта возникает сообщение: Тип не определен (ДокументPDF). Разберем причины этого поведения, проанализируем архитектурные ограничения мобильной платформы и подробно изучим способы реализации просмотра PDF-файлов на смартфонах и планшетах.

Почему возникает ошибка "Тип не определен"?

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

Если мы посмотрим на доступность объекта ДокументPDF, то увидим следующий список: Тонкий клиент, веб-клиент, сервер, толстый клиент. Мобильной платформы (и мобильного клиента с автономным режимом) в этом списке нет.

Именно поэтому код вида:


Попытка
    PDF = Новый ДокументPDF();
Исключение
    Сообщить("Ошибка создания объекта: " + ОписаниеОшибки());
КонецПопытки;

Гарантированно приведет к ошибке выполнения на мобильном устройстве. Мобильная платформа — это облегченная версия среды исполнения, и многие "тяжелые" объекты в ней отсутствуют. Однако задача просмотра документов остается актуальной. Давайте разберем рабочие способы её решения.

Способ 1: Открытие во внешнем приложении (классический метод)

Самый простой и надежный способ показать пользователю PDF — делегировать эту задачу операционной системе. На любом современном смартфоне (Android или iOS) обычно уже установлено приложение для просмотра PDF (например, Adobe Reader, Google PDF Viewer или встроенные средства системы). В некоторых случаях для расширения возможностей взаимодействия с ОС Android можно использовать внешнюю компоненту Android tools.

Для открытия файла через внешнее приложение нам необходимо выполнить последовательность действий:

  1. Получить двоичные данные файла (из макета, из реквизита типа ХранилищеЗначения или скачать из интернета).
  2. Сохранить эти данные во временный файл на устройстве.
  3. Использовать метод ЗапуститьПриложение() для передачи файла операционной системе.

Посмотрим на пример реализации:


// Предположим, ДвоичныеДанныеPDF получены заранее
ИмяВременногоФайла = ПолучитьИмяВременногоФайла("pdf");
ДвоичныеДанныеPDF.Записать(ИмяВременногоФайла);

// Открываем файл во внешней программе
ЗапуститьПриложение(ИмяВременногоФайла);

Важные нюансы данного метода:

На современных версиях Android (особенно начиная с Android 10 и 11) действует политика Scoped Storage. Это означает, что внешние приложения могут не иметь доступа к папке кэша вашего мобильного приложения 1С. В результате, просмотрщик может открыться, но выдать ошибку "Файл не найден" или "Нет доступа".

Чтобы обойти это, рекомендуется использовать системные папки (например, "Документы", если есть права) или специальные механизмы обмена (Intent Sharing), которые сложнее реализовать средствами встроенного языка 1С без использования нативных компонент.

Способ 2: Просмотр внутри приложения через ПолеHTML

Если мы хотим, чтобы пользователь оставался внутри нашего приложения 1С и интерфейс выглядел бесшовно, нам поможет элемент формы ПолеHTMLДокумента. Однако здесь есть существенное различие в поведении между iOS и Android.

Особенности реализации на iOS

Движок WebKit, используемый в iOS, обладает нативной поддержкой PDF. Это значит, что вы можете просто передать путь к файлу или Base64-строку в ПолеHTMLДокумента, и система сама отрисует документ.

Особенности реализации на Android

Стандартный WebView на Android (обычно на базе Chromium) не умеет отображать PDF "из коробки". Если вы просто подсунете ему ссылку на локальный PDF-файл, он, скорее всего, предложит его скачать или покажет пустой экран. Альтернативой может стать программная конвертация отчетов 1С в графический формат, чтобы отображать страницы документа как картинки.

Для полноценного отображения PDF внутри HTML-поля на Android нам понадобится JavaScript-библиотека PDF.js. Рассмотрим алгоритм внедрения:

  1. Скачайте библиотеку PDF.js (версию для старых браузеров или ES5, так как WebView на старых Android может не поддерживать новейшие стандарты JS).
  2. Добавьте файлы библиотеки (pdf.js, pdf.worker.js) и viewer (viewer.html, viewer.css, viewer.js) в макеты вашего приложения.
  3. При открытии формы выгружайте эти файлы в локальную папку мобильного устройства.

Основная сложность — как передать сам PDF-файл в ПолеHTMLДокумента. В обсуждении на форуме предлагался вариант использования Base64. Разберем его подробнее.

Использование Base64: плюсы и минусы

Метод заключается в том, что мы конвертируем PDF в строку Base64 и "скармливаем" эту строку движку PDF.js прямо в HTML-коде.

Код конвертации на стороне 1С:


СтрокаBase64 = Base64Строка(ДвоичныеДанныеPDF);
// Удаляем переносы строк, если они есть, чтобы JS не сломался
СтрокаBase64 = СтрЗаменить(СтрокаBase64, Символы.ПС, "");
СтрокаBase64 = СтрЗаменить(СтрокаBase64, Символы.ВК, "");

Далее мы формируем HTML-страницу, где инициализируем PDF.js.


HTMLТекст = "
|<html>
|<head>
|   <script src=""pdf.js""></script>
|</head>
|<body>
|   <canvas id=""the-canvas""></canvas>
|   <script>
|       var pdfData = atob('" + СтрокаBase64 + "');
|       // Далее стандартный код инициализации PDF.js...
|   </script>
|</body>
|</html>";

Критическая проблема: Оперативная память.

Данный метод имеет серьезное ограничение. Строка Base64 занимает примерно на 33% больше памяти, чем исходный бинарный файл. При попытке передать такую строку в WebView мобильное приложение может аварийно закрыться из-за нехватки оперативной памяти. Поэтому метод с Base64 подходит только для небольших файлов.

Оптимизированный подход без Base64

Чтобы избежать проблем с памятью, более профессиональный подход заключается в сохранении PDF как обычного файла во внутреннюю папку приложения и использовании PDF.js для его открытия. Если же вам требуется расширенная обработка, например, работа с PDF файлами для преобразования в PNG или масштабирования, это можно реализовать без внешних компонентов.

Пример формирования ссылки для ПоляHTML:


// ПутьКПапке - локальный путь, куда мы распаковали библиотеку и положили файл doc.pdf
СсылкаНаФайл = "file://" + ПутьКПапке + "/web/viewer.html?file=" + "file://" + ПутьКПапке + "/doc.pdf";
Элементы.ПолеHTML.Адрес = СсылкаНаФайл;

В этом случае PDF.js будет подгружать файл частями, что значительно снижает нагрузку на оперативную память.

Альтернатива: Google Docs Viewer

Если у пользователя есть стабильный доступ в интернет, можно воспользоваться сервисом от Google. Это позволяет не тянуть тяжелые библиотеки в приложение. Для этого файл должен быть доступен по публичной ссылке, на которую предварительно можно наложить водяные знаки на pdf файл для защиты информации.

Код для ПолеHTMLДокумента будет предельно прост:


СсылкаНаPDF = "https://example.com/files/my_document.pdf";
Элементы.ПолеHTML.Адрес = "https://docs.google.com/gview?embedded=true&url=" + СсылкаНаPDF;

Выводы и рекомендации

Подведем итог нашему исследованию проблемы:

  1. Объект ДокументPDF на мобильной платформе использовать нельзя.
  2. Если вам нужно просто дать пользователю прочитать файл — используйте ЗапуститьПриложение().
  3. Если нужно встроить просмотр в интерфейс — используйте связку ПолеHTML + PDF.js или предварительную конвертацию в изображения.
  4. Избегайте передачи больших файлов через Base64 в HTML-поле, чтобы не вызвать падение приложения.

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

← На главную