Как сохранить табличный документ 1С в формате XHTML: проверенные способы и примеры кода

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

В практике разработчика 1С периодически возникают задачи, требующие интеграции со сторонними веб-сервисами или системами документооборота, которые предъявляют строгие требования к формату данных. Одним из таких форматов является XHTML — расширяемый язык разметки гипертекста, который представляет собой HTML, оформленный по правилам XML. В отличие от обычного HTML, XHTML требует строгого соблюдения синтаксиса: закрытия всех тегов, использования нижнего регистра для имен элементов и обязательного наличия пространств имен.

Стандартные средства платформы «1С:Предприятие» позволяют сохранять ТабличныйДокумент в форматах HTML, XLS, PDF, XMLSpreadsheet и других, однако прямой экспорт в XHTML в системе отсутствует. В этой статье мы подробно разберем, как решить эту задачу, используя внешние библиотеки и внутренние механизмы платформы.

Способ 1. Использование библиотеки Tidy через COM-объект

Наиболее обсуждаемым и эффективным способом, упомянутым в сообществе, является использование утилиты HTML Tidy. Это библиотека, предназначенная для исправления ошибок в HTML и конвертации его в валидный XHTML. Для работы в 1С удобнее всего использовать COM-обертку TidyCOM.

Рассмотрим пошаговый алгоритм реализации этого метода:

  1. Сначала сохраним наш табличный документ во временный файл формата HTML.
  2. Создадим COM-объект TidyCOM.TidyObject.
  3. Настроим параметры конвертации, указав, что на выходе нам нужен именно XHTML.
  4. Выполним преобразование и сохраним результат.

Проанализируем пример кода, который позволяет выполнить эту операцию:


// 1. Сохраняем табличный документ в обычный HTML
ПутьКФайлуHTML = "C:\temp\report.html";
ПутьКФайлуXHTML = "C:\temp\report.xhtml";
ТабДок.Записать(ПутьКФайлуHTML, ТипФайлаТабличногоДокумента.HTML);

// 2. Инициализируем COM-объект
Попытка
    TidyObj = Новый COMОбъект("TidyCOM.TidyObject");
Исключение
    Сообщить("Библиотека TidyCOM не зарегистрирована в системе!");
    Возврат;
КонецПопытки;

// 3. Настраиваем параметры
TidyObj.Options.Doctype = "strict";     // Строгий тип документа
TidyObj.Options.DropFontTags = Истина;  // Убираем устаревшие теги font
TidyObj.Options.OutputXhtml = Истина;   // Ключевой параметр для получения XHTML
TidyObj.Options.Indent = "AutoIndent";  // Автоматические отступы для читаемости
TidyObj.Options.TabSize = 4;
TidyObj.Options.CharEncoding = 4;       // Установка кодировки UTF-8 (важно для кириллицы!)

// 4. Выполняем конвертацию из файла в файл
TidyObj.TidyToFile(ПутьКФайлуHTML, ПутьКФайлуXHTML);

// Проверяем наличие ошибок
Если TidyObj.TotalErrors > 0 Тогда
    Сообщить("При конвертации возникли ошибки: " + TidyObj.lError);
КонецЕсли;

Важное замечание: Библиотека TidyCOM.dll является 32-битным компонентом. Если ваш сервер 1С работает в 64-битном режиме, создание объекта непосредственно на сервере может вызвать ошибку. В таком случае выполнение кода следует выносить на клиентскую сторону или использовать механизмы COM+ для запуска 32-битных компонентов в 64-битной среде.

Решение проблемы с кодировкой (кириллицей)

Часто программисты сталкиваются с тем, что после конвертации вместо русского текста отображаются непонятные символы («кракозябры»). Это происходит из-за несовпадения кодировок при чтении исходного HTML. Выясним причину: 1С по умолчанию сохраняет HTML в кодировке UTF-8, и для корректной работы Tidy необходимо явно указать TidyObj.Options.CharEncoding = 4. Это соответствует значению UTF-8 в настройках объекта и позволяет сохранить читаемость кириллических символов.

Способ 2. Применение XSLT-преобразования (встроенный метод 1С)

Если вы хотите избежать использования внешних COM-объектов, которые требуют регистрации в операционной системе, можно воспользоваться механизмом XSLT (Extensible Stylesheet Language Transformations). Поскольку XHTML — это XML, мы можем написать правило, которое перестроит структуру HTML от 1С под стандарты XHTML.

Разберем, как это работает. Мы используем объект ПреобразованиеXSL, который встроен в платформу 1С 8.3.

  1. Сохраняем ТабличныйДокумент в HTML.
  2. Загружаем полученный текст в объект ЧтениеXML.
  3. Применяем XSL-шаблон, который добавит необходимые атрибуты xmlns и закроет все теги (например, <br />, <img />).

Пример шаблона XSLT для базовой очистки:


<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" encoding="UTF-8" indent="yes" 
        doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN"
        doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"/>
    
    <!-- Копируем всё содержимое тегов -->
    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>
    
    <!-- Добавляем пространство имен к корневому элементу html -->
    <xsl:template match="html">
        <html xmlns="http://www.w3.org/1999/xhtml">
            <xsl:apply-templates select="@*|node()"/>
        </html>
    </xsl:template>
</xsl:stylesheet>

Этот метод считается более надежным для кроссплатформенных решений (например, при работе сервера 1С под управлением Linux), так как он не зависит от Windows-компонентов.

Особенности структуры XHTML в контексте 1С

При работе с табличными документами 1С генерирует достаточно сложную верстку с большим количеством вложенных стилей <style> внутри секции <head>. Для того чтобы документ был валидным XHTML, обратите внимание на следующие моменты:

Альтернатива: Использование XMLSpreadsheet

Если ваша задача состоит в том, чтобы просто передать данные таблицы в формате XML, который понимает Excel и другие системы, рассмотрите вариант использования ТипФайлаТабличногоДокумента.XMLSpreadsheet. Этот формат изначально является валидным XML и не требует никаких дополнительных манипуляций с Tidy или XSLT. Однако, если техническое задание жестко требует именно расширение .xhtml для отображения в браузере, используйте Способ 1 с настройкой кодировки UTF-8, как наиболее быстрый в реализации.

Подводя итог, можно сказать, что хотя 1С не имеет «волшебной кнопки» для сохранения в XHTML, сочетание стандартного экспорта в HTML и последующей обработки внешними инструментами или XSL-преобразованием позволяет добиться идеального результата, отвечающего всем современным веб-стандартам.

← На главную