Работа с механизмами XDTO (XML Data Transfer Objects) в 1С:Предприятии — это мощный инструмент для интеграции, но он требует строгого соблюдения правил, описанных в XML-схемах (XSD). Одной из наиболее распространенных и при этом раздражающих ошибок является сообщение: «Значение не соответствует простому типу: Несоответствие фасету Length». В этой статье мы подробно разберем, почему возникает эта ошибка, как работать с анонимными типами (которые 1С называет «Определением типа») и как правильно настраивать пакеты XDTO, чтобы избежать подобных проблем в будущем.
Давайте проанализируем ситуацию, описанную в теме. При попытке выгрузки данных система выдает ошибку: Значение: '1' не соответствует простому типу: Несоответствие фасету Length = '12'. Что это означает на практике? Фасеты — это ограничения, накладываемые на простые типы данных в XML-схеме.
Разберем подробнее наиболее часто используемые фасеты:
Length.collapse, платформа 1С может автоматически удалять лишние пробелы, что иногда неявно меняет длину строки и приводит к ошибке Length.Выясним причину в нашем случае: автор пытался передать значение «1» в поле, где ожидалось ровно 12 символов. Это классическая ситуация при работе с банковскими идентификаторами или специфическими кодами (например, ИНН, БИК, ISIN).
Часто в пакетах XDTO мы видим свойства, у которых в колонке «Тип» стоит не ссылка на другой объект или стандартный тип (например, string), а указано «Определение типа». В терминах XML Schema это называется анонимным типом.
Проанализируем, почему отладчик 1С часто показывает Неопределено для таких типов. Проблема в том, что у анонимного типа нет глобального имени в рамках пакета XDTO. Он определен локально внутри конкретного свойства объекта. Чтобы программно работать с такими объектами, мы не можем просто вызвать ФабрикаXDTO.Тип(), так как нам нечего передать в качестве имени типа.
Рассмотрим правильный способ создания объекта для свойства с анонимным типом. Вместо поиска типа по имени, мы должны обратиться к самому свойству родительского объекта:
// Получаем тип родительского объекта
ТипОбъектаАктив = ФабрикаXDTO.Тип("http://www.example.com/myschema", "ТипАктив");
// Создаем сам объект
ОбъектАктив = ФабрикаXDTO.Создать(ТипОбъектаАктив);
// Если свойство "ISIN" имеет анонимное "Определение типа",
// мы можем получить его тип прямо из описания свойства
СвойствоISIN = ТипОбъектаАктив.Свойства.Получить("ISIN");
ТипСвойстваISIN = СвойствоISIN.Тип;
// Теперь мы знаем тип и можем корректно присвоить значение
ОбъектАктив.ISIN = "123456789012"; // Должно быть ровно 12 символов
Посмотрим на важный нюанс, упомянутый в обсуждении: при импорте XSD-файла в конфигурацию 1С базовые типы могут «слететь». Это происходит по нескольким причинам:
xs:import или xs:include), к которым у платформы нет доступа в момент импорта.Если базовый тип (например, xs:string) не подтянулся, свойство в пакете XDTO становится «пустым» или некорректно типизированным. В этом случае 1С не знает, как сериализовать данные, и выдает ошибку. Решение здесь только одно: ручное восстановление. Проверьте каждое свойство в пакете XDTO и убедитесь, что у него назначен правильный базовый тип или ссылка на другой тип из пакета.
Чтобы программа не завершалась аварийно в момент записи XML, мы рекомендуем использовать встроенные средства валидации. Метод Проверить() позволяет выявить ошибки до начала формирования файла.
Разберем пример кода для валидации объекта XDTO:
// Создаем список для сбора ошибок
СписокОшибок = Новый СписокЗначений;
// Проверяем объект на соответствие схеме (фасетам, обязательности полей и т.д.)
Попытка
ОбъектАктив.Проверить(СписокОшибок);
Если СписокОшибок.Количество() > 0 Тогда
Для Каждого Ошибка Из СписокОшибок Цикл
Сообщить("Найдена ошибка валидации: " + Ошибка.Значение);
КонецЦикла;
Иначе
Сообщить("Объект успешно прошел валидацию");
КонецЕсли;
Исключение
Сообщить("Критическая ошибка при проверке: " + ОписаниеОшибки());
КонецПопытки;
Этот метод покажет вам конкретное имя свойства, которое вызвало проблему, и укажет на нарушенный фасет (например, тот самый Length). При наличии готового файла для его быстрой валидации без написания кода подойдёт обработка для проверки файлов XML на соответствие схеме XSD или пакету XDTO.
Если вы столкнулись с ошибкой несоответствия длины, проанализируйте ситуацию и выберите один из следующих путей решения:
СокрЛП(). Если требуется фиксированная длина, а входящая строка короче, возможно, ее нужно дополнить ведущими нулями (но только если это предусмотрено бизнес-логикой).Length на MaxLength. Это позволит передавать строки короче указанного лимита, что решит проблему с ошибкой.Важный момент: В некоторых версиях платформы 8.3 наблюдались особенности работы с числовыми данными, описанными как строки. Всегда проверяйте, чтобы в строковых значениях не было спецсимволов XML (например, &), которые при определенных условиях могли влиять на расчет длины платформой. Современные релизы лишены этой проблемы, но использование СокрЛП() остается «золотым стандартом» при подготовке данных для XDTO.
Подводя итог, можно сказать, что работа с XDTO требует внимательности к деталям. Ошибка фасета Length — это не сбой системы, а сигнал о том, что ваши данные не соответствуют строгому контракту обмена. Используя метод Проверить() и правильно работая с определениями типов, вы сможете создавать надежные механизмы обмена данными.