При настройке обмена данными в 1С, особенно если вы используете обмены через брокеры, формат Enterprise Data (помогут готовые правила обмена EnterpriseData для нетиповых реквизитов) или собственные XDTO-пакеты через расширения конфигурации, разработчики часто сталкиваются с ошибкой валидации структуры. Сообщение «Структура объекта не соответствует типу: Отсутствует обязательное свойство» говорит о том, что система ожидает наличие определенного поля в XML-файле, но не находит его или не может сопоставить с описанием в схеме. Разберем подробно, как диагностировать и устранить эту проблему на разных уровнях: от опечаток в коде до тонких настроек свойств в XDTO-пакете.
Первым шагом проанализируем ситуацию, описанную в сообщениях форума. Проблема часто возникает при добавлении новых документов или справочников в обмен через расширения. Валидатор XDTO строго следует правилам, описанным в пакете, и любое отклонение (даже в одну букву) приводит к фатальной ошибке загрузки данных. Чтобы минимизировать такие риски на этапе разработки, рекомендуется использовать статический анализатор кода проектов, который помогает выявлять несоответствия. Основные причины включают:
минимальное количество = 1), а в выгружаемых данных оно отсутствует.ДатаДокумента и датадокумента — это разные свойства).Рассмотрим конкретный пример из практики. В коде формирования правил конвертации объектов (ПКО) часто допускаются ошибки при программном добавлении свойств. Для предотвращения подобных дефектов полезно проводить регулярный анализ расширений и конфигураций на наличие ошибок. Проанализируем фрагмент кода, который вызвал затруднение:
Процедура ДобавитьПКО_Документ_Фасовка_Получение(ПравилаКонвертации)
ПравилоКонвертации = ОбменДаннымиXDTOСервер.ИнициализироватьПравилоКонвертацииОбъекта(ПравилаКонвертации);
// ... настройки заголовка правила ...
СвойстваТЧ = ДобавитьПКТЧ(ПравилаКонвертации, "Запасы", "");
ДобавитьПКС(СвойстваТЧ, "ЕденицаИзмеренияТовара", "", 1, "Справочник_ЕдиницыИзмерения");
ДобавитьПКС(СвойстваТЧ, "КоличествоТовара", "", );
КонецПроцедуры
Внимательно посмотрим на строку добавления свойства ЕденицаИзмеренияТовара. Здесь допущена классическая орфографическая ошибка. Если в XDTO-пакете свойство называется ЕдиницаИзмеренияТовара (через «и»), то валидатор выдаст ошибку «Отсутствует обязательное свойство», так как он ищет «Единицу», а получает «Еденицу».
Совет: Всегда копируйте имена свойств непосредственно из дерева свойств XDTO-пакета в конфигураторе, чтобы избежать подобных ошибок.
Если данные могут отсутствовать по бизнес-логике, необходимо правильно настроить свойства в XDTO-пакете. Выясним разницу между параметрами, влияющими на валидацию:
xsi:nil="true". Это используется, когда важно передать сам факт отсутствия значения (аналог NULL в базах данных).Разберем, как это применить. Откроем пакет XDTO, найдем нужный тип объекта и в свойствах элемента установим Минимальное количество = 0. Это позволит системе игнорировать отсутствие данных при загрузке и не прерывать процесс обмена ошибкой.
Иногда визуально данные выглядят верно, но ошибка сохраняется. Рассмотрим ситуацию с «похожими» буквами. В практике 1С часто встречаются проблемы, когда в номере счета или наименовании вместо русской «К» стоит английская «K». Для XDTO-сериализатора, если свойство является частью уникального ключа или перечисления, это разные значения.
Также проанализируем проблему непечатных символов. Если данные копируются из внешних источников, можно применить модуль «Трансформер» для конвертации данных из JSON/XML/CSV, который позволяет нормализовать входящие строки. В строки могут попасть:
nbsp).В таких случаях рекомендуется использовать функцию СокрЛП() и очистку строк от спецсимволов перед выгрузкой в XDTO-объект.
Чтобы точно выяснить, на каком этапе происходит сбой, воспользуемся методами программной проверки. Чтобы визуально сопоставить эталонный файл с тем, что генерирует ваша база, используйте инструмент для сравнения XML-документов. В платформе 1С объект ОбъектXDTO имеет встроенный метод Проверить(). Рассмотрим, как применить его для диагностики:
// Предположим, у нас есть сформированный объект XDTO перед отправкой
Попытка
ДанныеОбъектаXDTO.Проверить();
Исключение
// Если проверка не прошла, мы можем получить детальное описание
Сообщить("Ошибка валидации: " + КраткоеПредставлениеОшибки(ИнформацияОбОшибке()));
// Здесь можно проанализировать структуру через дерево свойств
КонецПопытки
Метод Проверить() возвращает Истина, если структура соответствует схеме. Если возвращается Ложь, это сигнал о том, что обязательные поля не заполнены или типы данных не соответствуют описанным в пакете (например, передана строка вместо числа).
При использовании расширений для изменения обмена данными важно помнить о приоритетах. Если конфигурации-источники и приемники различаются, эффективным решением станет адаптивная выгрузка и загрузка данных XML (поможет универсальный перенос данных между измененными конфигурациями), которая позволяет нивелировать разницу в структурах. Если же вы добавили изменения в XDTO-пакет внутри расширения, убедитесь, что:
minOccurs вступили в силу.Таким образом, для устранения ошибки несоответствия типа в XDTO необходимо действовать последовательно: проверить корректность написания имен свойств в коде и схеме, убедиться в правильности типов данных и, при необходимости, снизить строгость валидации, установив Минимальное количество = 0 в свойствах пакета.