Коллеги, сегодня мы с вами погрузимся в одну из самых сложных и обсуждаемых тем в разработке на 1С – расширение XDTO-пакетов и их корректную интеграцию с «Конвертацией данных 3.0» (КД3) — для этого подойдут правила обмена EnterpriseData для КД3. Особенно актуальна эта задача, когда требуется добавить новый реквизит простого типа в табличную часть документа, а стандартные механизмы КД3 почему-то не справляются или ведут себя непредсказуемо. Многие сталкиваются с тем, что КД3 либо неверно подгружает формат расширенного пакета, либо не формирует критически важную строку ОбменДаннымиXDTOСервер.ИнициализироватьРасширениеПравилаКонвертацииОбъекта(), необходимую для работы с расширениями. Рассмотрим эту проблему подробно и найдем пути её решения.
Расширение XDTO-пакета для использования с КД3 – это не просто добавление нового поля. Это многоступенчатый процесс, требующий глубокого понимания как структуры XDTO, так и внутренних механизмов КД3. Если наш архитектор требует делать все строго через расширения, это означает, что нам предстоит столкнуться с рядом нюансов. Давайте разберем основные шаги и моменты, на которые стоит обратить внимание.
EnterpriseData) — для такой задачи есть расширение EnterpriseData для регулярной синхронизации. Важно, чтобы этот расширяющий пакет явно наследовал от стандартного, используя директивы импорта. Это критично для корректной ссылки на базовые объекты формата и работы с их свойствами. Например, при расширении пакета EnterpriseData часто требуется явно включить ExchangeMessage в расширение:
<xs:import namespace="http://www.1c.ru/SSL/Exchange/Message" schemaLocation="ExchangeMessage.xsd"/>
<xs:import namespace="http://v8.1c.ru/edi/edi_stnd/EnterpriseData/1.8" schemaLocation="EnterpriseData_1_8.xsd"/>
Именно эти импорты позволяют вашему расширяющему пакету "видеть" и ссылаться на типы, определенные в базовых пакетах.
EnterpriseData. Важно понимать, что расширенный пакет должен включать не только сам этот тип объекта, но и все вышестоящие типы в иерархии базового пакета, чтобы КД3 могла корректно построить структуру. При добавлении новых свойств их пространство имен должно быть указано при инициализации и затем передано в качестве параметра ПространствоИмен в метод ДобавитьПКС(). В некоторых случаях полезно изучить конвертацию схемы XSD в модель XDTO, если вы планируете использовать сложные типы данных.Автор нашей темы столкнулся с двумя ключевыми проблемами: КД3 неверно подгружает формат и не формирует заветную строку ОбменДаннымиXDTOСервер.ИнициализироватьРасширениеПравилаКонвертацииОбъекта(). Давайте выясним причины этого поведения.
Эта строка является ключевой для работы с расширенными пакетами. Она позволяет КД3 понять, какие пространства имен относятся к расширениям и как с ними работать. Из обсуждения мы видим важный диагностический момент: КД3 генерирует вызов ОбменДаннымиXDTOСервер.ИнициализироватьРасширениеПравилаКонвертацииОбъекта только в том случае, если в объекте используется ПКС (правило конвертации свойства) с расширенным свойством формата.
Что это значит? Когда мы добавляем в расширенный XDTO-пакет новое свойство, а затем в КД3 создаем для него ПКС, КД3 должна распознать, что это свойство пришло из расширения. Если же КД3 «думает», что это обычное свойство базового формата, то и вызов для инициализации расширения не будет сгенерирован.
Рассмотрим, как это работает в разных версиях КД3:
ОбменДаннымиXDTOСервер.ИнициализироватьРасширениеПравилаКонвертацииОбъекта в модули конвертации и явно указывать ПравилоКонвертации.ПространствоИмен для новых типов в расширенном формате. Это был трудоемкий процесс, подверженный ошибкам.ОбменДаннымиXDTOСервер.ИнициализироватьРасширениеПравилаКонвертацииОбъекта в правилах конвертации объектов (ПКО) расширяемых объектов формата. Кроме того, в ПКО расширяемых объектов для свойств, характерных для расширенного формата, должен быть корректно определен шестой параметр с пространством имен расширенного пакета.Если автоматическая генерация не происходит, это может указывать на ошибки в структуре XDTO. В сложных случаях, когда состав реквизитов сильно отличается, может быть полезен метод десериализации объектов в конфигурации-приемнике с отличиями в реквизитах.
Для нашей задачи — добавления нового реквизита простого типа в табличную часть документа — рассмотрим шаги более детально, учитывая вышеупомянутые особенности. Для этого есть набор доработанных правил обмена EnterpriseData.
MyExtension.xsd) необходимо определить новый тип, который будет представлять вашу расширенную табличную часть, наследуя его от базового типа табличной части EnterpriseData.ExchangeMessage, EnterpriseData) с правильными пространствами имен.Пример (упрощенный, для понимания структуры):
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:ent="http://v8.1c.ru/edi/edi_stnd/EnterpriseData/1.8"
xmlns:ext="http://www.mycompany.com/MyExtension"
targetNamespace="http://www.mycompany.com/MyExtension"
elementFormDefault="qualified">
<xs:import namespace="http://v8.1c.ru/edi/edi_stnd/EnterpriseData/1.8" schemaLocation="EnterpriseData_1_8.xsd"/>
<xs:complexType name="Документ_МойДокумент.ТабличнаяЧасть1Расширение">
<xs:complexContent>
<xs:extension base="ent:Документ_МойДокумент.ТабличнаяЧасть1">
<xs:sequence>
<xs:element name="НовыйРеквизит" type="xs:string" minOccurs="0"/>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:complexType name="Документ_МойДокументРасширение">
<xs:complexContent>
<xs:extension base="ent:Документ_МойДокумент">
<xs:sequence>
<xs:element name="ТабличнаяЧасть1" type="ext:Документ_МойДокумент.ТабличнаяЧасть1Расширение" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
</xs:schema>
Если борьба с КД3 кажется невыносимой, существуют альтернативные стратегии.
Этот подход подразумевает, что мы позволяем КД3 сгенерировать базовый модуль обмена, а затем вручную дорабатываем его, чтобы учесть наши расширения.
Суть подхода:
XDTOСвойство.Недостатки: Сложность поддержки при перегенерации правил.
Это более радикальный подход — создание копии стандартного XDTO-пакета со своими изменениями. Это позволяет избежать проблем с "нераспознаванием" расширений в КД3, но значительно усложняет обновление формата в будущем.
Работа с расширениями XDTO-пакетов в КД3 требует методичного подхода и внимания к деталям.
Наши рекомендации:
ИнициализироватьРасширениеПравилаКонвертацииОбъекта. Строка генерируется только при явном использовании расширенного свойства в ПКС.Несмотря на все сложности, расширение XDTO-пакетов и их интеграция с КД3 является мощным инструментом для обмена данными в 1С. Главное — это методичный подход и глубокое понимание принципов работы платформы.