Как реализовать обмен данными с 1С в формате EnterpriseData 1.8 при генерации классов в C#?

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

При разработке интеграционных решений, использующих формат EnterpriseData 1.8, разработчики C# часто сталкиваются с критической ошибкой при попытке генерации классов через стандартную утилиту xsd.exe. Проблема заключается в использовании элемента xs:any в схемах 1С, что вызывает неоднозначность модели содержимого и препятствует автоматическому созданию корректных классов. Давайте разберем, почему это происходит и как построить архитектуру обмена, чтобы избежать подобных тупиков.

Почему возникает конфликт с ##any?

Стандартные инструменты генерации кода, такие как xsd.exe, пытаются создать жесткую структуру классов для всех элементов схемы. Однако формат EnterpriseData спроектирован с учетом максимальной гибкости: конструкция xs:any позволяет добавлять ДополнительныеРеквизиты, которые не описаны жестко в основной структуре. Генератор не может предсказать тип этих данных, из-за чего процесс валидации схемы прерывается с ошибкой неоднозначности.

Вариант 1: Использование альтернативных подходов к обработке XML

Вместо того чтобы бороться с генератором, который не справляется с динамическими полями, рекомендуется пересмотреть стратегию работы с данными:

  1. Использование LINQ to XML: Работайте с объектами XDocument или XmlDocument напрямую. Это позволит вам выбирать только те узлы, которые критически важны для бизнес-логики вашего товароучетного софта, игнорируя лишние описательные части схемы.
  2. Ручная доработка Partial Classes: Если вы все же сгенерировали базу классов (удалив временно проблемные участки схемы), используйте в C# ключевое слово partial. Вы можете создать дополнительные файлы для этих классов, где вручную реализуете обработку XmlAnyElementAttribute для сбора произвольных дополнительных данных.

Вариант 2: Переход на формат JSON

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

Преимущества перехода на JSON:

Рассмотрим пример того, как это выглядит на стороне 1С (концептуально):


// Пример формирования JSON в 1С
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписьJSON.ЗаписатьНачалоОбъекта();
ЗаписьJSON.ЗаписатьИмяСвойства("Товар");
ЗаписьJSON.ЗаписатьЗначение("Наименование", "Пример товара");
ЗаписьJSON.ЗаписатьКонецОбъекта();
СтрокаJSON = ЗаписьJSON.Закрыть();

Вариант 3: Создание кастомного XDTO-пакета

Если спецификация EnterpriseData обязательна для ваших пользователей, не обязательно использовать «сырую» типовую схему, которая перегружена избыточными данными. Вы можете создать собственный XDTO-пакет внутри 1С, который будет содержать лишь подмножество необходимых вам полей.

Как поступить:

  1. Экспортируйте из 1С необходимый XDTO-пакет в формате XSD.
  2. Очистите схему от всех узлов с xs:any и тех блоков, которые не используются в вашем обмене.
  3. Подайте эту «облегченную» версию на вход xsd.exe.

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

← На главную