Как исправить ошибку несоответствия фасету перечисления XDTO при заполнении электронных документов?

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

При работе с подсистемой электронного документооборота (ЭДО) в конфигурациях на платформе 1С:Предприятие 8.3 программисты часто сталкиваются с ошибками валидации XDTO. Одна из самых коварных ошибок — "Значение не соответствует значениям фасета перечисления". В этом материале мы подробно разберем, почему возникает эта ошибка при вызове метода Установить, и как найти решение, когда визуально данные кажутся верными.

Суть проблемы и механизм ошибки

Рассмотрим ситуацию: в процессе выполнения операции "Заполнение XDTO" в общем модуле ЭлектронныеДокументыВнутренний происходит аварийная остановка. Система сообщает о несоответствии типов. Ошибка указывает на конкретное свойство, например, Name, и значение, которое не проходит проверку — ExpInvoiceAndPrimaryAccountingDocumentCustomer.

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

Шаг 1. Диагностика невидимых символов

Выясним причину, по которой визуально корректная строка отвергается механизмом XDTO. Одной из самых частых причин является наличие невидимых символов (пробелов, переносов строк или неразрывных пробелов NBSP с кодом 160). Если значение было получено путем копирования или программной склейки, оно может содержать "мусор".

Для проверки рекомендуется в режиме отладки вычислить длину строки и сравнить её с эталоном. Воспользуемся табло отладчика:


// Проверим длину значения в символах
СтрДлина(Значение); 

// Проверим наличие неразрывных пробелов
СтрНайти(Значение, Символы.НПП); 

Если длина строки ExpInvoiceAndPrimaryAccountingDocumentCustomer отличается от ожидаемых 46 символов, значит, в строке есть лишние знаки. В таком случае перед установкой значения в объект XDTO необходимо применить функцию СокрЛП() или очистить строку от спецсимволов.

Шаг 2. Проверка соответствия версий XDTO-пакетов

Разберем ситуацию, когда строка идеально чистая, но ошибка сохраняется. Значение ExpInvoiceAndPrimaryAccountingDocumentCustomer (Счет-фактура и первичный документ в статусе покупателя) появилось в форматах ЭДО относительно недавно. Если ваша конфигурация или Библиотека электронных документов (БЭД) давно не обновлялись, в используемом XDTO-пакете этого значения просто может не быть в списке допустимых.

Проанализируем структуру пакета. Выполните следующие действия:

  1. Откройте конфигуратор и найдите XDTO-пакет, относящийся к ЭДО (например, RemoteSign или пакеты, связанные с форматами ФНС).
  2. Найдите тип объекта и свойство Name.
  3. Перейдите в список фасетов этого типа.

Если в списке доступных значений enumeration отсутствует требуемая строка, это означает, что метаданные конфигурации устарели. В этом случае необходимо обновить конфигурацию до актуального релиза или установить соответствующие патчи от фирмы "1С", которые обновляют схемы XDTO. Если оперативно обновить систему невозможно, для формирования корректных XML по актуальным форматам можно использовать инструмент для выгрузки и загрузки файлов ЭДО по приказам ФНС.

Шаг 3. Регистрация и пространство имен (Namespace)

Иногда проблема кроется в том, что ОбъектXDTO создан на основе одного типа, а логика программы пытается работать с ним, как с другим. Рассмотрим подробнее, как проверить тип свойства программно:


ТипСвойства = ОбъектXDTO.Свойства().Получить("Name").Тип;
Сообщить(ТипСвойства.Имя);
Сообщить(ТипСвойства.ПространствоИмен);

Если пространство имен (Namespace) типа не соответствует ожидаемому формату (например, вы пытаетесь отправить данные УПД 5.01 в схему версии 5.02), проверка фасетов не будет пройдена. Убедитесь, что при создании объекта XDTO используется верный фабричный метод и соответствующий тип из нужного пакета.

Шаг 4. Анализ типизации значения

Посмотрим на типичную ошибку при передаче данных. Хотя в отладчике мы видим "строку", метод Установить ожидает строгого соответствия. Если свойство Name определено не как стандартная строка string (http://www.w3.org/2001/XMLSchema), а как пользовательский тип (SimpleType) с перечислениями, то любая опечатка в регистре символов приведет к сбою.

Важный момент: XDTO чувствителен к регистру. Значения ExpInvoice... и expinvoice... для платформы являются абсолютно разными. Проверьте, не происходит ли в вашем коде непреднамеренного преобразования регистра функциями НРег() или ВРег().

Итоги и рекомендации

Подводя итог, если вы столкнулись с проблемой фасетов при заполнении XDTO, следуйте этому алгоритму:

  1. Очистите данные: всегда используйте СокрЛП() перед установкой строковых свойств в XDTO.
  2. Сравните длину: убедитесь, что количество символов совпадает с ожидаемым.
  3. Проверьте пакет: убедитесь, что в конфигурации присутствует XDTO-пакет нужной версии и в нем прописано используемое значение.
  4. Обновите БЭД: при использовании ЭДО критически важно поддерживать актуальность библиотек, так как форматы обмена с ФНС меняются регулярно.

Применяя эти шаги, мы сможем оперативно локализовать причину несоответствия типов и восстановить работоспособность механизмов электронного документооборота.

← На главную