Как выполнить XSLT-преобразование XML-файла в 1С 7.7?

Программист 1С v7.7 IT и автоматизация бизнеса
← На главную

Часто при интеграции со сторонними системами возникает задача: есть исходный файл XML и шаблон XSLT, необходимо подать их на вход и получить на выходе трансформированный файл. Рассмотрим подробнее, как реализовать этот механизм в устаревшей, но все еще используемой платформе 1С 7.7.

Ограничения платформы 1С 7.7

Проанализируем ситуацию с базовыми возможностями платформы. В отличие от версий 8.х, где функционал присутствует "из коробки", платформа 1С 7.7 не содержит нативных встроенных инструментов для XSLT-преобразований.

Стандартная внешняя компонента для работы с XML — v7plus.dll — является лишь устаревшей оберткой над системным парсером. Мы не рекомендуем использовать ее для сложных задач трансформации, так как она:

  1. Не позволяет явно указывать версию используемого парсера.
  2. Часто конфликтует с пространствами имен (namespaces).
  3. Имеет известные проблемы при обработке секций CDATA и комментариев.

Посмотрим на проверенные и надежные способы решения этой задачи.

Способ 1: Использование встроенных средств Windows (MSXML через COM/OLE)

Наиболее надежным способом сделать XSLT-преобразование непосредственно из кода 1С 7.7 является прямое обращение к библиотеке MSXML через механизм COM-объектов. Для этого мы будем использовать объект MSXML2.DOMDocument. Рекомендуется указывать точную версию, например MSXML2.DOMDocument.6.0 или MSXML2.DOMDocument.3.0.

Разберем по шагам логику работы этого метода:

  1. Создаем два независимых COM-объекта MSXML2.DOMDocument.
  2. В первый объект с помощью метода load() загружаем исходный XML-файл.
  3. Во второй объект аналогичным методом load() загружаем наш XSLT-шаблон.
  4. Выполняем преобразование. Для этого у первого объекта (с исходным XML) вызываем метод transformNode(), передавая в качестве параметра второй объект (шаблон).

Пример реализации в коде 1С 7.7:


XMLДок = СоздатьОбъект("MSXML2.DOMDocument.6.0");
XSLTДок = СоздатьОбъект("MSXML2.DOMDocument.6.0");

// Загружаем файлы
XMLДок.load(ПутьКФайлуXML);
XSLTДок.load(ПутьКФайлуXSLT);

// Выполняем трансформацию с возвратом результата в виде строки
РезультатСтрока = XMLДок.transformNode(XSLTДок);

Важно: Метод transformNode() возвращает готовый результат в виде текстовой строки. Однако существует также метод transformNodeToObject(). Он позволяет выгрузить результат преобразования не в строку, а напрямую в новый COM-объект или файл. Это поможет вам избавиться от потенциальных проблем с кодировками при сохранении текста средствами самой 1С 7.7.

Способ 2: Использование внешних свободных XSLT-процессоров

Выясним причину, по которой первого способа может быть недостаточно. Библиотека MSXML поддерживает только стандарт XSLT 1.0. Если вам необходимо использовать более сложные и современные шаблоны (XSLT 2.0 или 3.0), следует применить консольные утилиты или классы .Net (как советовали на форуме, подключив соответствующую DLL).

Свободных XSLT-процессоров существует множество (например, легковесные утилиты msxsl.exe или xsltproc). Рассмотрим, как с ними взаимодействовать:

  1. Через создание объекта WScript.Shell из кода 1С 7.7 мы можем невидимо для пользователя запускать эти независимые обработчики.
  2. В командную строку в виде параметров просто передаются пути к исходному файлу XML, файлу XSLT и путь для сохранения результирующего файла.
  3. Этот подход полностью изолирует ресурсоемкий процесс трансформации от устаревшей платформы 1С.

Возможные проблемы и нюансы

Частая проблема при трансформациях — наличие пространств имен (namespaces) в исходном файле XML. Если в XSLT-файле явно не прописана работа с этими пространствами, системный парсер просто не сможет найти нужные узлы, и на выходе вы получите пустой файл.

В качестве решения этой проблемы мы рекомендуем программно очищать исходный XML-документ от пространств имен перед основным преобразованием. Это можно сделать с помощью простейшего промежуточного XSLT-правила, удаляющего неймспейсы, и только после этого применять ваш основной XSLT-шаблон.

← На главную