При настройке бесшовной интеграции между «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 является ключевым, и без его заполнения объект считается невалидным.
Выясним, какие именно поля необходимо заполнить, чтобы 1С:Документооборот принял наши данные без ошибок. Структура объектов в пакете DM требует строгого соблюдения иерархии.
Для объекта типа DMProduct:
id — Уникальный идентификатор объекта (строка, обычно передается GUID товара из УТ).name — Наименование товара. Именно на его отсутствие чаще всего жалуется система.isFolder — Булево значение (Истина/Ложь), определяющее, является ли объект папкой.Для объекта типа DMProductRow (строка таблицы товаров):
product — Ссылка на созданный ранее объект DMProduct.quantity — Количество (число).price — Цена (число).amount — Сумма (число).Проанализируем ситуацию: если мы пытаемся отправить только артикул и код, веб-сервис закономерно отклоняет пакет, так как он не соответствует описанию типа в WSDL-файле.
Рассмотрим исправленный алгоритм заполнения данных. Вместо использования «костылей» с примитивными типами данных, мы должны полностью описать объект в соответствии с требованиями фабрики 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.Проверить();
Исключение
Инфо = ИнформацияОбОшибке();
Сообщить("Объект не прошел валидацию: " + Инфо.Описание);
КонецПопытки;
Этот нехитрый прием позволит вам увидеть конкретное имя свойства, которое «забыто» или заполнено данными неверного типа. Например, если в поле типа boolean (логическое) передать строку "false" или число 0, метод Проверить() выдаст ошибку типа, что гораздо информативнее, чем общая ошибка SOAP-сервера.
Важно помнить, что структура пакетов может отличаться в зависимости от версии ДО. В 1С:Документооборот 2.1 и 3.0 используются разные пространства имен (Namespace). Если вы настраиваете бесшовную интеграцию «с нуля», убедитесь, что в коде создания объектов используются типы именно из того пакета, который импортирован из текущего веб-сервиса.
Также разберем ситуацию с пустыми значениями. Если в схеме XDTO свойство помечено как Возможно пустое = Ложь (Nillable = false), вы обязаны либо заполнить его значением, либо полностью исключить из структуры (если это позволяет нижняя граница MinOccurs). Однако для объектов типа DMProduct большинство полей являются строго обязательными для обеспечения целостности данных в базе ДО.
Подводя итог, можно сказать: большинство ошибок преобразования XDTO при интеграции с ДО решаются внимательным изучением текста ошибки (где почти всегда указано имя недостающего свойства) и строгим заполнением всех реквизитов объекта, а не только тех, которые кажутся важными для бизнес-логики.