В практике разработчика 1С периодически возникают задачи, требующие интеграции со сторонними веб-сервисами или системами документооборота, которые предъявляют строгие требования к формату данных. Одним из таких форматов является XHTML — расширяемый язык разметки гипертекста, который представляет собой HTML, оформленный по правилам XML. В отличие от обычного HTML, XHTML требует строгого соблюдения синтаксиса: закрытия всех тегов, использования нижнего регистра для имен элементов и обязательного наличия пространств имен.
Стандартные средства платформы «1С:Предприятие» позволяют сохранять ТабличныйДокумент в форматах HTML, XLS, PDF, XMLSpreadsheet и других, однако прямой экспорт в XHTML в системе отсутствует. В этой статье мы подробно разберем, как решить эту задачу, используя внешние библиотеки и внутренние механизмы платформы.
Наиболее обсуждаемым и эффективным способом, упомянутым в сообществе, является использование утилиты HTML Tidy. Это библиотека, предназначенная для исправления ошибок в HTML и конвертации его в валидный XHTML. Для работы в 1С удобнее всего использовать COM-обертку TidyCOM.
Рассмотрим пошаговый алгоритм реализации этого метода:
TidyCOM.TidyObject.Проанализируем пример кода, который позволяет выполнить эту операцию:
// 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 в настройках объекта и позволяет сохранить читаемость кириллических символов.
Если вы хотите избежать использования внешних COM-объектов, которые требуют регистрации в операционной системе, можно воспользоваться механизмом XSLT (Extensible Stylesheet Language Transformations). Поскольку XHTML — это XML, мы можем написать правило, которое перестроит структуру HTML от 1С под стандарты XHTML.
Разберем, как это работает. Мы используем объект ПреобразованиеXSL, который встроен в платформу 1С 8.3.
ТабличныйДокумент в HTML.ЧтениеXML.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-компонентов.
При работе с табличными документами 1С генерирует достаточно сложную верстку с большим количеством вложенных стилей <style> внутри секции <head>. Для того чтобы документ был валидным XHTML, обратите внимание на следующие моменты:
<br> должны превратиться в <br />.<TD> — невалидно, нужно <td>).<, > или &, они должны быть обернуты в блоки /* <![CDATA[ */ ... /* ]]> */, чтобы XML-парсер не воспринял их как начало новых тегов.Если ваша задача состоит в том, чтобы просто передать данные таблицы в формате XML, который понимает Excel и другие системы, рассмотрите вариант использования ТипФайлаТабличногоДокумента.XMLSpreadsheet. Этот формат изначально является валидным XML и не требует никаких дополнительных манипуляций с Tidy или XSLT. Однако, если техническое задание жестко требует именно расширение .xhtml для отображения в браузере, используйте Способ 1 с настройкой кодировки UTF-8, как наиболее быстрый в реализации.
Подводя итог, можно сказать, что хотя 1С не имеет «волшебной кнопки» для сохранения в XHTML, сочетание стандартного экспорта в HTML и последующей обработки внешними инструментами или XSL-преобразованием позволяет добиться идеального результата, отвечающего всем современным веб-стандартам.