Коллеги, сегодня мы с вами погрузимся в одну из самых сложных и обсуждаемых тем в разработке на 1С – расширение XDTO-пакетов и их корректную интеграцию с «Конвертацией данных 3.0» (КД3). Особенно актуальна эта задача, когда требуется добавить новый реквизит простого типа в табличную часть документа, а стандартные механизмы КД3 почему-то не справляются или ведут себя непредсказуемо. Многие сталкиваются с тем, что КД3 либо неверно подгружает формат расширенного пакета, либо не формирует критически важную строку ОбменДаннымиXDTOСервер.ИнициализироватьРасширениеПравилаКонвертацииОбъекта(), необходимую для работы с расширениями. Рассмотрим эту проблему подробно и найдем пути её решения.
Расширение XDTO-пакета для использования с КД3 – это не просто добавление нового поля. Это многоступенчатый процесс, требующий глубокого понимания как структуры XDTO, так и внутренних механизмов КД3. Если наш архитектор требует делать все строго через расширения, это означает, что нам предстоит столкнуться с рядом нюансов. Давайте разберем основные шаги и моменты, на которые стоит обратить внимание.
EnterpriseData). Важно, чтобы этот расширяющий пакет явно наследовал от стандартного, используя директивы импорта. Это критично для корректной ссылки на базовые объекты формата и работы с их свойствами. Например, при расширении пакета EnterpriseData часто требуется явно включить ExchangeMessage в расширение:
Именно эти импорты позволяют вашему расширяющему пакету "видеть" и ссылаться на типы, определенные в базовых пакетах.
EnterpriseData. Важно понимать, что расширенный пакет должен включать не только сам этот тип объекта, но и все вышестоящие типы в иерархии базового пакета, чтобы КД3 могла корректно построить структуру. При добавлении новых свойств их пространство имен должно быть указано при инициализации и затем передано в качестве параметра ПространствоИмен в метод ДобавитьПКС(). В некоторых случаях полезно изучить конвертацию схемы XSD в модель XDTO, если вы планируете использовать сложные типы данных.Автор нашей темы столкнулся с двумя ключевыми проблемами: КД3 неверно подгружает формат и не формирует заветную строку ОбменДаннымиXDTOСервер.ИнициализироватьРасширениеПравилаКонвертацииОбъекта(). Давайте выясним причины этого поведения.
Эта строка является ключевой для работы с расширенными пакетами. Она позволяет КД3 понять, какие пространства имен относятся к расширениям и как с ними работать. Из обсуждения мы видим важный диагностический момент: КД3 генерирует вызов ОбменДаннымиXDTOСервер.ИнициализироватьРасширениеПравилаКонвертацииОбъекта только в том случае, если в объекте используется ПКС (правило конвертации свойства) с расширенным свойством формата.
Что это значит? Когда мы добавляем в расширенный XDTO-пакет новое свойство, а затем в КД3 создаем для него ПКС, КД3 должна распознать, что это свойство пришло из расширения. Если же КД3 «думает», что это обычное свойство базового формата, то и вызов для инициализации расширения не будет сгенерирован.
Рассмотрим, как это работает в разных версиях КД3:
ОбменДаннымиXDTOСервер.ИнициализироватьРасширениеПравилаКонвертацииОбъекта в модули конвертации и явно указывать ПравилоКонвертации.ПространствоИмен для новых типов в расширенном формате. Это был трудоемкий процесс, подверженный ошибкам.ОбменДаннымиXDTOСервер.ИнициализироватьРасширениеПравилаКонвертацииОбъекта в правилах конвертации объектов (ПКО) расширяемых объектов формата. Кроме того, в ПКО расширяемых объектов для свойств, характерных для расширенного формата, должен быть корректно определен шестой параметр с пространством имен расширенного пакета.Если автоматическая генерация не происходит, это может указывать на ошибки в структуре XDTO. В сложных случаях, когда состав реквизитов сильно отличается, может быть полезен метод десериализации объектов в конфигурации-приемнике с отличиями в реквизитах.
Для нашей задачи — добавления нового реквизита простого типа в табличную часть документа — рассмотрим шаги более детально, учитывая вышеупомянутые особенности.
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С. Главное — это методичный подход и глубокое понимание принципов работы платформы.