При работе с механизмом Синхронизации данных через универсальный формат (EnterpriseData) в конфигурациях на базе 1С:ERP или Комплексная автоматизация (КА) 2.4 часто возникают ошибки валидации XDTO. Эти ошибки проявляются в Журнале регистрации сообщениями вида: Структура объекта не соответствует типу или Отсутствует обязательное свойство. Ситуация осложняется тем, что в самой базе 1С данные могут выглядеть корректно заполненными, но механизм обмена все равно отказывается их принимать. В этой статье мы подробно разберем причины возникновения таких ошибок и методику их устранения.
Рассмотрим ситуацию, когда при выгрузке данных, связанных с денежными средствами или банковскими счетами, возникает ошибка: Структура объекта '/ВалютаДенежныхСредств' не соответствует типу... Проверка свойства 'Код': Отсутствует обязательное свойство. На первый взгляд это кажется странным, так как в справочнике Валюты код (например, «643» для рубля) заполнен.
Проанализируем причину. В формате EnterpriseData (особенно версии 1.5 и выше) для типа КлючевыеСвойстваВалюта обязательным является не внутренний код справочника 1С, а цифровой код валюты по Общероссийскому классификатору валют (ОКВ). Если карточка валюты была создана вручную без привязки к классификатору или если в ней повреждены параметры прописи, XDTO-пакет не может извлечь код для формирования XML-структуры.
Для решения этой проблемы выполним следующие действия:
Валюты и найдем элемент, на который ругается система (например, Рубль).ПараметрыПрописи заполнен корректно, так как некоторые версии правил обмена обращаются к ним для получения метаданных.Другой распространенный случай — ошибка в объекте ДоговорыКонтрагентов: Не установлено значение одного из следующих свойств: Контрагент. При этом пользователь видит, что в 1С контрагент в договоре указан. Почему же механизм обмена его «не видит»?
Выясним причину. В формате EnterpriseData объект «Договор» содержит в себе структуру КлючевыеСвойства, куда входят ключевые свойства Контрагента (ИНН, КПП, Наименование, Юридическое/Физическое лицо). Если при формировании выгрузки система не может собрать «ключевые свойства» владельца договора, она оставляет поле Контрагент пустым в XDTO-объекте. Это происходит в следующих случаях:
Контрагент договора записана ссылка на объект, который был удален или помечен на удаление (объект не найден).Рассмотрим, как это исправить. Необходимо проверить карточку контрагента, указанного в «проблемном» договоре. Убедимся, что заполнены все обязательные для обмена поля: ИНН, Наименование и Вид контрагента. Если данные заполнены, попробуйте перевыбрать контрагента в договоре и переписать объект.
Если визуальная проверка данных не помогает, проанализируем ситуацию программно. Для этого нам понадобится внешняя обработка Выгрузка загрузка данных EnterpriseData (она обычно входит в состав дистрибутива конфигурации или библиотеки стандартных подсистем).
Рассмотрим алгоритм отладки по шагам:
Выгрузка загрузка EnterpriseData.ОбменДаннымиXDTOСервер в методе Проверить().Типовой код, в котором происходит сбой, выглядит так:
// В общем модуле ОбменДаннымиXDTOСервер
Попытка
ОбъектXDTO.Проверить();
Исключение
Инфо = ИнформацияОбОшибке();
// Здесь мы можем проинспектировать переменную ОбъектXDTO
ЗаписатьЛогОшибки(ПодробноеОписаниеОшибки(Инфо));
КонецПопытки;
Когда выполнение программы остановится на точке останова, мы сможем исследовать содержимое переменной ОбъектXDTO. Развернем структуру объекта и посмотрим, какие свойства заполнены, а какие — нет. Если в узле /КлючевыеСвойства/ВалютаВзаиморасчетов отсутствует поле Код, значит, проблема именно в данных справочника Валюты.
При выгрузке справочника БанковскиеСчетаКонтрагентов (или организаций) часто возникает аналогичная ошибка по свойству ВалютаДенежныхСредств. Посмотрим на структуру XDTO для банковского счета. В ней валюта является обязательным реквизитом.
Иногда в старых версиях конфигураций Комплексная автоматизация или Управление торговлей банковские счета могли создаваться программно без явного указания валюты (подразумевалось, что валюта счета определяется по умолчанию). Однако для универсального обмена это недопустимо. Если вы столкнулись с ошибкой в банковском счете, проверьте реквизит Валюта непосредственно в базе данных через «Консоль запросов» или «Редактирование реквизитов», так как на форме он может подставляться автоматически, а в самой таблице базы данных быть пустым (NULL или пустая ссылка).
Подводя итог, проанализируем основные контрольные точки для успешной выгрузки без ошибок XDTO:
1. Актуальность классификаторов. Убедимся, что все используемые валюты загружены из актуального классификатора ОКВ. Это гарантирует наличие правильных цифровых и буквенных кодов ISO, которые требует формат EnterpriseData.
2. Чистота данных контрагентов. Договоры не будут выгружаться, если у их владельцев (контрагентов) отсутствуют ИНН или некорректно указан юридический статус. Рекомендуем использовать сервис «1С:Контрагент» для автоматического заполнения реквизитов.
3. Соответствие версий формата. Если одна база (например, Бухгалтерия) обновлена до последней версии, а КА — нет, может возникнуть ситуация, когда одна сторона требует свойства, которые другая еще не умеет выгружать. Всегда проверяйте совместимость версий формата EnterpriseData (1.5, 1.6, 1.10 и т.д.) в настройках синхронизации.
4. Перерегистрация объектов. Иногда после исправления данных в справочниках ошибка сохраняется, так как в «Таблице регистрации изменений» завис старый образ объекта. Попробуйте удалить регистрацию для проблемного объекта и добавить её заново через обработку «Регистрация изменений для обмена».
Соблюдение этих правил и использование методики отладки через XDTO-валидатор позволит быстро локализовать и устранить ошибки обмена, обеспечивая корректную передачу данных между вашими конфигурациями.