Главная страница Visual 2000 · Общий список статей

XML-схемы на службе у электронной коммерции

Андрей Колесов

© Андрей Колесов, 2002
Авторский вариант. Статья была опубликована c незначительной литературной правкой в журнале BYTE/Росся (N 07/2001, с.60)


Практическая реализация идей электронного бизнеса...

Практическая реализация идей электронного бизнеса связана с необходимостью решения целого ряда чисто технологических вопросов. Среди них особо выделяется проблема интеграции разнородных информационных ресурсов, решение которой требует создания простого и надежного механизма обмена данными между различными приложениями, причем как внутри корпоративных систем, так и при взаимодействии различных организаций.

В начало статьи

Применение технологий XML требует организационной поддержки

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

Напомним, что XML и HTML базируется на одинаковых синтаксических принципах — информация записывается виде простого текста, в котором имеются управляющие команды (тэги) и собственно данные. XML отличается от HTML тем, что позволяет передавать не только данные, но также и информацию об их структуре. Отметим, что оба этих языка представляют собой упрощенный вариант давно известного среди компьютерных лингвистов языка SGML (Standard Generation Markup Language).

Сама по себе идея языка XML — текстового описания структуры и содержания некоторых данных — совсем не нова. Главным моментом здесь является то, что лидеры компьютерной индустрии вроде бы осознали необходимость перехода от внутренних, закрытых форматов к общим, открытым. Но, честно говоря, вопрос о том, насколько это серьезное намерение (а не маркетинговые акции, чтобы показать свою готовность к открытости) можно будет судить лишь спустя некоторое время. Тем не менее, XML сегодня — это мировой отраслевой стандарт, создание и развитие которого ведется под эгидой WWW Consortioum, общественной организацией, представляющей интересы входящих в нее участников рынка.

Появление общего стандарта описания данных избавляет разработчиков ПО придумывать собственные форматы, причем речь идет даже о решении сугубо внутренних задач. Разумеется, за любую универсальность приходится расплачиваться определенной избыточностью, но в данном случае она будет не столь велика и не будет сколь-нибудь заметна на современных компьютерах.

Вместе с тем, нужно отметить, что текстовое представление данных имеет свои недостатки. Одно из них - проблемы с использованием символов, задействованных в качестве специальных (например, "<" и ">"). Вторая проблема - неоднозначность преобразования данных из внутреннего двоичного формата в текст и наоборот. В последнем случае особенное внимание нужно уделять национальной специфике форматов, особенно при работе с разными региональными установками и кодовыми таблицами. Проблемы эти решаемы, но их нужно иметь в виду.

В начало статьи

Объектная модель документов, XML-анализаторы и XML-схемы

Одним из основных элементов технологии платформенно-независимого информационного взаимодействия различных приложений является использование объектной модели документов XML (Document Object Model, XML DOM), стандарт которой принят комитетом World Wide Web Consortium (W3C). Интерфейс XML DOM обеспечивает доступ к иерархической структуре, содержимому и стилям документа независимо от платформы и языка программирования.

Тут нужно отметить, что DOM _ это общее понятие некоторой совокупности моделей представления документа в виде "дерева" подчиненных фрагментов. То есть, например, можно говорить о DOM для Word-документов, DOM для HTML и пр. В данном случае мы ведем разговор об XML DOM.

Следует также разобраться в соотношении понятий "DOM-документ" и "XML-документ", которые с одной стороны, почти тождественны, с другой — качественно отличны. DOMдокумент, создаваемый приложением, является внутренним объектом последнего, и в общем случае о его физической реализации никому ничего не известно (также как мы работаем с документами Word, ничего не зная о формате его хранения). Содержимое DOM-документа становится доступным для всех остальных приложений путем сохранения его в формате XMLфайла. Таким образом, XML-документ является представлением DOM-документа на языке XML.

На примере Visual Basic логика работы с этими документами выглядит следующим образом:


Set xmlDoc = New DOMDocument  ' создание нового объекта 
' далее - работа по формированию документа 
... 
xmlDoc.Save "File.xml"    ' сохранение в виде XML-файла 

... 
xmlDoc.Load "NewFile.xml" ' чтение XML-файла
'далее выполняется работа с DOM-объектом

Для работы с XML-документами применяется специальное ПО под общим собирательным названием XML-анализаторы (XML parsers), которые предоставляют разработчикам приложений механизм создания DOM-документа в виде программного интерфейса взаимодействия с этим документом, а также преобразования его в XML-формат и обратно. При этом функции анализаторов выходят далеко за рамки грамматического разбора документа (parse — выполнять грамматический разбор), обеспечивая широкий спектр операций по манипуляции со структурой и содержимым DOM-документов.

При создании приложений в среде Windows разработчики вполне естественно ориентируются на средства Microsoft, в данном случае на использование объектной библиотеки MS XML Parser (MSXML), третья (последняя на сегодня) версия которой была выпущена в ноябре 2000 года. Она заменила версии MSXML 2.0 и MSXML 2.5, поставлявшиеся соответственно в составе Internet Explorer 5.0 и Windows 2000. MSXML 3.0 можно свободно скачать по адресу утилиту XMLINST.EXE можно по адресу http://msdn.microsoft.com/xml.

Сам по себе язык XML не решает проблемы обработки XML-документов, что необходимо при обмене данными между приложениями. Упрощенно говоря, XML лишь связывает, например, некоторый набор чисел с понятием "цена", но, что означает данный термин, язык уже не может расшифровать. Таким образом, для правильной интерпретации содержимого XML-документов необходимо знать описание его структуры.

Принципиальным моментом является то, что использование структурного языка позволяет задавать формальные правила, определяющие возможный структурный состав документа и типы данных. С помощью них формируется фактически новый язык на базе XML. Совокупность таких правил образует XML-схему. Более того, для разных фрагментов XML-документа можно применять различные схемы, используя механизм пространства имен, т.е. один документ может использовать коллекцию схем.

Существует несколько языков, на которых можно описать такие правила. Самым перспективным на данный момент считается язык XML Schema, вытесняющий более традиционный DTD (Document Type Definition), возможности которого гораздо скромнее. Одним из преимуществ XML Schema является то, что само описание схемы является XML- документом, сформированного по определенным правилам. Однако следует иметь в виду, что стандарт XML Schema пока официально еще не принят.

Далее мы подробнее рассмотрим некоторые принципы формирования XML-схем на примере CommerceML.ru, а пока отметим некоторые общие моменты.

В начало статьи

XML-схемы — стандарты, написанные на компьютерном языке

Фактически XML-схемы являются некоторой формой описания стандартов документов на компьютерном языке. При этом, в отличие от знакомых многим брошюр с ГОСТами и ОСТами, схема не только декларирует набор постулатов, но также в непосредственном виде используется для контроля за структурой и синтаксисом документа. Такая операция часто называет проверка состоятельности (validation). Эти операции выполняются программами- анализаторами, либо автоматически в процессе загрузки и коррекции документа, либо по запросу из приложения.

Однако следует подчеркнуть, что такая автоматическая проверка чаще всего не может обеспечить 100-процентной гарантии правильности документа. В любом случае нужно учитывать разъяснения по применению компонентов схемы.

Говоря о XML-схеме, как некотором стандарте специфического вида полезно вспомнить, что российский "Закон о стандартизации" выделяется четыре уровня стандартов: предприятий, научно-технических сообществ, отраслевые и государственные. Подчеркнем сразу, что даже многие ГОСТы носят не обязательный, а рекомендательный характер.

Любой стандарт — это результат компромисса внутри некоторого кругом заинтересованных сторон. Это, в частности, означает, что должен быть механизм поддержки цикла жизнедеятельности стандарта (принятие, внесение изменений и пр.). На уровне предприятия и государства все обстоит относительно просто — там это регулируется директором и Президентом. А как быть для отдельных (порой относительно небольших) сегментов экономики?

Обратим внимание также на специфику разработки стандартов. Например, с одной стороны, они должны соответствовать требованиям времени и, порой немного даже опережать их (чтобы предотвратить хаотичное развитие ситуации). С другой, они быть весьма консервативны — толку от них не будет, если они будут постоянно меняться. Понятно также, что по мере расширения сферы действия стандартов либо увеличивается сложность их разработки, либо снижается конкретика и детальность описаний.

Тут можно с сожалением отметить, что отечественные субъекты рыночной экономики, освободившись от всеобъемлющей опеки государства, находятся в самом начале освоения методов совместного решения общих проблем, в том числе и в области стандартизации. И в этой связи, конечно же, очень интересен зарубежный опыт, где мы можем постоянно видеть примеры взаимодействия, казалось бы, заклятых конкурентов для достижения компромиссов.

Этот вопрос можно обсуждать отдельно, а пока отметим, что подавляющее число промышленных стандартов (в том числе в ИТ-индустрии) создаются по инициативе самих предприятий, разумеется, при самом активном участии лидеров. Довольно часто в этой работе уже на начальном уровне участвуют представители государства (но как правило, в качестве экспертов), однако далеко не все договоренности доходят до уровня какой-то регистрации официальными органами, хотя разработчики, естественно, всячески стараются повысить статус своего труда.

В начало статьи

Инициатива BizTalk

Необходимость стандартизации XML-обмена на уровне некоторых общих отраслевых задач стала одной из причин инициативы BizTalk (ее автором была Microsoft), которая была поддержана лидерами многих отраслей и поэтому сразу превратилась в межиндустриальную. В марте 1999 г. был создан руководящий комитет BizTalk Steering Committee (www.biztalk.org), в состав которого входят ведущие в своих отраслях поставщики, органы стандартизации и корпоративные заказчики. Первая версия спецификаций Framework Document Specification 1.0, разработанных Microsoft, были утверждены и опубликованы в конце 1999 года.

Инициатива BizTalk ориентирована на решение следующих задач:

Практическая работа комитета BizTalk заключается также в разработке стандартов документов для различных прикладных областей (медицины, электротехники, энергетики и пр.). И здесь следуют подчеркнуть один важный момент.

Именно поэтому данная инициатива является "межиндустриальной". Эта задача выполняется в виде формирования единой базы данных о разнообразных XML-схемах, которые позволяют правильным образом интерпретировать и обрабатывать содержимое XML-документов.

На первом этапе применения XML подразумевалось, собственно создание XML-схем документов должно выполняться разработчиком оригинальных документов. (Например, XML- схемы для документов системы R3 разрабатываются компанией SAP, т.е. в этом случае речь идет, как бы о стандарте предприятия). Но в этом случае очевидно, что обмен данными между разными приложениями требуют создания механизма преобразования — желательно автоматического — данных, представленных разными схемами. Именно этой является одной из функций средств типа Microsoft BizTalk Server 2000 (см. Byte/Россия N 2/2001, с. 36).

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

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

В начало статьи

CommerceML — первая российская XML-схема

Тут, конечно, нужно сделать уточнение — речь идет о первом отечественном проекте (получившим определенную известность) создания XML-схемы отраслевого уровня. Соответственно интерес к нему определяет не только возможностью показать практическое применение подобных стандартов, но и тем, что тут можно обсудить вопросы взаимодействия разных компьютерных компаний для выработки совместных решений.

Для начала полезно вспомнить хронологию выполнения проекта.

Июль 2000 года. Фирма "1С" и российское представительство Microsoft объявили о начале работ по созданию стандартов электронного обмена в формате XML для торговых организаций. Такое сообщение никак нельзя назвать неожиданным — за несколько месяцев до этого Microsoft заметно активизировала пропаганду XML-технологий (разумеется, на базе своих продуктов), которая должна быть подкреплена практическими национальными примерами.

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

12 октября 2000. На прошедшей пресс-конференции был представлен стандарт обмена коммерческой информацией в формате XML. Разработка выполнялась специалистами фирм "1С" и Extra.RU при технической поддержке инженеров Microsoft. На завершающем этапе к этим организациям присоединились Интернет-компании Port.RU и Price.RU, а также московского отделения Intel, и все они подписали соглашение о поддержке представленного стандарта.

Особо отмечалось, что данный договор имеет некоммерческий характер и является открытым для всех заинтересованных организаций, готовых к конструктивному сотрудничеству. Надо сказать, что в этих документах действительно четко прописаны вопросы взаимодействия участников проекта, порядок дальнейшей работы, а также механизм присоединения к соглашению других лиц.

Журналистов в том момент в основном интересовали не технические, а организационные вопросы (сами докладчики не использовали термин "XML-схема", хотя речь шла именно о ней) — в какой степени эти стандарты годятся для других разработчиков экономических программ, не является ли все это навязыванием своих решений рынку и пр.

В свою очередь участники проекта подчеркивали, что они исходили из принципа открытости и универсальности: он изначально независим от особенностей программного обеспечения и структур баз данных кого-то из участников проекта. В его основе заложены общие принципы торговой деятельности. При разработке стандарта использовались западные аналоги, но отечественный вариант существенно отличается от них, так как учитывает российскую специфику учета и торговли.

Технический руководитель проекта, начальник отдела разработки программ автоматизации торговли фирмы "1С" Алексей Краюшкин особо отметил, что схема разрабатывалась без привязки к структуре данных 1С. Например, в "1С:Торговле" есть данные, которые напрямую не поддерживаются схемой, и в то же время в схеме есть элементы, которые не очень просто загрузить в "1С:Торговлю". Одной из основных задач при разработке схемы было вычленить минимально необходимый набор реквизитов, достаточный для однозначного описания (идентификации) хозяйственных операций. В итоге схема представляет собой минимальный, но полный набор реквизитов.

6 декабря 2001 года. Разработанная XML-схема получила имя собственное — CommerceInfo. Создан специальный Web-сервер (www.Commerce.ru), на котором размещена полная техническая и организационная информация о проекте. Отметим, что Web-ресурс предоставлен и поддерживается самым "независимым" участником проекта — российским представительства Intel. Некоторое время спустя были внесены некоторые изменения в первоначальный вариант схемы и она получила иное официальное имя — CommerceML.

3 марта 2001 года. На партнерском семинаре фирма "1С" представила новую редакцию 8.7 типовой конфигурации "1С:Торговля и Склад" — первое тиражное решение, в котором реализована возможность обмена коммерческой информацией в формате XML в соответствии со стандартом CommerceML. В этой программе используются два вида XML-обмена: "Продавец — Web-витрина" и "Покупатель — Продавец". Первый предназначен для оперативной публикации коммерческих предложений в Web-каталогах. Второй — для обмена данными (например, накладных) между различными учетными системами.

Рассказывая о нововведения, руководитель фирмы "1С" Борис Нуралиев еще раз подчеркнул, что стандартизация обменом информацией нужна сегодня не столько для Интернет-торговли (доля которой в России весьма незначительна), сколько для взаимодействия обычных, оффлайновых предприятий. Даже если мы сегодня научимся передавать копии электронных документов на дискете, то это сильно упростит работу торговых организаций.

В начало статьи

Посмотрим на CommerceML поближе

Как уже отмечалось ранее, XML-схема — это XML-документ, сформированного по определенным правилам. Ее можно редактировать "руками" в любом текстовом редакторе, но лучше для этого использовать специальные XML-редакторы и редакторы схем(например, XML- Spy — www.xmlspy.com). Схему, прочитанную нами с сервера Commerce.ru, можно также просматривать в Interner Explorer 5.5 (рис. 1).

Рис. 1. Просмотр XML-схемы CommerceML в среде IE 5.5

Мы сейчас не будем подробно говорить о принципах организации XML-схем и отметим лишь основные моменты:

  1. В документе используется специальный тег <description>, в котором записывается произвольный текст комментария к схеме с использованием разметки HTML. Из экономии места на рисунке узлы с большими фрагментами таких комментариев закрыты.

  2. Как тут видно, все описание схемы состоит из последовательности базовых тегов <Element Type>, описывающих элементы XML-документа. Однако нужно обратить внимание, что в данном случае мы не видим иерархию взаимосвязей элементов между собой — сейчас они представлены лишь в виде списка. Но иерархия элементов тут все же определяется, так как каждый элемент содержит список подчиненных ему элементов.

    В результате схему можно представить в виде дерева элементов (рис. 2). Тут стоит заметить, что одинаковые элементы могут находится в разных ветвях, причем на различных уровнях (см. например, ДополнительныйРеквизит или Контакт).

    Рис. 2. Иерархия элементов схемы

  3. Каждый элемент включает описание допустимых подчиненных элементов и атрибутов. (Отметим сразу, что данные в этой схеме записываются в основном в виде атрибутов элементов, а не значений подчиненных элементов.)

    На примере главного элемента "КоммерческаяИнформация" видно, что он может включать шесть подчиненных элементов ("Контрагент", "Склад", "Банк", "Каталог", "ПакетПредложений", "Документ"), которые являются необязательными, но каждый их них может быть использоваться несколько раз (minOccus="0", maxOccurs="*). Причем в XML-документе эти элементы должны располагаться именно в этой очередности (order="seq"). Сам элемент "КоммерческаяИнформация" не может иметь текстовой информации (content="eltOnly"), может включать необязательный (required="no") атрибут "Комментарий" текстового вида (dt:type="string").

  4. В схеме широко используются уникальные идентификаторы, которые применяются для связи, как информации XML-документа с базой данных конкретной учетной системы (например, с каталогами), так и внутренних элементов документа между собой. Для формирования таких уникальных предлагается использовать технологию GUID (Global Unique ID).

Из приведенного здесь фрагмента текста схемы видно, что формальное описание, в общем случае не является достаточным для создания реального XML-документа. Действительно, в данном случае получается, что главный собирательный элемент "Коммерческая информация" с точки зрения грамматики может вообще не содержать какую-то полезную информацию.

Разработанный вариант схемы CommerceML предполагает обмен информацией трех видов:

Каждому из них соответствует свой элемент XML-схемы — "Каталог", "ПакетПредложений" и "Документ". Понятно, что в одном документе, в принципе могут быть несколько таких элементов в произвольном сочетании. Три другие элемента первого уровня ("Контрагент", "Склад" и "Банк") содержат справочную информацию, которая используется в "функциональных" элементах. Мы покажем далее логику обработки XML-документов на конкретном примере.

В начало статьи

Как это работает в "1С:Торговле"

Для формирования XML-документов в среде "1C:Предприятие" используется специальный программный компонент V7Plus, который обеспечивает обращение к MSXML из языка V7. Вот как выглядит фрагмент кода, выполняемого при открытии нового документа:


 Если ЗагрузитьВнешнююКомпоненту("v7plus.dll") <> 1 Тогда
   Предупреждение("Компонента v7plus.dll не найдена!");
 КонецЕсли;

 гАнализатор = СоздатьОбъект("AddIn.XMLParser");
 гДокДанных  = гАнализатор.СоздатьДокумент();
 гДокДанных.ЗагрузитьИзСтроки("<?xml version =""1.0""?>
  <BizTalk xmlns = ""urn:schemas-biztalk-org:biztalk/biztalk-0.81.xml"">
  <Route>
  <From locationID = """" locationType = """"
     process = """" path = """" handle = """"/>
  <To locationID = """" locationType = """"
     process = """" path = """" handle = """"/>
  </Route><Body/></BizTalk>");

 КоллекцияСхем   = гАнализатор.СоздатьКоллекциюСхем();
 КоллекцияСхем.ДобавитьСхему("urn:CommerceML", "CommerML.biz");
 гДокДанных.Схемы = КоллекцияСхем;

 // Создаем корневой элемент
  ЭлКоммИнфо = 
СоздатьПодчиненныйЭлемент(гДокДанных.ЭлементДокумента.ВыбратьУзел("Body"),
               "КоммерческаяИнформация");
 // Далее выполняется ввод или формирование документа

 гДокДанных.Проверить();  // проверка полученного докумета
                         // на соответствие схеме CommerML.biz
  
 гДокДанных.Записать(гИмяФайла); // запись XML-файла

Как отмечалось ранее в новой версии конфигурации "1С:Торговля" реализованы два варианта обмена XML-информацией: "Продавец — Web-витрина" и "Покупатель — Продавец". На рисунках 3 и 4 показаны экранная форма вывода пакета предложений (первый вариант) и полученный XML-файл.

Рис. 3. Рис. 3. Диалоговое окно "Выгрузка пакета предложений"

Рис. 4. Рис. 4. XML-документ с пакетом коммерческих предложений

Тут видно, что результирующих документ включает один каталог и три пакета предложений. В данном случае есть описание только одного контрагента (организации, которая рассылает предложения).

На рисунках 5 и 6 приведены экранные формы выгрузки и загрузки расходной накладной, а на рисунке 7 — содержимое основных узлов соответствующего XML-файла, а на рисунке 8 — элемента "Документ". В этом варианте нужно обратить внимание на следующие моменты.

Рис. 5. Диалоговое окно "Выгрузка расходной накладной"

Рис. 6. Диалоговое окно "Загрузка приходной накладной"

Рис. 7. XML-документ с основными элементами документа "Накладная"

Рис. 8. Содержимое элемента "Документ" в накладной

В документе варианта "1С" корневым элементом является тег "BizTalk", который включает два подэлемента "Route" и "Body", а уже последний содержит собирательный элемент "КоммерческаяИнформация". Эта конструкция в данном случае носит необязательный характер и нужна для будущего применения XML-документа при его обработке с помощью Microsoft BizTalk Server 2000.

Основная информация об отпущенных товарах хранится именно в элементе "Документ". Но в нем же используются данные о поставщике и получателе, которые записаны в элементах "Контрагент" и "Банк". Сведения о товарах используют ссылки на соответствующие каталоги. Если фирмы ранее уже обменялись каталогами, то включать в элемент "Каталог" в документ не обязательно. В данном случае такой элемент имеется и это означает, что либо приведенные в нем данные были обновлены, либо этот каталог вообще ранее не отправлялся получателю.

Отметим еще интересную возможность создания XML-схемы на основе конкретного документа. Например, с помощью соответствующих средств BizTalk Server можно получить схему, которая представляет собой фактически некоторые частный случай некоторого общего варианта (рис. 9)

Рис. 9. Частный вариант схемы, полученной на основе XML-документа

В начало статьи

Пример создания и проверки простейшего XML-документа

Для этого воспользуемся таким кодом, написанным на Visual Basic:


Dim xmlDoc As DOMDocument
Dim myPath$
myPath$ = App.Path + "\"

Public Sub CreateNewXML()
  '
  ' Создание нового документа
  Dim MainNode As IXMLDOMElement
  Dim NewNode As IXMLDOMElement
  Dim newNewNode As IXMLDOMElement

  ' имя адресного простанства схемы:
  Const NameSchema = "urn:CommerceML"  
  

  Set xmlDoc = New DOMDocument
  ' записываем XML-константу объекта
  xmlDoc.loadXML "<?xml version='1.0' encoding='Windows-1251'?><Body/>"
    
  ' Создание узла "КоммерческаяИнформация"
  Set MainNode = xmlDoc.selectSingleNode("//Body").appendChild _
        (xmlDoc.createNode(1, "КоммерческаяИнформация", NameSchema))
  ' создаем элемент с "Документ"
  Set NewNode = MainNode.appendChild _
            (xmlDoc.createNode(1, "Документ", NameSchema))
  ' все необходимые атрибуты:
  Call NewAttributeAdd(NewNode, "ХозОперация", "Order")
  Call NewAttributeAdd(NewNode, "Номер", "1234")
  Call NewAttributeAdd(NewNode, "Дата", "2001-05-28")
  ' далее нужно заполнить обязательный элемент "ПредприятиеВДокументе"
  Set newNewNode = NewNode.appendChild _
            (xmlDoc.createNode(1, "ПредприятиеВДокументе", NameSchema))
  ' и т.д. _ продолжение формирования документа
  
  ' ...

  ' запись созданного документа
  xmlDoc.save myPath + "MyDoc.xml"
End Sub  

Public Sub NewAttributeAdd(NewNode As IXMLDOMElement, _
     attName As String, attValue As Variant)
  Dim attr As IXMLDOMAttribute
  ' Создание аттрибута
  Set attr = xmlDoc.createAttribute(attName)
  attr.Value = attValue
  NewNode.Attributes.setNamedItem attr
End Sub

В результате выполнения данного кода будет получем файл MyDoc.xml, содержание которого приведено на рисунке 10.

Рис. 10. Простейший XML-документ формата CommerceML

Понятно, что здесь приведено только начальные действия по формированию документа, но именно здесь хотелось бы обратить внимание на некоторые нюансы.

  1. Наш собирательный элемент "КоммерческаяИнформация" помещен внутрь главного элемента "Body". Казалось бы, "Body" вообще не нужен, но без него (точнее дополнительного не будет работать механизм проверки соответствия схеме.

  2. Создание всех элементов документа выполняется с помощью метода формирования узла:

    
    createNode(1, NameElement, NameSchema)
    

    Тут нужно подчеркнуть, что везде используется одна константа NameSchema. Причем в этом случае параметр xmlns физически записывается только в корневой элемент.

  3. Атрибут типа "дата" записыватся в международном формате.

Теперь попробуем выполнить автоматическую проверку сформированного XML-документа. Для этого перез записью файла нужно добавить такой код:


' Перед проверкой нужно обызательно выполнить перезагрузку!!
  '-  namespaces будет содержать правильную коллекцию
  xmlDoc.loadXML xmlDoc.xml

' формируем коллекцию схем
Set xmlSchema = New XMLSchemaCache
xmlSchema.Add NameSchema, myPath + "commerml.xml"

' подключаем коллекцию описаний схемы к документу
Set xmlDoc.schemas = xmlSchema
  
' выполняем проверку
Set parseError = xmlDoc.Validate
If parseError.errorCode = 0 Then
  MsgBox "Проверка прошла успешно!" & vbCrLf & _
    "посмотрите, что получилось в файле MyDoc.XML"
Else
  MsgBox "Несоответствие схемы!" + vbCrLf + parseError.reason
End If

Проверка созданного ранее файла, конечно же, покажет ошибку, так как для элемента "ПредприятиеВДокументе" не заданы обязательные атрибуты.

В этом небольшом коде нужно обратить на два важных момента:

  1. Перед подключением схемы нужно обязательно выполнить перезугрузку документа с помощью метода XML.

  2. При загрузке схемы мы также обязаны использовать то же самое имя адресного простанства NameSchema, которое применяется в самом документе.

В начало статьи

Пример ввода XML-документа

В качестве иллюстрации обработки полученного документа рассмотрим еще один пример с вводом полученной ранее накладной в системе "1С:Предприятие". Очевидно, что для начала следует проверить его на соответствие заданной XML-схеме:


 Dim xmldoc  As DOMDocument
 Dim xmlSchema As XMLSchemaCache
 Dim parseError As IXMLDOMParseError

 ' загрузка документа
 Set xmldoc = New DOMDocument
 xmldoc.Load myPath + "Document.xml"

  ' подключаем описание схемы
  Dim NameSchema$
  NameSchema = "urn:CommerceML"
  Set xmlSchema = New XMLSchemaCache
  xmlSchema.Add "urn:schemas-biztalk-org:biztalk/biztalk-0.81.xml", _
      myPath + "EmptyBizTalkSchema.xdr"
  xmlSchema.Add NameSchema, myPath + "commerml.biz"
  Set xmldoc.schemas = xmlSchema
  ' проверка соответствия:
  Set parseError = xmldoc.Validate
  If parseError.errorCode <> 0 Then
      MsgBox "Несоответствие схемы!" + vbCrLf + parseError.reason
  End If

Сначала мне хотелось написать программный код из предположения, что мы получили некий неизвестный XML-файл и ему нужно обработать по правилам приведенным в опубливованном описании схемы. Однако из приведенного здесь примера видно, что реализовать задумку не удалось из-за некоторых принципиальных проблем:

  1. Для выполнения проверки документа "1С" нужно подключать описание еще одной схемы для анализа дополнительного тега "BizTalk". Однако, к сожалению, в стандарте ничего об этом не говорится, а нужный файл EmptyBizTalkSchema.xdr на сервере отсутствует (но, фирма "1С" любезно предоставила его).

  2. Для проверки нужно знать, какое имя адресного пространства используется в полученном файле. К сожалению, это имя в стандарте не зафиксировано, поэтому какой идентификатор применял отправитель XML-файла в общем случает неизвестно.

Поэтому нужно подправить приведенный выше код, чтобы сначала узнать это имя - сразу после загрузки файла следует сначала найти наш собирательный документ и узнать какой идентификатор в нем используется:


 Dim commInfo As IXMLDOMElement
 ' поиск собирательного элемента
 Set commInfo = doc.documentElement.selectSingleNode _
     ("Body/КоммерческаяИнформация")
 If TypeName(commInfo) = "Nothing" Then
    MsgBox = "Нет элемента КоммерческаяИнформация!!!" : End
 End If
 NameSchema$ = commInfo.namespaceURI  ' вот нужно имя
 ' далее выполняется подключение схемы и проверка файла

Затем можно приступать к анализу содержимого документа:


 Dim elDoc As IXMLDOMElement
 ' ищем функциональные элементы (в данном случае "Документ"):
 Set elDoc = commInfo.selectSingleNode("Документ")
 If Not TypeName(elDoc) = "Nothing" Then
  ' найден, определяем тип документа
  Select Case elDoc.getAttribute("ХозОперация")
    Case "Order"    ' Заказ товара
    Case "Sale"     ' Накладная на отпуск товара
    Case "Invoice"  ' Счет-фактура
    ' ... всего имеется 12 типов документов
  End Select

В любой хозяйственной операции участвуют две организации, поэтому далее нужно получить информацию о них:


 Dim CurNode As IXMLDOMElement
 Dim IdNode As IXMLDOMElement

 ' определяем, кто является продавцом
 ' поиск в элементе "Документ"
 Set curNode = elDoc.selectSingleNode _
  ("ПредприятиеВДокументе[@Роль = 'Saler']")

 ' далее по уникальному ID ищем соответствующий элементе "Контрагент"
 IdSaler$ = curNode.getAttribute("Контрагент"))
 strSearch$ = "Контрагент[@Идентификатор='" + IdSaler$ + "']"
 ' поиск по всему XML-документу
 Set IdNode = commInfo.selectSingleNode(searchStr)
 If TypeName(IdNode) = "Nothing" Then
   Msgbox IdNode.getAttribute("ОтображаемоеНаименование")
 Else
   ' Элемент с контрагентом не найден.
   ' Можно посмотреть в своей базе — нет ли уже такого партнера
 End If

Далее можно выполнить выборку всех полученных товаров:


 For Each curNode In elDoc.selectNodes("//ТоварнаяПозиция")
   MsgBox curNode.getAttribute("Товар")
 Next

Для каждой товарной позиции ищется каталог (в самом документе или в собственной базе данных) и т.д. и т.п.

Вот собственно и все.

В начало статьи

Нужны ли XML-схемы для электронной коммерции?

Мы вернулись к начальному вопросу — действительно ли проблема обмена информацией в неоднородных системах актуальна? Может быть все эти разговоры об XML — всего ли маркетинговые ходы для обоснования продажи новых версий программ? (Вспомним о проблеме Y2K!) Действительно, проект CommerceML официально опубликован полгода назад, но почему же в нем не принимают участия другие известные разработчики экономического ПО?

Вряд ли на этот вопрос можно дать какой-то однозначный ответ. Вполне вероятно, что реальные потребности в интеграции приложений и передачи данных пока не столь велики. Возможно, российские разработчики бизнес-программ не очень готовы к конструктивному сотрудничеству. Наверное, и сама схема CommerceML не лишена недостатков.

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

В заключении хотел бы поблагодарить сотрудников фирмы "1С" Алексея Краюшкина и московского представительства Microsoft Дмитрия Старостина за помощь в подготовке статьи и изучении темы.

В начало статьи