Как исправить ошибку XDTO Несоответствие фасету FractionDigits = 0 при обмене данными

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

При настройке обмена данными между конфигурациями 1С (например, из сильно модифицированной 1С:УНФ в 1С:Бухгалтерию) через универсальный формат EnterpriseData разработчики часто сталкиваются с ошибками валидации XDTO. Одна из самых коварных ошибок — несоответствие значения фасету FractionDigits. Рассмотрим ситуацию, когда система выдает ошибку: Значение '244.22' не соответствует простому типу: {http://www.w3.org/2001/XMLSchema}int. Несоответствие фасету FractionDigits = '0'.

Это сообщение означает, что в пакете XDTO, который описывает структуру передаваемого сообщения, для конкретного свойства (в нашем примере — ДоляСтоимости) установлен тип «целое число» (int), в то время как программный код пытается передать число с плавающей точкой. Давайте подробно разберем, как локализовать и устранить эту проблему, пройдя по всем этапам: от поиска нужного пакета до очистки серверного кэша.

Анализ причины возникновения ошибки

Первым делом проанализируем текст ошибки. Система четко указывает на объект и свойство: Справочник_СпецификацииНоменклатуры_Отправка и поле ДоляСтоимости. Несмотря на то что в самой базе данных (в метаданных справочника) это поле может иметь точность 2 знака, в схеме обмена оно задекларировано как int (целое число). Фасет FractionDigits = 0 — это жесткое ограничение XML-схемы, которое запрещает наличие любых цифр после запятой.

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

Шаг 1. Определение правильной версии пакета EnterpriseData

В современных конфигурациях 1С (УНФ, БП, ERP) одновременно сосуществует множество версий формата EnterpriseData. Пакеты называются примерно так: EnterpriseData_1_15_1, EnterpriseData_1_8_2 и так далее. Ошибка часто возникает из-за того, что программист правит самый новый пакет, а обмен настроен на использование старой версии.

Чтобы понять, какой пакет использовать, выполним следующие действия:

  1. Перейдем в раздел Администрирование — Синхронизация данных — Настройки синхронизации.
  2. Откроем параметры нашего обмена и найдем используемую версию формата (например, 1.15).
  3. В конфигураторе найдем соответствующий пакет XDTO (например, EnterpriseData_1_15_1).

Разберем пример структуры XML в пакете. Если мы видим такой код:

<xs:element name="ДоляСтоимости" type="xs:int"/>

Его необходимо заменить на xs:decimal или xs:double, чтобы разрешить дробную часть.

Шаг 2. Корректировка типов и фасетов в XDTO-пакете

Проанализируем вкладку Фасеты в редакторе XDTO-пакета для выбранного свойства. Даже если тип изменен на decimal, в фасетах может остаться жесткое ограничение Число дробных цифр (FractionDigits).

Выполним следующие исправления:

  1. Найдем свойство ДоляСтоимости в иерархии объектов XDTO (обычно это часть типа СпецификацияНоменклатуры.Товары).
  2. Установим тип decimal (из пространства имен http://www.w3.org/2001/XMLSchema).
  3. Перейдем на закладку Фасеты и убедимся, что параметр Число дробных цифр либо пуст, либо равен значению 2 или более.

Шаг 3. Влияние расширений конфигурации

Если в вашей информационной базе используются расширения, ситуация усложняется. Проанализируем список расширений: если пакет EnterpriseData был заимствован в расширение, то изменения в основной конфигурации не будут иметь силы. Система всегда отдает приоритет метаданным из расширения.

Проверим расширения по следующему алгоритму:

Шаг 4. Очистка серверного кэша и перезапуск фабрики XDTO

Часто бывает так: тип исправлен, конфигурация обновлена, но ошибка повторяется. Это происходит из-за агрессивного кэширования фабрики XDTO сервером приложений 1С. Сервер «помнит» старую структуру схемы и продолжает валидировать данные по ней.

Разберем способы решения этой проблемы:

  1. Перезапуск службы 1С: Самый надежный способ — перезагрузить службу Агент сервера 1С:Предприятия.
  2. Очистка серверного кэша: Удаление папки snacc и других временных файлов в каталоге сеансовых данных сервера.
  3. Программный сброс: В некоторых случаях помогает выполнение кода, инициализирующего фабрику XDTO заново, но на практике перезапуск службы эффективнее.

Шаг 5. Проверка кода в Менеджере обмена

Если правка XDTO-пакета не помогла, проанализируем общий модуль МенеджерОбменаЧерезУниверсальныйФормат (или аналогичный в вашей конфигурации). Иногда в коде перед выгрузкой данных в XDTO-объект происходит явное приведение типов.

Посмотрим на пример кода, который может вызывать проблему:


Процедура ПКО_Справочник_СпецификацииНоменклатуры_Товары_Отправка(ДанныеИБ, ДанныеXDTO, КомпонентыОбмена)
    // Ошибочный вариант: принудительное приведение к целому числу
    ДанныеXDTO.ДоляСтоимости = Цел(ДанныеИБ.ДоляСтоимости); 
    
    // Правильный вариант: передача дробного значения
    ДанныеXDTO.ДоляСтоимости = ДанныеИБ.ДоляСтоимости;
КонецПроцедуры

Если в коде стоит Цел(), то даже при правильной XDTO-схеме вы будете терять данные, а если схема ожидает int, а вы передаете дробь через ДанныеXDTO — получите ошибку валидации.

Шаг 6. Синхронизация схем в обеих базах

Не забываем, что обмен — это двусторонний процесс. Если вы включили «Проверку данных перед отправкой» или если база-приемник выполняет валидацию входящего сообщения, пакеты XDTO должны быть идентичны в обеих конфигурациях. Если в УНФ вы разрешили дробные числа, а в БП (Бухгалтерии предприятия) пакет остался старым, то ошибка возникнет на стороне приемника при попытке прочитать файл.

Посмотрим, как обеспечить идентичность:

  1. Выгрузим исправленный XDTO-пакет из УНФ в файл .xsd.
  2. Загрузим этот файл в базу БП (если она тоже «перепилена») или внесем аналогичные правки вручную в конфигураторе БП.
  3. Убедимся, что версии форматов в настройках синхронизации в обеих базах совпадают.

Итоги

Устранение ошибок FractionDigits требует комплексного подхода. Мы выяснили, что просто изменить тип данных в первом попавшемся пакете XDTO недостаточно. Необходимо четко определить используемую версию формата EnterpriseData, проверить наличие расширений, убедиться в отсутствии принудительного округления в программном коде менеджера обмена и, самое главное, не забыть очистить серверный кэш, чтобы изменения вступили в силу. Соблюдение этой последовательности действий гарантирует успешную выгрузку данных без ошибок валидации.

← На главную