При работе с подсистемой электронного документооборота (ЭДО) в конфигурациях на платформе 1С:Предприятие 8.3 программисты часто сталкиваются с ошибками валидации XDTO. Одна из самых коварных ошибок — "Значение не соответствует значениям фасета перечисления". В этом материале мы подробно разберем, почему возникает эта ошибка при вызове метода Установить, и как найти решение, когда визуально данные кажутся верными.
Рассмотрим ситуацию: в процессе выполнения операции "Заполнение XDTO" в общем модуле ЭлектронныеДокументыВнутренний происходит аварийная остановка. Система сообщает о несоответствии типов. Ошибка указывает на конкретное свойство, например, Name, и значение, которое не проходит проверку — ExpInvoiceAndPrimaryAccountingDocumentCustomer.
Проанализируем причину. В XDTO-пакете для определенных свойств типа "строка" могут быть установлены ограничения — фасеты. Фасет enumeration (перечисление) жестко ограничивает список допустимых строковых значений. Если передаваемая строка не совпадает ни с одним из элементов списка в схеме XML, платформа выбрасывает исключение Ошибка проверки данных XDTO.
Выясним причину, по которой визуально корректная строка отвергается механизмом XDTO. Одной из самых частых причин является наличие невидимых символов (пробелов, переносов строк или неразрывных пробелов NBSP с кодом 160). Если значение было получено путем копирования или программной склейки, оно может содержать "мусор".
Для проверки рекомендуется в режиме отладки вычислить длину строки и сравнить её с эталоном. Воспользуемся табло отладчика:
// Проверим длину значения в символах
СтрДлина(Значение);
// Проверим наличие неразрывных пробелов
СтрНайти(Значение, Символы.НПП);
Если длина строки ExpInvoiceAndPrimaryAccountingDocumentCustomer отличается от ожидаемых 46 символов, значит, в строке есть лишние знаки. В таком случае перед установкой значения в объект XDTO необходимо применить функцию СокрЛП() или очистить строку от спецсимволов.
Разберем ситуацию, когда строка идеально чистая, но ошибка сохраняется. Значение ExpInvoiceAndPrimaryAccountingDocumentCustomer (Счет-фактура и первичный документ в статусе покупателя) появилось в форматах ЭДО относительно недавно. Если ваша конфигурация или Библиотека электронных документов (БЭД) давно не обновлялись, в используемом XDTO-пакете этого значения просто может не быть в списке допустимых.
Проанализируем структуру пакета. Выполните следующие действия:
RemoteSign или пакеты, связанные с форматами ФНС).Name.Если в списке доступных значений enumeration отсутствует требуемая строка, это означает, что метаданные конфигурации устарели. В этом случае необходимо обновить конфигурацию до актуального релиза или установить соответствующие патчи от фирмы "1С", которые обновляют схемы XDTO. Если оперативно обновить систему невозможно, для формирования корректных XML по актуальным форматам можно использовать инструмент для выгрузки и загрузки файлов ЭДО по приказам ФНС.
Иногда проблема кроется в том, что ОбъектXDTO создан на основе одного типа, а логика программы пытается работать с ним, как с другим. Рассмотрим подробнее, как проверить тип свойства программно:
ТипСвойства = ОбъектXDTO.Свойства().Получить("Name").Тип;
Сообщить(ТипСвойства.Имя);
Сообщить(ТипСвойства.ПространствоИмен);
Если пространство имен (Namespace) типа не соответствует ожидаемому формату (например, вы пытаетесь отправить данные УПД 5.01 в схему версии 5.02), проверка фасетов не будет пройдена. Убедитесь, что при создании объекта XDTO используется верный фабричный метод и соответствующий тип из нужного пакета.
Посмотрим на типичную ошибку при передаче данных. Хотя в отладчике мы видим "строку", метод Установить ожидает строгого соответствия. Если свойство Name определено не как стандартная строка string (http://www.w3.org/2001/XMLSchema), а как пользовательский тип (SimpleType) с перечислениями, то любая опечатка в регистре символов приведет к сбою.
Важный момент: XDTO чувствителен к регистру. Значения ExpInvoice... и expinvoice... для платформы являются абсолютно разными. Проверьте, не происходит ли в вашем коде непреднамеренного преобразования регистра функциями НРег() или ВРег().
Подводя итог, если вы столкнулись с проблемой фасетов при заполнении XDTO, следуйте этому алгоритму:
СокрЛП() перед установкой строковых свойств в XDTO.Применяя эти шаги, мы сможем оперативно локализовать причину несоответствия типов и восстановить работоспособность механизмов электронного документооборота.