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