Как исправить ошибку «Несоответствие типов XDTO» при работе с API Диадок?

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

При доработке интеграции с сервисом Диадок, в частности при добавлении кодов идентификации (КИЗ) в табличную часть Items, разработчики часто сталкиваются с ошибкой «Несоответствие типов XDTO». Эта ошибка возникает в момент вызова метода Добавить() для коллекции ItemIdentificationNumbers. Давайте разберем, почему это происходит и как правильно решить эту задачу.

Причина возникновения ошибки

Основная причина заключается в том, что в 1С объекты XDTO строго привязаны к той ФабрикаXDTO, которая их создала. Даже если вы используете абсолютно идентичные XSD-схемы для инициализации двух разных фабрик, объекты, порожденные ими, будут считаться платформой «чужими» друг для друга. Если «Протоконтент» был создан одной фабрикой (внутренней фабрикой модуля Диадока), а вы пытаетесь добавить в него объект, созданный «собственной» фабрикой, платформа выдаст ошибку несоответствия типов.

Пошаговое решение проблемы

Чтобы избежать этой ошибки, необходимо отказаться от создания собственных экземпляров ФабрикаXDTO и использовать ту фабрику, в контексте которой был создан объект Протоконтент.

  1. Анализ контекста фабрики: Вместо того чтобы создавать новую фабрику через Новый ФабрикаXDTO(НаборСхемXML), обратитесь к фабрике, которая уже используется в объекте Протоконтент. Если вы находитесь внутри функции ПодготовитьЭлектронныйДокумент, объект Протоконтент уже содержит ссылку на свою фабрику.
  2. Создание объектов внутри единой фабрики: Используйте фабрику, принадлежащую Протоконтент, для создания всех дочерних элементов. Примерный алгоритм выглядит следующим образом:

// Получаем фабрику из самого объекта Протоконтент
ФабрикаДляДокумента = Протоконтент.ФабрикаXDTO;

// Используем её для создания объекта нужного типа
// ВладеющееСвойствоТипИмя берем из свойств коллекции, как в примере автора
НовыйОбъект = ФабрикаДляДокумента.Создать(ТипОбъекта);
Протоконтент.Table.Items[Индекс].ItemIdentificationNumbers.Добавить(НовыйОбъект);

Рекомендации по работе со списковыми свойствами

Часто возникает вопрос: нужно ли каждый раз создавать ОбъектXDTO или можно просто передать значение? Рассмотрим подробнее:

Практические советы по архитектуре

Рассмотрим несколько важных правил при разработке внешних модулей интеграции:

Избегайте «самодельных» фабрик: Использование внешних обработок для загрузки макетов XSD и создания на их основе фабрик «на лету» — это плохая практика, приводящая к конфликту контекстов. Всегда старайтесь работать в рамках тех объектов, которые передаются вам в параметрах вызова.

Изучайте структуру объектов в отладчике: Перед тем как писать код, посмотрите в отладчике свойства объекта Протоконтент. Найдите там свойство ФабрикаXDTO. Это ключ к решению проблем с типами. Если вы не видите явного доступа к фабрике, изучите методы объектов модуля интеграции — зачастую разработчики оставляют публичные методы для расширения функционала, которые уже корректно работают с нужными типами данных.

Проверка типизации: Если вы столкнулись с ошибкой «Тип свойства не соответствует типу значения», проверьте, что полное имя типа (включая URI пространства имен), которое вы передаете в метод ФабрикаXDTO.Создать(), полностью совпадает с тем, что ожидает схема. В сообщении об ошибке обычно указывается ожидаемый тип — используйте эту информацию для сверки URI пространства имен.

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

← На главную