Когда возникает задача передачи сложного отчета или табличных данных из системы 1С:Предприятие во внешнюю веб-систему, например, для отображения на сайте или предоставления пользователю для скачивания, мы сталкиваемся с несколькими вызовами. ТабличныйДокумент в 1С — это мощный инструмент для представления отчетов, но его прямая передача через веб-сервис требует правильного подхода. Давайте вместе разберем различные стратегии и выберем наиболее подходящее решение для вашей ситуации.
Прежде чем углубляться в детали форматов, давайте вспомним, что для успешной работы веб-сервиса 1С его необходимо опубликовать на веб-сервере (например, IIS или Apache). Этот процесс включает регистрацию модуля расширения веб-сервера и настройку виртуального приложения. Для ускорения разработки в таких задачах часто применяют универсальные процедуры для быстрой организации HTTP-сервиса. Обеспечение безопасности соединения с использованием SSL-сертификатов (HTTPS) и дополнительной аутентификации является критически важным шагом.
При передаче данных через веб-сервисы мы всегда стремимся к оптимизации. Это включает минимизацию размера передаваемых данных и использование эффективных методов работы с ними. Если объем данных превышает несколько мегабайт, их рекомендуется разбивать на части. 1С:Предприятие также поддерживает оптимизированную отправку двоичных данных по MTOM-протоколу, что может быть полезно.
Формат PDF является общепринятой практикой для передачи отчетности, поскольку он гарантирует неизменность внешнего вида документа независимо от устройства и программного обеспечения пользователя. Рассмотрим подробнее, как мы можем реализовать этот подход. При работе с этим форматом на продвинутом уровне может потребоваться работа с PDF файлами в 1С без внешних компонентов, например, для масштабирования или конвертации страниц.
Формирование и сохранение ТабличногоДокумента в PDF.
На стороне 1С мы сначала формируем наш ТабличныйДокумент, а затем сохраняем его в формате PDF. Для этого используем метод Записать() объекта ТабличныйДокумент, указывая тип файла ТипФайлаТабличногоДокумента.PDF.
ТабДок = Новый ТабличныйДокумент;
// ... код по заполнению ТабДок ...
ИмяВременногоФайлаPDF = КаталогВременныхФайлов() + "Отчет_" + УникальныйИдентификатор() + ".pdf";
ТабДок.Записать(ИмяВременногоФайлаPDF, ТипФайлаТабличногоДокумента.PDF);
Оптимизация без сохранения на диск: Для повышения производительности и безопасности мы можем избежать создания временных файлов на диске. Вместо этого, используем объект ПотокВПамяти (MemoryStream). Сначала записываем ТабличныйДокумент в поток, а затем преобразуем его в ДвоичныеДанные.
ТабДок = Новый ТабличныйДокумент;
// ... код по заполнению ТабДок ...
Поток = Новый ПотокВПамяти;
ТабДок.Записать(Поток, ТипФайлаТабличногоДокумента.PDF);
ДвоичныеДанныеPDF = Поток.Прочитать();
Преобразование PDF в строку Base64.
Для передачи через веб-сервис двоичные данные PDF-файла необходимо преобразовать в текстовый формат, используя кодировку Base64. Это универсальный способ передачи бинарных данных через текстовые протоколы.
// Если мы использовали временный файл:
ДвоичныеДанныеPDF = Новый ДвоичныеДанные(ИмяВременногоФайлаPDF);
// Или если использовали ПотокВПамяти, у нас уже есть ДвоичныеДанныеPDF
СтрокаBase64PDF = База64Кодировать(ДвоичныеДанныеPDF);
Возврат СтрокаBase64PDF; // Веб-сервис возвращает строку Base64
Декодирование и отображение на стороне клиента.
На стороне клиентского сайта (например, на JavaScript) мы получаем строку Base64, декодируем ее обратно в двоичные данные и отображаем PDF. Мы можем использовать префикс data:application/pdf;base64, для встраивания PDF напрямую в HTML-страницу или для создания ссылки на скачивание.
Важный момент: Иногда могут возникать проблемы с чтением PDF после декодирования. В этом случае мы рекомендуем проверять корректность полученной Base64-строки онлайн-валидаторами.
Если цель — непосредственное отображение отчета на веб-странице, то передача в формате HTML может быть очень удобной. Мы можем сформировать HTML-код отчета прямо в 1С.
Формирование и сохранение ТабличногоДокумента в HTML.
Аналогично PDF, ТабличныйДокумент можно сохранить в HTML. Метод Записать() позволяет это сделать.
ТабДок = Новый ТабличныйДокумент;
// ... код по заполнению ТабДок ...
ИмяВременногоФайлаHTML = КаталогВременныхФайлов() + "Отчет_" + УникальныйИдентификатор() + ".html";
ТабДок.Записать(ИмяВременногоФайлаHTML, ТипФайлаТабличногоДокумента.HTML);
Опять же, мы можем использовать ПотокВПамяти для работы без временных файлов, а затем прочитать данные из потока.
Чтение HTML-содержимого и возврат его как строки.
После сохранения (или формирования в потоке) мы читаем содержимое HTML-файла (или потока) в строку и возвращаем ее из веб-сервиса.
ТекстовыйДокумент = Новый ТекстовыйДокумент;
ТекстовыйДокумент.Прочитать(ИмяВременногоФайлаHTML, КодировкаТекста.UTF8); // Убедитесь в правильной кодировке
СтрокаHTML = ТекстовыйДокумент.ПолучитьТекст();
Возврат СтрокаHTML; // Веб-сервис возвращает HTML-строку
Встраивание HTML на клиентской стороне.
На клиентском сайте полученную HTML-строку можно напрямую вставить в элемент <div> или <iframe>.
Важный момент: При встраивании HTML-отчета в существующую страницу сайта могут возникнуть конфликты стилей. Мы рекомендуем заранее продумать, как будут взаимодействовать стили отчета со стилями вашего сайта, возможно, потребуется перенос стилей в заголовок страницы или использование изолированного <iframe>.
Этот подход предполагает разделение данных и представления. 1С передает "сырые" табличные данные в структурированном формате, а внешний сайт самостоятельно отрисовывает их.
Преобразование ТабличногоДокумента в ТаблицуЗначений или массив структур.
На стороне 1С мы извлекаем данные из ТабличногоДокумента и формируем из них ТаблицуЗначений или массив структур, который будет легко сериализовать в JSON или XML.
ТабДок = Новый ТабличныйДокумент;
// ... код по заполнению ТабДок ...
ТаблицаДанных = Новый ТаблицаЗначений;
ТаблицаДанных.Колонки.Добавить("Показатель");
ТаблицаДанных.Колонки.Добавить("Значение");
// Пример заполнения ТаблицыЗначений из ТабличногоДокумента
Для Каждого ОбластьСтроки Из ТабДок.Области Цикл
Если ОбластьСтроки.Тип = Тип("ОбластьТабличногоДокумента") Тогда
НоваяСтрока = ТаблицаДанных.Добавить();
НоваяСтрока.Показатель = ОбластьСтроки.Ячейки[0].Текст;
НоваяСтрока.Значение = ОбластьСтроки.Ячейки[1].Текст;
КонецЕсли;
КонецЦикла;
Сериализация данных в JSON или XML.
Платформа 1С:Предприятие (начиная с версии 8.3.6) имеет встроенные средства для работы с JSON. Мы можем использовать ЗаписьJSON для сериализации ТаблицыЗначений или массива структур.
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, ТаблицаДанных); // Или массив структур
СтрокаJSON = ЗаписьJSON.Закрыть();
Возврат СтрокаJSON; // Веб-сервис возвращает JSON-строку
Для XML мы используем ЗаписьXML и ЗаписатьXML().
Обратите внимание: Для передачи табличных данных также может быть весьма подходящим формат OData.
Парсинг и рендеринг на стороне клиента.
На клиентском сайте мы получаем JSON/XML-строку, парсим ее и используем JavaScript-библиотеки (например, React, Vue, Angular) или шаблонизаторы для динамического построения HTML-таблицы.
Преимущества JSON: JSON является компактным текстовым форматом, широко используемым в веб-приложениях. Все современные браузеры имеют встроенные средства для работы с ним, что упрощает разработку.
Этот метод часто используется для передачи объектов между базами 1С, но может быть адаптирован и для веб-сервисов, если требуется передать сам объект ТабличныйДокумент или его двоичное представление.
Преобразование ТабличногоДокумента в ХранилищеЗначений.
Объект ХранилищеЗначений (ValueStorage) позволяет сериализовать любой объект 1С, включая ТабличныйДокумент.
ТабДок = Новый ТабличныйДокумент;
// ... код по заполнению ТабДок ...
Хранилище = Новый ХранилищеЗначений(ТабДок, Новый СжатиеДанных(9)); // Сжимаем для уменьшения размера
Преобразование ХранилищаЗначений в ДвоичныеДанные.
Полученное ХранилищеЗначений само по себе является сериализуемым объектом, который можно преобразовать в ДвоичныеДанные для передачи.
ДвоичныеДанныеХранилища = Хранилище.Получить(); // Получаем двоичные данные хранилища
Возврат ДвоичныеДанныеХранилища; // Веб-сервис возвращает ДвоичныеДанные
В этом случае веб-сервис должен быть настроен на передачу двоичных данных, возможно, с использованием MTOM, если это большой объем.
Обратное преобразование на принимающей стороне.
Если принимающая сторона — тоже 1С, то процесс обратный:
ДвоичныеДанныеХранилища = ПолученныеДанныеОтВебСервиса;
Хранилище = Новый ХранилищеЗначений(ДвоичныеДанныеХранилища);
ТабДокПолученный = Хранилище.Получить();
Если принимающая сторона — внешний сайт, то ей придется десериализовать этот специфичный формат 1С, что может быть сложной задачей без специальных библиотек.
Этот подход является непрямым: веб-сервис 1С не передает сам документ, а предоставляет клиенту ссылку на него. Это особенно удобно для больших файлов или когда требуется, чтобы пользователь мог легко скачать документ.
Формирование ТабличногоДокумента и сохранение в файл.
На стороне 1С мы формируем ТабличныйДокумент и сохраняем его в выбранном формате (PDF, XLSX, DOCX и т.д.) в специально выделенный каталог на веб-сервере. Мы должны предусмотреть уникальные имена файлов для каждой публикации, например, включая код клиента, дату, время и уникальный идентификатор.
ТабДок = Отчеты.ДебиторскаяЗадолженность.Создать();
// ... заполнение параметров отчета ...
ТабДок.Сформировать(Истина);
КодКонтрагента = "00001"; // Пример параметра
ИмяФайлаНаСервере = "C:\inetpub\wwwroot\reports\" + КодКонтрагента + "_Задолженность_" + Формат(ТекущаяДата(), "ДФ=yyyyMMddhhmmss") + ".xlsx";
ТабДок.Записать(ИмяФайлаНаСервере, ТипФайлаТабличногоДокумента.XLSX);
Формирование URL-адреса и возврат его клиенту.
После сохранения файла мы формируем его полный URL-адрес. Веб-сервис возвращает клиенту HTML-страничку с гиперссылками на эти файлы или просто список URL-адресов.
// Предполагаем, что отчеты доступны по адресу https://вашсайт.ru/reports/
URLФайла = "https://вашсайт.ru/reports/" + ИмяФайлаНаСервере.Имя + "." + ИмяФайлаНаСервере.Расширение;
Возврат URLФайла; // Веб-сервис возвращает URL
Важные моменты:
Безопасность: Мы должны обеспечить безопасность доступа к каталогу с опубликованными файлами. Это включает использование HTTPS и, при необходимости, аутентификации на веб-сервере. Для каталога хранения файлов необходимо предоставить соответствующие права доступа, чтобы 1С могла записывать в него.
Протокол: Используем только HTTP(S) для доступа к файлам, никаких FTP!
Пример кода из форума:
Функция WSПолучитьДебиторскуюЗадолженность(Parameters)
ОсновнойДоговорКонтрагента = Справочники.Контрагенты.НайтиПоКоду(Parameters).ОсновнойДоговорКонтрагента;
Если ОсновнойДоговорКонтрагента.Пустая() Тогда
Возврат Неопределено;
КонецЕсли;
Отчет = Отчеты.ДебиторскаяЗадолженность.Создать();
Отчет.ДоговорКонтрагента = ОсновнойДоговорКонтрагента;
Отчет.МоментРасчета = ТекущаяДата();
ДебиторскаяЗадолженность = Отчет.Сформировать(Истина);
ИмяФайла = КаталогВременныхФайлов() + "ClientDebts" + Parameters + "_" + Формат(ТекущаяДата(), "ДФ=yyyyMMddhhmmss") ;
ДебиторскаяЗадолженность.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.XLSX);
Возврат ИмяФайла;
КонецФункции
Функция GetClientDebts(Parameters)
КодКонтрагента = Parameters;
Ответ = WSПолучитьДебиторскуюЗадолженность(КодКонтрагента);
файл = Новый Файл(Ответ);
Если файл.Существует() Тогда
Хранилище = Новый ДвоичныеДанные(файл.ПолноеИмя);
КонецЕсли;
Возврат Хранилище;
КонецФункции
В этом примере функция WSПолучитьДебиторскуюЗадолженность возвращает имя файла, а GetClientDebts читает этот файл и возвращает его как ДвоичныеДанные. Этот подход можно модифицировать для возврата URL вместо двоичных данных, если файл уже опубликован.
Использование SVG (Scalable Vector Graphics) для таблиц — это интересный и современный подход, обеспечивающий масштабируемость без потери качества. Это особенно актуально, если нам нужна векторная графика для отображения отчетов.
Построение 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>
Возврат SVG-кода как строки.
Веб-сервис возвращает полученную SVG-строку.
СтрокаSVG = "..." // Сформированный SVG-код
Возврат СтрокаSVG;
Использование SVG на клиентской стороне.
На клиентском сайте SVG-файл можно использовать несколькими способами:
.svg-файл и открыть в браузере.<img src="data:image/svg+xml;base64,..." /> или <img src="table.svg">, если файл опубликован.<div> элемент HTML-страницы.Отладка: Для тестирования и отладки веб-сервисов 1С мы рекомендуем использовать такие инструменты, как Postman, SoapUI или Advanced REST Client. Для профессионального описания и документирования вашего API незаменимым будет инструмент Swagger в 1С: от настройки до публикации.
Работа с ТабличнымДокументом в веб-клиенте: Если ваш веб-сервис взаимодействует с веб-клиентом 1С, помните, что для достижения приемлемой скорости следует избегать частых обращений к серверу. Обновление состояния формы должно выполняться на клиенте, а серверные вызовы должны быть оптимизированы. Присваивать сформированный на сервере ТабличныйДокумент реквизиту формы лучше также на сервере.
Выбор формата: Выбор формата (PDF, HTML, JSON, SVG, XLSX и т.д.) должен зависеть от конкретных требований вашего проекта. Если нужна неизменяемость и печатный вид — PDF. Если интерактивность и гибкость на сайте — JSON/XML с клиентским рендерингом или HTML. Если векторная графика — SVG. Для скачивания — публикация файлов.
Мы надеемся, что этот подробный разбор поможет вам успешно решить задачу передачи ТабличногоДокумента из 1С через веб-сервис. Удачи в реализации!