Как передать ТабличныйДокумент из 1С через веб-сервис для отображения или скачивания на внешнем сайте?

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

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

Общие принципы взаимодействия веб-сервиса 1С и внешнего сайта

Прежде чем углубляться в детали форматов, давайте вспомним, что для успешной работы веб-сервиса 1С его необходимо опубликовать на веб-сервере (например, IIS или Apache). Этот процесс включает регистрацию модуля расширения веб-сервера и настройку виртуального приложения. Для ускорения разработки в таких задачах часто применяют универсальные процедуры для быстрой организации HTTP-сервиса. Обеспечение безопасности соединения с использованием SSL-сертификатов (HTTPS) и дополнительной аутентификации является критически важным шагом.

При передаче данных через веб-сервисы мы всегда стремимся к оптимизации. Это включает минимизацию размера передаваемых данных и использование эффективных методов работы с ними. Если объем данных превышает несколько мегабайт, их рекомендуется разбивать на части. 1С:Предприятие также поддерживает оптимизированную отправку двоичных данных по MTOM-протоколу, что может быть полезно.

Решение 1: Передача ТабличногоДокумента в формате PDF

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

  1. Формирование и сохранение ТабличногоДокумента в PDF.

    На стороне 1С мы сначала формируем наш ТабличныйДокумент, а затем сохраняем его в формате PDF. Для этого используем метод Записать() объекта ТабличныйДокумент, указывая тип файла ТипФайлаТабличногоДокумента.PDF.

    
    ТабДок = Новый ТабличныйДокумент;
    // ... код по заполнению ТабДок ...
    
    ИмяВременногоФайлаPDF = КаталогВременныхФайлов() + "Отчет_" + УникальныйИдентификатор() + ".pdf";
    ТабДок.Записать(ИмяВременногоФайлаPDF, ТипФайлаТабличногоДокумента.PDF);
    

    Оптимизация без сохранения на диск: Для повышения производительности и безопасности мы можем избежать создания временных файлов на диске. Вместо этого, используем объект ПотокВПамяти (MemoryStream). Сначала записываем ТабличныйДокумент в поток, а затем преобразуем его в ДвоичныеДанные.

    
    ТабДок = Новый ТабличныйДокумент;
    // ... код по заполнению ТабДок ...
    
    Поток = Новый ПотокВПамяти;
    ТабДок.Записать(Поток, ТипФайлаТабличногоДокумента.PDF);
    ДвоичныеДанныеPDF = Поток.Прочитать();
    
  2. Преобразование PDF в строку Base64.

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

    
    // Если мы использовали временный файл:
    ДвоичныеДанныеPDF = Новый ДвоичныеДанные(ИмяВременногоФайлаPDF);
    
    // Или если использовали ПотокВПамяти, у нас уже есть ДвоичныеДанныеPDF
    СтрокаBase64PDF = База64Кодировать(ДвоичныеДанныеPDF);
    Возврат СтрокаBase64PDF; // Веб-сервис возвращает строку Base64
    
  3. Декодирование и отображение на стороне клиента.

    На стороне клиентского сайта (например, на JavaScript) мы получаем строку Base64, декодируем ее обратно в двоичные данные и отображаем PDF. Мы можем использовать префикс data:application/pdf;base64, для встраивания PDF напрямую в HTML-страницу или для создания ссылки на скачивание.

    Важный момент: Иногда могут возникать проблемы с чтением PDF после декодирования. В этом случае мы рекомендуем проверять корректность полученной Base64-строки онлайн-валидаторами.

Решение 2: Передача ТабличногоДокумента в формате HTML

Если цель — непосредственное отображение отчета на веб-странице, то передача в формате HTML может быть очень удобной. Мы можем сформировать HTML-код отчета прямо в 1С.

  1. Формирование и сохранение ТабличногоДокумента в HTML.

    Аналогично PDF, ТабличныйДокумент можно сохранить в HTML. Метод Записать() позволяет это сделать.

    
    ТабДок = Новый ТабличныйДокумент;
    // ... код по заполнению ТабДок ...
    
    ИмяВременногоФайлаHTML = КаталогВременныхФайлов() + "Отчет_" + УникальныйИдентификатор() + ".html";
    ТабДок.Записать(ИмяВременногоФайлаHTML, ТипФайлаТабличногоДокумента.HTML);
    

    Опять же, мы можем использовать ПотокВПамяти для работы без временных файлов, а затем прочитать данные из потока.

  2. Чтение HTML-содержимого и возврат его как строки.

    После сохранения (или формирования в потоке) мы читаем содержимое HTML-файла (или потока) в строку и возвращаем ее из веб-сервиса.

    
    ТекстовыйДокумент = Новый ТекстовыйДокумент;
    ТекстовыйДокумент.Прочитать(ИмяВременногоФайлаHTML, КодировкаТекста.UTF8); // Убедитесь в правильной кодировке
    СтрокаHTML = ТекстовыйДокумент.ПолучитьТекст();
    Возврат СтрокаHTML; // Веб-сервис возвращает HTML-строку
    
  3. Встраивание HTML на клиентской стороне.

    На клиентском сайте полученную HTML-строку можно напрямую вставить в элемент <div> или <iframe>.

    Важный момент: При встраивании HTML-отчета в существующую страницу сайта могут возникнуть конфликты стилей. Мы рекомендуем заранее продумать, как будут взаимодействовать стили отчета со стилями вашего сайта, возможно, потребуется перенос стилей в заголовок страницы или использование изолированного <iframe>.

Решение 3: Передача структурированных данных (JSON/XML) для рендеринга на стороне клиента

Этот подход предполагает разделение данных и представления. 1С передает "сырые" табличные данные в структурированном формате, а внешний сайт самостоятельно отрисовывает их.

  1. Преобразование ТабличногоДокумента в ТаблицуЗначений или массив структур.

    На стороне 1С мы извлекаем данные из ТабличногоДокумента и формируем из них ТаблицуЗначений или массив структур, который будет легко сериализовать в JSON или XML.

    
    ТабДок = Новый ТабличныйДокумент;
    // ... код по заполнению ТабДок ...
    
    ТаблицаДанных = Новый ТаблицаЗначений;
    ТаблицаДанных.Колонки.Добавить("Показатель");
    ТаблицаДанных.Колонки.Добавить("Значение");
    
    // Пример заполнения ТаблицыЗначений из ТабличногоДокумента
    Для Каждого ОбластьСтроки Из ТабДок.Области Цикл
        Если ОбластьСтроки.Тип = Тип("ОбластьТабличногоДокумента") Тогда
            НоваяСтрока = ТаблицаДанных.Добавить();
            НоваяСтрока.Показатель = ОбластьСтроки.Ячейки[0].Текст;
            НоваяСтрока.Значение = ОбластьСтроки.Ячейки[1].Текст;
        КонецЕсли;
    КонецЦикла;
    
  2. Сериализация данных в JSON или XML.

    Платформа 1С:Предприятие (начиная с версии 8.3.6) имеет встроенные средства для работы с JSON. Мы можем использовать ЗаписьJSON для сериализации ТаблицыЗначений или массива структур.

    
    ЗаписьJSON = Новый ЗаписьJSON;
    ЗаписьJSON.УстановитьСтроку();
    ЗаписатьJSON(ЗаписьJSON, ТаблицаДанных); // Или массив структур
    СтрокаJSON = ЗаписьJSON.Закрыть();
    Возврат СтрокаJSON; // Веб-сервис возвращает JSON-строку
    

    Для XML мы используем ЗаписьXML и ЗаписатьXML().

    Обратите внимание: Для передачи табличных данных также может быть весьма подходящим формат OData.

  3. Парсинг и рендеринг на стороне клиента.

    На клиентском сайте мы получаем JSON/XML-строку, парсим ее и используем JavaScript-библиотеки (например, React, Vue, Angular) или шаблонизаторы для динамического построения HTML-таблицы.

    Преимущества JSON: JSON является компактным текстовым форматом, широко используемым в веб-приложениях. Все современные браузеры имеют встроенные средства для работы с ним, что упрощает разработку.

Решение 4: Передача ТабличногоДокумента как ДвоичныеДанные через ХранилищеЗначений

Этот метод часто используется для передачи объектов между базами 1С, но может быть адаптирован и для веб-сервисов, если требуется передать сам объект ТабличныйДокумент или его двоичное представление.

  1. Преобразование ТабличногоДокумента в ХранилищеЗначений.

    Объект ХранилищеЗначений (ValueStorage) позволяет сериализовать любой объект 1С, включая ТабличныйДокумент.

    
    ТабДок = Новый ТабличныйДокумент;
    // ... код по заполнению ТабДок ...
    
    Хранилище = Новый ХранилищеЗначений(ТабДок, Новый СжатиеДанных(9)); // Сжимаем для уменьшения размера
    
  2. Преобразование ХранилищаЗначений в ДвоичныеДанные.

    Полученное ХранилищеЗначений само по себе является сериализуемым объектом, который можно преобразовать в ДвоичныеДанные для передачи.

    
    ДвоичныеДанныеХранилища = Хранилище.Получить(); // Получаем двоичные данные хранилища
    Возврат ДвоичныеДанныеХранилища; // Веб-сервис возвращает ДвоичныеДанные
    

    В этом случае веб-сервис должен быть настроен на передачу двоичных данных, возможно, с использованием MTOM, если это большой объем.

  3. Обратное преобразование на принимающей стороне.

    Если принимающая сторона — тоже 1С, то процесс обратный:

    
    ДвоичныеДанныеХранилища = ПолученныеДанныеОтВебСервиса;
    Хранилище = Новый ХранилищеЗначений(ДвоичныеДанныеХранилища);
    ТабДокПолученный = Хранилище.Получить();
    

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

Решение 5: Публикация файлов на веб-сервере с гиперссылками

Этот подход является непрямым: веб-сервис 1С не передает сам документ, а предоставляет клиенту ссылку на него. Это особенно удобно для больших файлов или когда требуется, чтобы пользователь мог легко скачать документ.

  1. Формирование ТабличногоДокумента и сохранение в файл.

    На стороне 1С мы формируем ТабличныйДокумент и сохраняем его в выбранном формате (PDF, XLSX, DOCX и т.д.) в специально выделенный каталог на веб-сервере. Мы должны предусмотреть уникальные имена файлов для каждой публикации, например, включая код клиента, дату, время и уникальный идентификатор.

    
    ТабДок = Отчеты.ДебиторскаяЗадолженность.Создать();
    // ... заполнение параметров отчета ...
    ТабДок.Сформировать(Истина);
    
    КодКонтрагента = "00001"; // Пример параметра
    ИмяФайлаНаСервере = "C:\inetpub\wwwroot\reports\" + КодКонтрагента + "_Задолженность_" + Формат(ТекущаяДата(), "ДФ=yyyyMMddhhmmss") + ".xlsx";
    ТабДок.Записать(ИмяФайлаНаСервере, ТипФайлаТабличногоДокумента.XLSX);
    
  2. Формирование URL-адреса и возврат его клиенту.

    После сохранения файла мы формируем его полный URL-адрес. Веб-сервис возвращает клиенту HTML-страничку с гиперссылками на эти файлы или просто список URL-адресов.

    
    // Предполагаем, что отчеты доступны по адресу https://вашсайт.ru/reports/
    URLФайла = "https://вашсайт.ru/reports/" + ИмяФайлаНаСервере.Имя + "." + ИмяФайлаНаСервере.Расширение;
    Возврат URLФайла; // Веб-сервис возвращает URL
    

Важные моменты:

Решение 6: Формирование SVG-файла

Использование SVG (Scalable Vector Graphics) для таблиц — это интересный и современный подход, обеспечивающий масштабируемость без потери качества. Это особенно актуально, если нам нужна векторная графика для отображения отчетов.

  1. Построение SVG-кода для таблицы.

    На стороне 1С мы можем вручную или с помощью специализированных функций сформировать SVG-код, который будет представлять нашу таблицу. Для ячеек используются элементы <rect>, а для текста внутри ячеек — <text>.

    Рассмотрим пример SVG-файла для простой таблицы:

    
    <svg width="400" height="200" xmlns="http://www.w3.org/2000/svg" style="font-family: Arial, sans-serif;">
      <!-- Заголовок таблицы -->
      <rect x="0" y="0" width="200" height="40" fill="#e0e0e0" stroke="#000"/>
      <text x="10" y="25" font-size="14" fill="#000">Показатель</text>
      <rect x="200" y="0" width="200" height="40" fill="#e0e0e0" stroke="#000"/>
      <text x="210" y="25" font-size="14" fill="#000">Значение</text>
    
      <!-- Строка 1 -->
      <rect x="0" y="40" width="200" height="40" fill="#f9f9f9" stroke="#000"/>
      <text x="10" y="65" font-size="14" fill="#000">Выручка</text>
      <rect x="200" y="40" width="200" height="40" fill="#f9f9f9" stroke="#000"/>
      <text x="210" y="65" font-size="14" fill="#000">1000</text>
    
      <!-- Горизонтальные линии -->
      <line x1="0" y1="40" x2="400" y2="40" stroke="#000"/>
      <line x1="0" y1="80" x2="400" y2="80" stroke="#000"/>
    
      <!-- Вертикальная линия -->
      <line x1="200" y1="0" x2="200" y2="80" stroke="#000"/>
    </svg>
    
  2. Возврат SVG-кода как строки.

    Веб-сервис возвращает полученную SVG-строку.

    
    СтрокаSVG = "..." // Сформированный SVG-код
    Возврат СтрокаSVG;
    
  3. Использование SVG на клиентской стороне.

    На клиентском сайте SVG-файл можно использовать несколькими способами:

    • Сохранить как .svg-файл и открыть в браузере.
    • Вставить в HTML как изображение: <img src="data:image/svg+xml;base64,..." /> или <img src="table.svg">, если файл опубликован.
    • Вставить SVG-код напрямую в <div> элемент HTML-страницы.

Общие рекомендации и инструменты

Мы надеемся, что этот подробный разбор поможет вам успешно решить задачу передачи ТабличногоДокумента из 1С через веб-сервис. Удачи в реализации!

← На главную