Когда возникает задача передачи сложного отчета или табличных данных из системы 1С:Предприятие во внешнюю веб-систему, например, для отображения на сайте или предоставления пользователю для скачивания, мы сталкиваемся с несколькими вызовами. ТабличныйДокумент в 1С — это мощный инструмент для представления отчетов, но его прямая передача через веб-сервис требует правильного подхода. Давайте вместе разберем различные стратегии и выберем наиболее подходящее решение для вашей ситуации.
Прежде чем углубляться в детали форматов, давайте вспомним, что для успешной работы веб-сервиса 1С его необходимо опубликовать на веб-сервере (например, IIS или Apache). Этот процесс включает регистрацию модуля расширения веб-сервера и настройку виртуального приложения. Обеспечение безопасности соединения с использованием SSL-сертификатов (HTTPS) и дополнительной аутентификации является критически важным шагом.
При передаче данных через веб-сервисы мы всегда стремимся к оптимизации. Это включает минимизацию размера передаваемых данных и использование эффективных методов работы с ними. Если объем данных превышает несколько мегабайт, их рекомендуется разбивать на части. 1С:Предприятие также поддерживает оптимизированную отправку двоичных данных по MTOM-протоколу, что может быть полезно.
Формат PDF является общепринятой практикой для передачи отчетности, поскольку он гарантирует неизменность внешнего вида документа независимо от устройства и программного обеспечения пользователя. Рассмотрим подробнее, как мы можем реализовать этот подход.
Формирование и сохранение ТабличногоДокумента в 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-строку можно напрямую вставить в элемент Важный момент: При встраивании HTML-отчета в существующую страницу сайта могут возникнуть конфликты стилей. Мы рекомендуем заранее продумать, как будут взаимодействовать стили отчета со стилями вашего сайта, возможно, потребуется перенос стилей в заголовок страницы или использование изолированного Этот подход предполагает разделение данных и представления. 1С передает "сырые" табличные данные в структурированном формате, а внешний сайт самостоятельно отрисовывает их, используя свои библиотеки и шаблонизаторы. Этот метод особенно хорош, когда нам нужна гибкость в представлении данных на сайте. Преобразование ТабличногоДокумента в ТаблицуЗначений или массив структур. На стороне 1С мы извлекаем данные из Сериализация данных в JSON или XML. Платформа 1С:Предприятие (начиная с версии 8.3.6) имеет встроенные средства для работы с JSON. Мы можем использовать Для XML мы используем Обратите внимание: Для передачи табличных данных также может быть весьма подходящим формат OData, который предоставляет стандартизированный подход к RESTful API. Парсинг и рендеринг на стороне клиента. На клиентском сайте мы получаем JSON/XML-строку, парсим ее и используем JavaScript-библиотеки (например, React, Vue, Angular) или шаблонизаторы для динамического построения HTML-таблицы. Преимущества JSON: JSON является компактным текстовым форматом, широко используемым в веб-приложениях. Все современные браузеры имеют встроенные средства для работы с ним, что упрощает разработку. Этот метод часто используется для передачи объектов между базами 1С, но может быть адаптирован и для веб-сервисов, если требуется передать сам объект Преобразование ТабличногоДокумента в ХранилищеЗначений. Объект Преобразование ХранилищаЗначений в ДвоичныеДанные. Полученное В этом случае веб-сервис должен быть настроен на передачу двоичных данных, возможно, с использованием Обратное преобразование на принимающей стороне. Если принимающая сторона — тоже 1С, то процесс обратный: Если принимающая сторона — внешний сайт, то ей придется десериализовать этот специфичный формат 1С, что может быть сложной задачей без специальных библиотек. Этот подход является непрямым: веб-сервис 1С не передает сам документ, а предоставляет клиенту ссылку на него. Это особенно удобно для больших файлов или когда требуется, чтобы пользователь мог легко скачать документ. Формирование ТабличногоДокумента и сохранение в файл. На стороне 1С мы формируем Формирование URL-адреса и возврат его клиенту. После сохранения файла мы формируем его полный Важные моменты: Безопасность: Мы должны обеспечить безопасность доступа к каталогу с опубликованными файлами. Это включает использование Протокол: Используем только Пример кода из форума: В этом примере функция Использование SVG (Scalable Vector Graphics) для таблиц — это интересный и современный подход, обеспечивающий масштабируемость без потери качества. Это особенно актуально, если нам нужна векторная графика для отображения отчетов. Построение SVG-кода для таблицы. На стороне 1С мы можем вручную или с помощью специализированных функций сформировать SVG-код, который будет представлять нашу таблицу. Для ячеек используются элементы Рассмотрим пример SVG-файла для простой таблицы: Возврат SVG-кода как строки. Веб-сервис возвращает полученную SVG-строку. Использование SVG на клиентской стороне. На клиентском сайте SVG-файл можно использовать несколькими способами: Отладка: Для тестирования и отладки веб-сервисов 1С мы рекомендуем использовать такие инструменты, как Postman, SoapUI или Advanced REST Client. В 1С также существуют встроенные средства для отладки как потребителя, так и поставщика веб-сервисов. Работа с ТабличнымДокументом в веб-клиенте: Если ваш веб-сервис взаимодействует с веб-клиентом 1С, помните, что для достижения приемлемой скорости следует избегать частых обращений к серверу. Обновление состояния формы должно выполняться на клиенте, а серверные вызовы должны быть оптимизированы. Присваивать сформированный на сервере Выбор формата: Выбор формата (PDF, HTML, JSON, SVG, XLSX и т.д.) должен зависеть от конкретных требований вашего проекта. Если нужна неизменяемость и печатный вид — PDF. Если интерактивность и гибкость на сайте — JSON/XML с клиентским рендерингом или HTML. Если векторная графика — SVG. Для скачивания — публикация файлов. Мы надеемся, что этот подробный разбор поможет вам успешно решить задачу передачи .
.Решение 3: Передача структурированных данных (JSON/XML) для рендеринга на стороне клиента
ТабличногоДокумента и формируем из них ТаблицуЗначений или массив структур, который будет легко сериализовать в JSON или XML.
ТабДок = Новый ТабличныйДокумент;
// ... код по заполнению ТабДок ...
ТаблицаДанных = Новый ТаблицаЗначений;
ТаблицаДанных.Колонки.Добавить("Показатель");
ТаблицаДанных.Колонки.Добавить("Значение");
// Пример заполнения ТаблицыЗначений из ТабличногоДокумента
Для Каждого ОбластьСтроки Из ТабДок.Области Цикл
Если ОбластьСтроки.Тип = Тип("ОбластьТабличногоДокумента") Тогда
НоваяСтрока = ТаблицаДанных.Добавить();
НоваяСтрока.Показатель = ОбластьСтроки.Ячейки[0].Текст;
НоваяСтрока.Значение = ОбластьСтроки.Ячейки[1].Текст;
КонецЕсли;
КонецЦикла;
ЗаписьJSON для сериализации ТаблицыЗначений или массива структур.
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, ТаблицаДанных); // Или массив структур
СтрокаJSON = ЗаписьJSON.Закрыть();
Возврат СтрокаJSON; // Веб-сервис возвращает JSON-строку
ЗаписьXML и ЗаписатьXML().Решение 4: Передача ТабличногоДокумента как ДвоичныеДанные через ХранилищеЗначений
ТабличныйДокумент или его двоичное представление.
ХранилищеЗначений (ValueStorage) позволяет сериализовать любой объект 1С, включая ТабличныйДокумент.
ТабДок = Новый ТабличныйДокумент;
// ... код по заполнению ТабДок ...
Хранилище = Новый ХранилищеЗначений(ТабДок, Новый СжатиеДанных(9)); // Сжимаем для уменьшения размера
ХранилищеЗначений само по себе является сериализуемым объектом, который можно преобразовать в ДвоичныеДанные для передачи.
ДвоичныеДанныеХранилища = Хранилище.Получить(); // Получаем двоичные данные хранилища
Возврат ДвоичныеДанныеХранилища; // Веб-сервис возвращает ДвоичныеДанные
MTOM, если это большой объем.
ДвоичныеДанныеХранилища = ПолученныеДанныеОтВебСервиса;
Хранилище = Новый ХранилищеЗначений(ДвоичныеДанныеХранилища);
ТабДокПолученный = Хранилище.Получить();
Решение 5: Публикация файлов на веб-сервере с гиперссылками
ТабличныйДокумент и сохраняем его в выбранном формате (PDF, XLSX, DOCX и т.д.) в специально выделенный каталог на веб-сервере. Мы должны предусмотреть уникальные имена файлов для каждой публикации, например, включая код клиента, дату, время и уникальный идентификатор.
ТабДок = Отчеты.ДебиторскаяЗадолженность.Создать();
// ... заполнение параметров отчета ...
ТабДок.Сформировать(Истина);
КодКонтрагента = "00001"; // Пример параметра
ИмяФайлаНаСервере = "C:\inetpub\wwwroot\reports\" + КодКонтрагента + "_Задолженность_" + Формат(ТекущаяДата(), "ДФ=yyyyMMddhhmmss") + ".xlsx";
ТабДок.Записать(ИмяФайлаНаСервере, ТипФайлаТабличногоДокумента.XLSX);
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 вместо двоичных данных, если файл уже опубликован.Решение 6: Формирование SVG-файла
, а для текста внутри ячеек — .
СтрокаSVG = "..." // Сформированный SVG-код
Возврат СтрокаSVG;
.svg-файл и открыть в браузере. или , если файл опубликован.Общие рекомендации и инструменты
ТабличныйДокумент реквизиту формы лучше также на сервере.ТабличногоДокумента из 1С через веб-сервис. Удачи в реализации!