Как исправить ошибку несоответствия фасету Length при выгрузке XDTO в 1С

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

Работа с механизмами XDTO (XML Data Transfer Objects) в 1С:Предприятии — это мощный инструмент для интеграции, но он требует строгого соблюдения правил, описанных в XML-схемах (XSD). Одной из наиболее распространенных и при этом раздражающих ошибок является сообщение: «Значение не соответствует простому типу: Несоответствие фасету Length». В этой статье мы подробно разберем, почему возникает эта ошибка, как работать с анонимными типами (которые 1С называет «Определением типа») и как правильно настраивать пакеты XDTO, чтобы избежать подобных проблем в будущем.

Суть проблемы: понимание фасетов XDTO

Давайте проанализируем ситуацию, описанную в теме. При попытке выгрузки данных система выдает ошибку: Значение: '1' не соответствует простому типу: Несоответствие фасету Length = '12'. Что это означает на практике? Фасеты — это ограничения, накладываемые на простые типы данных в XML-схеме.

Разберем подробнее наиболее часто используемые фасеты:

  1. Length: Задает строго фиксированную длину строки. Если в схеме указано 12, то строка должна содержать ровно 12 символов. Значение «1» (длина 1) или «1234567890123» (длина 13) мгновенно вызовут ошибку валидации.
  2. MinLength и MaxLength: Эти параметры более гибкие. Если нам нужно разрешить ввод ИНН, который может быть длиной 10 знаков для юридических лиц и 12 знаков для физических лиц, в схеме следует использовать именно эти два параметра вместо жесткого Length.
  3. WhiteSpace: Этот фасет определяет, как обрабатывать пробельные символы (сохранять, заменять или удалять). Если установлено значение 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:string) не подтянулся, свойство в пакете XDTO становится «пустым» или некорректно типизированным. В этом случае 1С не знает, как сериализовать данные, и выдает ошибку. Решение здесь только одно: ручное восстановление. Проверьте каждое свойство в пакете XDTO и убедитесь, что у него назначен правильный базовый тип или ссылка на другой тип из пакета.

Методы проверки данных перед выгрузкой

Чтобы программа не завершалась аварийно в момент записи XML, мы рекомендуем использовать встроенные средства валидации. Метод Проверить() позволяет выявить ошибки до начала формирования файла.

Разберем пример кода для валидации объекта XDTO:


// Создаем список для сбора ошибок
СписокОшибок = Новый СписокЗначений;

// Проверяем объект на соответствие схеме (фасетам, обязательности полей и т.д.)
Попытка
    ОбъектАктив.Проверить(СписокОшибок);
    
    Если СписокОшибок.Количество() > 0 Тогда
        Для Каждого Ошибка Из СписокОшибок Цикл
            Сообщить("Найдена ошибка валидации: " + Ошибка.Значение);
        КонецЦикла;
    Иначе
        Сообщить("Объект успешно прошел валидацию");
    КонецЕсли;
Исключение
    Сообщить("Критическая ошибка при проверке: " + ОписаниеОшибки());
КонецПопытки;

Этот метод покажет вам конкретное имя свойства, которое вызвало проблему, и укажет на нарушенный фасет (например, тот самый Length). При наличии готового файла для его быстрой валидации без написания кода подойдёт обработка для проверки файлов XML на соответствие схеме XSD или пакету XDTO.

Практические советы по исправлению ошибки Length

Если вы столкнулись с ошибкой несоответствия длины, проанализируйте ситуацию и выберите один из следующих путей решения:

  1. Корректировка данных: Если вы передаете ИНН или БИК, убедитесь, что данные очищены от лишних пробелов с помощью функции СокрЛП(). Если требуется фиксированная длина, а входящая строка короче, возможно, ее нужно дополнить ведущими нулями (но только если это предусмотрено бизнес-логикой).
  2. Изменение схемы в 1С: Если вы сами являетесь разработчиком схемы или пакет XDTO находится в вашей конфигурации, измените фасет Length на MaxLength. Это позволит передавать строки короче указанного лимита, что решит проблему с ошибкой.
  3. Использование анонимных типов: Если ошибка возникает в свойстве с «Определением типа», проверьте ограничения именно внутри этого определения. В окне свойств пакета XDTO разверните дерево свойств до нужного элемента и проверьте вкладку ограничений.

Важный момент: В некоторых версиях платформы 8.3 наблюдались особенности работы с числовыми данными, описанными как строки. Всегда проверяйте, чтобы в строковых значениях не было спецсимволов XML (например, &), которые при определенных условиях могли влиять на расчет длины платформой. Современные релизы лишены этой проблемы, но использование СокрЛП() остается «золотым стандартом» при подготовке данных для XDTO.

Подводя итог, можно сказать, что работа с XDTO требует внимательности к деталям. Ошибка фасета Length — это не сбой системы, а сигнал о том, что ваши данные не соответствуют строгому контракту обмена. Используя метод Проверить() и правильно работая с определениями типов, вы сможете создавать надежные механизмы обмена данными.

← На главную