Синхронизация данных между конфигурациями «1С:Управление торговлей» (УТ 11) и «1С:Бухгалтерия предприятия» (БП 3.0) по универсальному формату EnterpriseData — это мощный, но порой капризный инструмент. В процессе его работы специалисты часто сталкиваются со специфическими ошибками XDTO-валидации. Одна из самых распространенных и труднодиагностируемых ошибок связана с выгрузкой договоров контрагентов.
В этой статье мы подробно разберем, почему возникает ошибка Ошибка проверки данных XDTO: Структура объекта '/КлючевыеСвойства' не соответствует типу... Не установлено значение одного из следующих свойств: Контрагент, как устроен механизм генерации «виртуальных договоров» в 1С и как быстро локализовать и устранить эту проблему на практическом примере.
Для начала проанализируем архитектурное различие двух конфигураций. В управленческих базах данных (УТ 11, КА 2, ERP) учет взаиморасчетов можно вести максимально гибко: в разрезе заказов, накладных или соглашений, вообще не создавая карточки договоров в справочнике. Более того, при розничных продажах и эквайринговых операциях договоры с конечными покупателями физически отсутствуют.
Однако в «1С:Бухгалтерии предприятия» правила ведения учета жесткие: проводки по счетам расчетов (например, 62.01, 62.02, 57.03, 76.05) в обязательном порядке требуют заполнения аналитического разреза (субконто) Договоры.
Чтобы подружить эти две системы, разработчики фирмы 1С внедрили в модуль МенеджерСинхронизацииЧерезУниверсальныйФормат специальный программный алгоритм. Когда система выгружает документ, в котором по правилам УТ договора нет (или это розничный документ ОРП), код выгрузки «на лету» генерирует так называемый «Виртуальный договор»:
ВиртуальныйДоговор.Справочник_ДоговорыКонтрагентов_ИзСтруктуры.Согласно схеме XDTO для объекта КлючевыеСвойстваДоговор, свойства Контрагент и ВалютаВзаиморасчетов являются строго обязательными (mandatory). Если хотя бы одно из этих полей не заполнено, XML-файл не пройдет проверку схемы.
При попытке выполнить выгрузку платформа выполняет метод проверки:
ОбъектXDTO.Проверить();
Если валидатор видит пустое обязательное поле, он моментально прерывает выгрузку всего пакета данных с ошибкой, которую мы рассматриваем.
Выясним причину, по которой обязательные свойства виртуального договора могут оказаться пустыми. Очень часто это происходит из-за повреждения целостности данных, например, при некорректной работе распределенных информационных баз (РИБ).
Рассмотрим конкретный сценарий: в документе Отчет о розничных продажах (ОРП) на вкладке «Оплата платежными картами» указан эквайринговый терминал. Этот терминал был создан в периферийной базе РИБ, но по какой-то причине транзакция его переноса в главный узел не завершилась или объект был удален в центре. В результате в документе ОРП в главном узле поле терминала превращается в битую ссылку — <Объект не найден...>.
При выгрузке этого ОРП система пытается собрать данные для виртуального договора с банком-эквайером:
Терминал.Договор.Контрагент.Неопределено или NULL.Аналогичная проблема может возникнуть, если сам терминал заполнен корректно, но в его карточке не выбран договор обслуживания или у этого договора не указана валюта.
Если ваша база содержит десятки тысяч документов, а сеанс обмена длится несколько часов, искать ошибку обычным отладчиком крайне тяжело. Разберем по шагам, как быстро локализовать проблемный объект.
Прежде всего, ограничим область поиска. Перейдем в обработку «Регистрация изменений для обмена данными» для нашего узла Бухгалтерии. Обратим особое внимание на документы, которые стоят в очереди на отправку:
Отчет о розничных продажахЭквайринговая операцияПриобретение товаров и услугРеализация товаров и услугПроблема гарантированно кроется в одном из этих документов или связанных с ними справочников.
Вместо долгого перебора документов вручную воспользуемся консолью запросов в базе-источнике (УТ). Напишем запрос, который мгновенно выявит документы ОРП, содержащие невалидные ссылки на эквайринговые терминалы в табличной части платежей:
ВЫБРАТЬ
ОРП.Ссылка КАК ДокументСсылка,
ОРП.Номер КАК НомерДокумента,
ОРП.Дата КАК ДатаДокумента,
ТЧ_Оплата.ЭквайринговыйТерминал КАК ПроблемныйТерминал
ИЗ
Документ.ОтчетОРозничныхПродажах КАК ОРП
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ОтчетОРозничныхПродажах.ОплатаПлатежнымиКартами КАК ТЧ_Оплата
ПО ОРП.Ссылка = ТЧ_Оплата.Ссылка
ГДЕ
ТЧ_Оплата.ЭквайринговыйТерминал.ВерсияДанных ЕСТЬ NULL
И НЕ ТЧ_Оплата.ЭквайринговыйТерминал = ЗНАЧЕНИЕ(Справочник.ЭквайринговыеТерминалы.ПустаяСсылка)
Важное примечание: обращение к реквизиту ВерсияДанных через точку у «битой» ссылки всегда возвращает NULL. Этот изящный прием позволяет за доли секунды просканировать миллионы строк документов и вывести только дефектные записи.
Если запрос ничего не вернул, воспользуемся стандартной обработкой «Выгрузка загрузка данных EnterpriseData» (ее можно найти на диске ИТС или в функциях для технического специалиста):
После того как проблемный документ (или справочник) локализован, выполним его исправление одним из следующих способов:
Если эквайринговый терминал (или договор) действительно остался в периферийной базе и отсутствует в центральной:
<Объект не найден...> автоматически заменится на нормальное представление объекта.Если восстановить исходный элемент справочника невозможно, откроем сбойный документ (например, Отчет о розничных продажах):
Если битых ссылок нет, но ошибка все равно возникает, проверим заполнение реквизитов самого терминала:
Договор.Контрагент (банк-эквайер) и Валюта взаиморасчетов (например, руб.).После устранения всех несоответствий в данных запустим повторный обмен. Выгрузка пройдет успешно и без ошибок валидации XDTO.