Как исправить ошибку преобразования данных XDTO при передаче товаров в 1С:Документооборот

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

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

Анализируем причину ошибки валидации

Рассмотрим ситуацию, когда при вызове метода execute веб-сервиса DMService система выдает диагностическое сообщение о некорректном чтении объекта типа {http://www.1c.ru/dm}DMProduct. В тексте ошибки часто фигурирует фраза: «Не установлено значение одного из следующих свойств: name».

Основная причина кроется в строгой типизации XDTO-пакета DM (Data Management), который используется в 1С:Документообороте. В схеме этого пакета для многих свойств установлено правило Минимальное количество = 1. Это означает, что свойство является обязательным для заполнения. Если вы создаете объект через прокси, но не заполняете хотя бы одно обязательное поле, механизм валидации 1С блокирует отправку SOAP-запроса еще на этапе сериализации данных на стороне клиента (в УТ).

Посмотрим на типичный ошибочный код создания продукта:


ПродуктXDTO = ИнтеграцияС1СДокументооборот.СоздатьОбъект(Прокси, "DMProduct");
ПродуктXDTO.article = "Тестовый товар";
ПродуктXDTO.code = "777";
ПродуктXDTO.Установить("isFolder", Ложь);
// Ошибка: пропущено свойство "name" и "id"

Даже если в тексте ошибки упоминается свойство isFolder, это лишь верхушка айсберга. Валидатор проверяет объект целиком. В типе DMProduct свойство name является ключевым, и без его заполнения объект считается невалидным.

Обязательные поля для объектов DMProduct и DMProductRow

Выясним, какие именно поля необходимо заполнить, чтобы 1С:Документооборот принял наши данные без ошибок. Структура объектов в пакете DM требует строгого соблюдения иерархии.

Для объекта типа DMProduct:

  1. id — Уникальный идентификатор объекта (строка, обычно передается GUID товара из УТ).
  2. name — Наименование товара. Именно на его отсутствие чаще всего жалуется система.
  3. isFolder — Булево значение (Истина/Ложь), определяющее, является ли объект папкой.

Для объекта типа DMProductRow (строка таблицы товаров):

  1. product — Ссылка на созданный ранее объект DMProduct.
  2. quantity — Количество (число).
  3. price — Цена (число).
  4. amount — Сумма (число).

Проанализируем ситуацию: если мы пытаемся отправить только артикул и код, веб-сервис закономерно отклоняет пакет, так как он не соответствует описанию типа в WSDL-файле.

Правильная реализация создания объектов XDTO

Рассмотрим исправленный алгоритм заполнения данных. Вместо использования «костылей» с примитивными типами данных, мы должны полностью описать объект в соответствии с требованиями фабрики XDTO.


// 1. Создаем объект строки таблицы
СтрокаXDTO = ИнтеграцияС1СДокументооборот.СоздатьОбъект(Прокси, "DMProductRow");

// 2. Создаем и заполняем объект самого товара
ПродуктXDTO = ИнтеграцияС1СДокументооборот.СоздатьОбъект(Прокси, "DMProduct");
ПродуктXDTO.id = Строка(ТоварСсылка.УникальныйИдентификатор());
ПродуктXDTO.name = ТоварСсылка.Наименование;
ПродуктXDTO.article = ТоварСсылка.Артикул;
ПродуктXDTO.isFolder = Ложь;

// 3. Привязываем товар к строке и заполняем количественно-суммовые показатели
СтрокаXDTO.product = ПродуктXDTO;
СтрокаXDTO.quantity = СтрокаТаблицы.Количество;
СтрокаXDTO.price = СтрокаТаблицы.Цена;
СтрокаXDTO.amount = СтрокаТаблицы.Сумма;

// 4. Добавляем строку в коллекцию productRows основного объекта
ОбъектXDTO.productRows.rows.Добавить(СтрокаXDTO);

Обратите внимание на использование метода ИнтеграцияС1СДокументооборот.СоздатьОбъект. Эта функция-обертка помогает корректно инициализировать объект через Прокси.ФабрикаXDTO.Создать(...), используя пространство имен, определенное в настройках интеграции.

Как отлаживать ошибки преобразования XDTO

Если ошибка сохраняется, а текст сообщения остается неясным, воспользуемся методом программной проверки объекта. У любого объекта XDTO есть метод Проверить(), который позволяет выявить несоответствия схеме до момента отправки данных на сервер.

Проанализируем пример отладочного кода:


Попытка
    ОбъектXDTO.Проверить();
Исключение
    Инфо = ИнформацияОбОшибке();
    Сообщить("Объект не прошел валидацию: " + Инфо.Описание);
КонецПопытки;

Этот нехитрый прием позволит вам увидеть конкретное имя свойства, которое «забыто» или заполнено данными неверного типа. Например, если в поле типа boolean (логическое) передать строку "false" или число 0, метод Проверить() выдаст ошибку типа, что гораздо информативнее, чем общая ошибка SOAP-сервера.

Нюансы работы с версиями 1С:Документооборота

Важно помнить, что структура пакетов может отличаться в зависимости от версии ДО. В 1С:Документооборот 2.1 и 3.0 используются разные пространства имен (Namespace). Если вы настраиваете бесшовную интеграцию «с нуля», убедитесь, что в коде создания объектов используются типы именно из того пакета, который импортирован из текущего веб-сервиса.

Также разберем ситуацию с пустыми значениями. Если в схеме XDTO свойство помечено как Возможно пустое = Ложь (Nillable = false), вы обязаны либо заполнить его значением, либо полностью исключить из структуры (если это позволяет нижняя граница MinOccurs). Однако для объектов типа DMProduct большинство полей являются строго обязательными для обеспечения целостности данных в базе ДО.

Подводя итог, можно сказать: большинство ошибок преобразования XDTO при интеграции с ДО решаются внимательным изучением текста ошибки (где почти всегда указано имя недостающего свойства) и строгим заполнением всех реквизитов объекта, а не только тех, которые кажутся важными для бизнес-логики.

← На главную