При настройке обмена данными между конфигурациями 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С (УНФ, БП, ERP) одновременно сосуществует множество версий формата EnterpriseData. Пакеты называются примерно так: EnterpriseData_1_15_1, EnterpriseData_1_8_2 и так далее. Ошибка часто возникает из-за того, что программист правит самый новый пакет, а обмен настроен на использование старой версии.
Чтобы понять, какой пакет использовать, выполним следующие действия:
EnterpriseData_1_15_1).Разберем пример структуры XML в пакете. Если мы видим такой код:
<xs:element name="ДоляСтоимости" type="xs:int"/>
Его необходимо заменить на xs:decimal или xs:double, чтобы разрешить дробную часть.
Проанализируем вкладку Фасеты в редакторе XDTO-пакета для выбранного свойства. Даже если тип изменен на decimal, в фасетах может остаться жесткое ограничение Число дробных цифр (FractionDigits).
Выполним следующие исправления:
ДоляСтоимости в иерархии объектов XDTO (обычно это часть типа СпецификацияНоменклатуры.Товары).decimal (из пространства имен http://www.w3.org/2001/XMLSchema).Если в вашей информационной базе используются расширения, ситуация усложняется. Проанализируем список расширений: если пакет EnterpriseData был заимствован в расширение, то изменения в основной конфигурации не будут иметь силы. Система всегда отдает приоритет метаданным из расширения.
Проверим расширения по следующему алгоритму:
Часто бывает так: тип исправлен, конфигурация обновлена, но ошибка повторяется. Это происходит из-за агрессивного кэширования фабрики XDTO сервером приложений 1С. Сервер «помнит» старую структуру схемы и продолжает валидировать данные по ней.
Разберем способы решения этой проблемы:
Агент сервера 1С:Предприятия.snacc и других временных файлов в каталоге сеансовых данных сервера.Если правка XDTO-пакета не помогла, проанализируем общий модуль МенеджерОбменаЧерезУниверсальныйФормат (или аналогичный в вашей конфигурации). Иногда в коде перед выгрузкой данных в XDTO-объект происходит явное приведение типов.
Посмотрим на пример кода, который может вызывать проблему:
Процедура ПКО_Справочник_СпецификацииНоменклатуры_Товары_Отправка(ДанныеИБ, ДанныеXDTO, КомпонентыОбмена)
// Ошибочный вариант: принудительное приведение к целому числу
ДанныеXDTO.ДоляСтоимости = Цел(ДанныеИБ.ДоляСтоимости);
// Правильный вариант: передача дробного значения
ДанныеXDTO.ДоляСтоимости = ДанныеИБ.ДоляСтоимости;
КонецПроцедуры
Если в коде стоит Цел(), то даже при правильной XDTO-схеме вы будете терять данные, а если схема ожидает int, а вы передаете дробь через ДанныеXDTO — получите ошибку валидации.
Не забываем, что обмен — это двусторонний процесс. Если вы включили «Проверку данных перед отправкой» или если база-приемник выполняет валидацию входящего сообщения, пакеты XDTO должны быть идентичны в обеих конфигурациях. Если в УНФ вы разрешили дробные числа, а в БП (Бухгалтерии предприятия) пакет остался старым, то ошибка возникнет на стороне приемника при попытке прочитать файл.
Посмотрим, как обеспечить идентичность:
.xsd.Устранение ошибок FractionDigits требует комплексного подхода. Мы выяснили, что просто изменить тип данных в первом попавшемся пакете XDTO недостаточно. Необходимо четко определить используемую версию формата EnterpriseData, проверить наличие расширений, убедиться в отсутствии принудительного округления в программном коде менеджера обмена и, самое главное, не забыть очистить серверный кэш, чтобы изменения вступили в силу. Соблюдение этой последовательности действий гарантирует успешную выгрузку данных без ошибок валидации.