При работе пользователей через веб-клиент часто возникает задача быстрого просмотра прикрепленных файлов (договоров в DOC/DOCX, прайс-листов в XLS/XLSX, сканов в PDF) без необходимости их скачивания на локальный компьютер и открытия во внешних приложениях. В отличие от тонкого клиента под Windows, веб-клиент функционирует в среде интернет-браузера и имеет строгие ограничения безопасности: у него нет прямого доступа к файловой системе клиента, и он не может запускать локальные COM-приложения.
Разберем основные технические подходы к организации встроенного просмотра документов в управляемых формах 1С для веб-клиента, их преимущества, ограничения и примеры программной реализации.
Если задача ограничивается просмотром табличных документов формата XLSX, нам не требуются сторонние утилиты, серверные конвертеры или установленные офисные пакеты. Платформа 1С:Предприятие содержит штатный механизм прямого чтения файлов XLSX непосредственно в объект ТабличныйДокумент.
Разберем по шагам, как реализовать отображение таблицы на форме:
ПросмотрТаблицы с типом данных ТабличныйДокумент.ПолеТабличногоДокумента.Прочитать.Посмотрим на пример серверной процедуры:
&НаСервере
Процедура ЗагрузитьФайлExcelНаСервере(АдресФайлаВоВременномХранилище)
ИмяВременногоФайла = ПолучитьИмяВременногоФайла("xlsx");
ДвоичныеДанные = ПолучитьИзВременногоХранилища(АдресФайлаВоВременномХранилище);
ДвоичныеДанные.Записать(ИмяВременногоФайла);
ПросмотрТаблицы.Очистить();
ПросмотрТаблицы.Прочитать(ИмяВременногоФайла, СпособЧтенияЗначенийТабличногоДокумента.Текст);
УдалитьФайлы(ИмяВременногоФайла);
КонецПроцедуры
Этот метод работает одинаково надежно на серверах под управлением Windows и Linux, не создает утечек памяти и максимально быстро выводит данные в веб-клиент.
Попытка сохранения текстовых файлов Word в формат HTML (например, через COM-объекты) часто приводит к искажению разметки, «съезжанию» таблиц и потере связанных графических изображений. Общепринятым стандартом предварительного просмотра разнородных файлов является их промежуточная конвертация в единый формат PDF.
Современные браузеры содержат встроенный модуль чтения PDF. Поэтому для просмотра достаточно отдать двоичные данные браузеру с корректным HTTP-заголовком, а на форме 1С отобразить результат в элементе ПолеHTMLДокумента.
Проанализируем процесс реализации по шагам:
soffice --headless --convert-to pdf <ПутьКФайлу>. В отличие от интерактивных COM-объектов MS Word, фоновый процесс не блокирует сеансы ОС и корректно завершается по таймауту.HTTP-сервис, который по уникальному идентификатору файла возвращает двоичные данные сформированного PDF-документа.Content-Type: application/pdf и Content-Disposition: inline. Заголовок inline указывает веб-браузеру открыть документ внутри текущего фрейма, а не отправлять его на загрузку в папку скачиваний.Строка, связанный с элементом ПолеHTMLДокумента, передается URL-адрес созданного HTTP-сервиса либо простой HTML-код с тегом <iframe>.Посмотрим на пример обработки запроса внутри метода HTTP-сервиса 1С:
Функция ПолучитьФайлPDF(Запрос)
ИдентификаторФайла = Запрос.ПараметрыЗапроса.Получить("ID");
ДвоичныеДанныеPDF = ПолучитьДвоичныеДанныеФайла(ИдентификаторФайла);
Ответ = Новый HTTPСервисОтвет(200);
Ответ.Заголовки.Вставить("Content-Type", "application/pdf");
Ответ.Заголовки.Вставить("Content-Disposition", "inline; filename=""document.pdf""");
Ответ.УстановитьТело(ДвоичныеДанныеPDF);
Возврат Ответ;
КонецФункции
Если заказчику требуется полноценный предпросмотр и редактирование сложных офисных форматов (с сохранением рецензирования, сложных колонтитулов и макросов), конвертации в PDF может быть недостаточно. В этом случае применяется интеграция с внешними серверами документов (например, OnlyOffice Document Server или Collabora Online).
Рассмотрим подробнее архитектуру такого решения:
WOPI (Web Application Open Platform Interface). Сервис отдает содержимое файла внешнему серверу документов и принимает обновленную версию после редактирования.ПолеHTMLДокумента, в которое загружается веб-редактор с сервера документов.Выясним причину возможных проблем при реализации просмотра файлов в веб-клиенте:
COMОбъект("Word.Application") или COMОбъект("Excel.Application") на стороне сервера крайне не рекомендуется. Во-первых, это решение работает только на серверах под Windows. Во-вторых, серверные процессы MS Office не предназначены для многопоточной работы: под нагрузкой они зависают в памяти, вызывают утечки ресурсов и блокируют рабочие процессы кластера 1С.ПолеHTMLДокумента в веб-клиенте браузер может заблокировать отображение из-за политики одинакового источника (Same-Origin Policy). Сервер 1С и веб-сервис просмотра должны работать по одинаковому протоколу (предпочтительно HTTPS), а в ответах веб-сервера должны быть настроены разрешающие заголовки X-Frame-Options и Content-Security-Policy.C:\Docs\file.docx. Любая обработка начинается с интерактивного помещения файла во временное хранилище через метод НачатьПомещениеФайлаНаСервер, и только после этого сервер 1С может читать или конвертировать полученные двоичные данные.Таким образом, для простых таблиц XLSX лучшим выбором является штатное ПолеТабличногоДокумента, а для универсального просмотра DOCX и PDF — серверное преобразование в PDF с отдачей через собственный HTTP-сервис в ПолеHTMLДокумента.