Разработка мобильных приложений на платформе 1С часто сопряжена с необходимостью работы с печатными формами и документами. Одним из самых популярных форматов обмена документами является PDF. Однако, при попытке перенести код, работающий на десктопе, в мобильное приложение, разработчики часто сталкиваются с ошибкой.
Рассмотрим ситуацию, когда при попытке инициализации объекта возникает сообщение: Тип не определен (ДокументPDF). Разберем причины этого поведения, проанализируем архитектурные ограничения мобильной платформы и подробно изучим способы реализации просмотра PDF-файлов на смартфонах и планшетах.
Давайте обратимся к синтаксис-помощнику и документации 1С. Объект ДокументPDF предназначен для программного создания, чтения, объединения и анализа структуры PDF-файлов. Этот функционал требует серьезных вычислительных ресурсов и использования тяжелых библиотек, которые встроены в платформу для ПК и серверов. При этом, если вам требуется кроссплатформенная работа с файлами, можно использовать алхимический способ работы с двоичными данными — универсальную библиотеку, которая корректно функционирует в том числе и в мобильных приложениях.
Если мы посмотрим на доступность объекта ДокументPDF, то увидим следующий список: Тонкий клиент, веб-клиент, сервер, толстый клиент. Мобильной платформы (и мобильного клиента с автономным режимом) в этом списке нет.
Именно поэтому код вида:
Попытка
PDF = Новый ДокументPDF();
Исключение
Сообщить("Ошибка создания объекта: " + ОписаниеОшибки());
КонецПопытки;
Гарантированно приведет к ошибке выполнения на мобильном устройстве. Мобильная платформа — это облегченная версия среды исполнения, и многие "тяжелые" объекты в ней отсутствуют. Однако задача просмотра документов остается актуальной. Давайте разберем рабочие способы её решения.
Самый простой и надежный способ показать пользователю PDF — делегировать эту задачу операционной системе. На любом современном смартфоне (Android или iOS) обычно уже установлено приложение для просмотра PDF (например, Adobe Reader, Google PDF Viewer или встроенные средства системы). В некоторых случаях для расширения возможностей взаимодействия с ОС Android можно использовать внешнюю компоненту Android tools.
Для открытия файла через внешнее приложение нам необходимо выполнить последовательность действий:
ЗапуститьПриложение() для передачи файла операционной системе.Посмотрим на пример реализации:
// Предположим, ДвоичныеДанныеPDF получены заранее
ИмяВременногоФайла = ПолучитьИмяВременногоФайла("pdf");
ДвоичныеДанныеPDF.Записать(ИмяВременногоФайла);
// Открываем файл во внешней программе
ЗапуститьПриложение(ИмяВременногоФайла);
Важные нюансы данного метода:
На современных версиях Android (особенно начиная с Android 10 и 11) действует политика Scoped Storage. Это означает, что внешние приложения могут не иметь доступа к папке кэша вашего мобильного приложения 1С. В результате, просмотрщик может открыться, но выдать ошибку "Файл не найден" или "Нет доступа".
Чтобы обойти это, рекомендуется использовать системные папки (например, "Документы", если есть права) или специальные механизмы обмена (Intent Sharing), которые сложнее реализовать средствами встроенного языка 1С без использования нативных компонент.
Если мы хотим, чтобы пользователь оставался внутри нашего приложения 1С и интерфейс выглядел бесшовно, нам поможет элемент формы ПолеHTMLДокумента. Однако здесь есть существенное различие в поведении между iOS и Android.
Движок WebKit, используемый в iOS, обладает нативной поддержкой PDF. Это значит, что вы можете просто передать путь к файлу или Base64-строку в ПолеHTMLДокумента, и система сама отрисует документ.
Стандартный WebView на Android (обычно на базе Chromium) не умеет отображать PDF "из коробки". Если вы просто подсунете ему ссылку на локальный PDF-файл, он, скорее всего, предложит его скачать или покажет пустой экран. Альтернативой может стать программная конвертация отчетов 1С в графический формат, чтобы отображать страницы документа как картинки.
Для полноценного отображения PDF внутри HTML-поля на Android нам понадобится JavaScript-библиотека PDF.js. Рассмотрим алгоритм внедрения:
Основная сложность — как передать сам PDF-файл в ПолеHTMLДокумента. В обсуждении на форуме предлагался вариант использования 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 подходит только для небольших файлов.
Чтобы избежать проблем с памятью, более профессиональный подход заключается в сохранении PDF как обычного файла во внутреннюю папку приложения и использовании PDF.js для его открытия. Если же вам требуется расширенная обработка, например, работа с PDF файлами для преобразования в PNG или масштабирования, это можно реализовать без внешних компонентов.
Пример формирования ссылки для ПоляHTML:
// ПутьКПапке - локальный путь, куда мы распаковали библиотеку и положили файл doc.pdf
СсылкаНаФайл = "file://" + ПутьКПапке + "/web/viewer.html?file=" + "file://" + ПутьКПапке + "/doc.pdf";
Элементы.ПолеHTML.Адрес = СсылкаНаФайл;
В этом случае PDF.js будет подгружать файл частями, что значительно снижает нагрузку на оперативную память.
Если у пользователя есть стабильный доступ в интернет, можно воспользоваться сервисом от Google. Это позволяет не тянуть тяжелые библиотеки в приложение. Для этого файл должен быть доступен по публичной ссылке, на которую предварительно можно наложить водяные знаки на pdf файл для защиты информации.
Код для ПолеHTMLДокумента будет предельно прост:
СсылкаНаPDF = "https://example.com/files/my_document.pdf";
Элементы.ПолеHTML.Адрес = "https://docs.google.com/gview?embedded=true&url=" + СсылкаНаPDF;
Подведем итог нашему исследованию проблемы:
ДокументPDF на мобильной платформе использовать нельзя.ЗапуститьПриложение().Используя эти методы, вы сможете обеспечить комфортную работу пользователей с документацией даже в условиях ограничений мобильной платформы 1С.