При доработке интеграции с сервисом Диадок, в частности при добавлении кодов идентификации (КИЗ) в табличную часть Items, разработчики часто сталкиваются с ошибкой «Несоответствие типов XDTO». Эта ошибка возникает в момент вызова метода Добавить() для коллекции ItemIdentificationNumbers. Давайте разберем, почему это происходит и как правильно решить эту задачу.
Основная причина заключается в том, что в 1С объекты XDTO строго привязаны к той ФабрикаXDTO, которая их создала. Даже если вы используете абсолютно идентичные XSD-схемы для инициализации двух разных фабрик, объекты, порожденные ими, будут считаться платформой «чужими» друг для друга. Если «Протоконтент» был создан одной фабрикой (внутренней фабрикой модуля Диадока), а вы пытаетесь добавить в него объект, созданный «собственной» фабрикой, платформа выдаст ошибку несоответствия типов.
Чтобы избежать этой ошибки, необходимо отказаться от создания собственных экземпляров ФабрикаXDTO и использовать ту фабрику, в контексте которой был создан объект Протоконтент.
Новый ФабрикаXDTO(НаборСхемXML), обратитесь к фабрике, которая уже используется в объекте Протоконтент. Если вы находитесь внутри функции ПодготовитьЭлектронныйДокумент, объект Протоконтент уже содержит ссылку на свою фабрику.Протоконтент, для создания всех дочерних элементов. Примерный алгоритм выглядит следующим образом:
// Получаем фабрику из самого объекта Протоконтент
ФабрикаДляДокумента = Протоконтент.ФабрикаXDTO;
// Используем её для создания объекта нужного типа
// ВладеющееСвойствоТипИмя берем из свойств коллекции, как в примере автора
НовыйОбъект = ФабрикаДляДокумента.Создать(ТипОбъекта);
Протоконтент.Table.Items[Индекс].ItemIdentificationNumbers.Добавить(НовыйОбъект);
Часто возникает вопрос: нужно ли каждый раз создавать ОбъектXDTO или можно просто передать значение? Рассмотрим подробнее:
Добавить(). В этом случае вы можете просто написать: СписокXDTO_Units.Добавить(СтрокаКИЗ);.ItemIdentificationNumber), то создание ОбъектXDTO через ФабрикаXDTO.Создать() является строго обязательным. Попытка добавить просто строку в коллекцию объектов приведет к ошибке, так как структура элемента не будет соответствовать ожидаемой схеме.Рассмотрим несколько важных правил при разработке внешних модулей интеграции:
Избегайте «самодельных» фабрик: Использование внешних обработок для загрузки макетов XSD и создания на их основе фабрик «на лету» — это плохая практика, приводящая к конфликту контекстов. Всегда старайтесь работать в рамках тех объектов, которые передаются вам в параметрах вызова.
Изучайте структуру объектов в отладчике: Перед тем как писать код, посмотрите в отладчике свойства объекта Протоконтент. Найдите там свойство ФабрикаXDTO. Это ключ к решению проблем с типами. Если вы не видите явного доступа к фабрике, изучите методы объектов модуля интеграции — зачастую разработчики оставляют публичные методы для расширения функционала, которые уже корректно работают с нужными типами данных.
Проверка типизации: Если вы столкнулись с ошибкой «Тип свойства не соответствует типу значения», проверьте, что полное имя типа (включая URI пространства имен), которое вы передаете в метод ФабрикаXDTO.Создать(), полностью совпадает с тем, что ожидает схема. В сообщении об ошибке обычно указывается ожидаемый тип — используйте эту информацию для сверки URI пространства имен.
Следуя этим правилам и используя единый контекст фабрики XDTO, вы сможете успешно модифицировать протоструктуры Диадока без конфликтов типов и ошибок платформы.