Синхронизация данных между конфигурациями 1С:Управление нашей фирмой (УНФ) и 1С:Бухгалтерия предприятия (БП) — один из важнейших процессов для ведения корректного учета. Однако в процессе обмена, особенно через универсальный формат EnterpriseData, пользователи и программисты часто сталкиваются со сложными техническими сбоями. Одна из наиболее запутанных ошибок — это ошибка валидации схемы XDTO, связанная с незаполненными ключевыми свойствами договора контрагента.
В этой статье мы подробно разберем природу данной ошибки, выясним, почему стандартный поиск по уникальному идентификатору (UUID) в базе данных не приносит результатов, и пошагово пройдем процесс локализации и устранения проблемы в вашей информационной базе.
Давайте внимательно изучим текст ошибки, который формируется в журнале регистрации или выводится на экран в момент выполнения обмена данными:
Ошибка проверки данных XDTO: Структура объекта '/КлючевыеСвойства' не соответствует типу... Не установлено значение одного из следующих свойств: Контрагент
Если мы проанализируем цепочку вызовов (стек вызовов) из системного сообщения, то сможем точно восстановить хронологию событий:
ОтчетОРозничныхПродажах (сокращенно — ОРП). На это указывает вызов обработчика: ПКО_Документ_ОтчетОРозничныхПродажах_Отправка_ПриОтправкеДанных.Строка.ДоговорЭквайринга = ДоговорИнструкцияКонвертацииПоДаннымВзаиморасчетов(...).Справочник_ДоговорыКонтрагентов_ИзСтруктуры.ОбъектXDTO.Проверить() в общем модуле ОбменДаннымиXDTOСервер.EnterpriseData. Согласно этой схеме, любой договор (даже созданный на лету) в блоке КлючевыеСвойства обязан содержать заполненное поле Контрагент. Поскольку поле оказывается пустым, система прерывает выгрузку и генерирует исключение.Часто программисты пытаются решить эту проблему «в лоб»: берут из отладчика уникальный идентификатор договора (в нашем примере это 0226b708-ad15-11e0-a28b-001b11b11cf8) и пытаются найти этот элемент в справочнике ДоговорыКонтрагентов с помощью консоли запросов или обработки «Поиск и замена значений». Однако поиск не дает результатов.
Почему так происходит?
Дело в том, что этого договора физически не существует в базе данных УНФ. При выполнении кода в модуле менеджера обмена срабатывает защитный алгоритм: если у транзакции эквайринга в документе не определен договор, система не прерывает работу сразу, а динамически генерирует в оперативной памяти временную структуру «Основной договор» и присваивает ей временный UUID. Эта структура существует только в рамках сеанса выгрузки. Поскольку реального договора нет, реквизит Контрагент у этой виртуальной структуры также остается незаполненным, что и приводит к ошибке при проверке XDTO-схемы.
Таким образом, искать нужно не сам «несуществующий» договор, а первичный документ (или элемент справочника), который спровоцировал создание этой пустой структуры.
Давайте рассмотрим, как исправить эту ошибку, двигаясь от простых пользовательских методов к более сложным инструментам разработчика.
Поскольку ошибка возникает при выгрузке конкретного документа, нам нужно понять, какой именно ОтчетОРозничныхПродажах содержит некорректные данные. Для этого выполним следующие действия:
Отчет о розничных продажах.Если документов слишком много, мы можем воспользоваться консолью запросов, чтобы быстро выявить проблемные документы, у которых в табличной части безналичных оплат допущены ошибки заполнения. Напишем и выполним следующий запрос:
ВЫБРАТЬ
ОРП.Ссылка КАК ДокументСсылка,
ОРП.Дата КАК ДатаДокумента,
ОРП.Номер КАК НомерДокумента,
ОРП_Оплаты.ЭквайринговыйТерминал КАК Терминал,
ОРП_Оплаты.ЭквайринговыйТерминал.Эквайер КАК Эквайер,
ОРП_Оплаты.ЭквайринговыйТерминал.Договор КАК ДоговорТерминала
ИЗ
Документ.ОтчетОРозничныхПродажах КАК ОРП
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ОтчетОРозничныхПродажах.КассоваяСмена КАК ОРП_Оплаты // Или табличная часть безналичных оплат в зависимости от версии УНФ
ПО ОРП_Оплаты.Ссылка = ОРП.Ссылка
ГДЕ
ОРП.Проведен
И (ОРП_Оплаты.ЭквайринговыйТерминал = ЗНАЧЕНИЕ(Справочник.ЭквайринговыеТерминалы.ПустаяСсылка)
ИЛИ ОРП_Оплаты.ЭквайринговыйТерминал.Эквайер = ЗНАЧЕНИЕ(Справочник.Контрагенты.ПустаяСсылка)
ИЛИ ОРП_Оплаты.ЭквайринговыйТерминал.Договор = ЗНАЧЕНИЕ(Справочник.ДоговорыКонтрагентов.ПустаяСсылка))
Этот запрос мгновенно покажет нам документы, в которых безналичная оплата привязана к терминалу с незаполненными реквизитами банка-эквайера или договора.
Чаще всего первопричина кроется в некорректно настроенном справочнике ЭквайринговыеТерминалы. Давайте проверим его:
Даже если договор в терминале выбран, система может «забраковать» его при выгрузке, если он настроен неверно. Давайте проверим карточку договора с банком-эквайером:
После того как вы исправили настройки в справочнике эквайринговых терминалов или договоров, изменения могут не примениться к уже созданным документам автоматически (особенно если данные были закешированы в табличных частях документов). Проведите небольшую ревизию:
Отчет о розничных продажах.Если вышеописанные шаги не помогли оперативно найти виновника, мы можем воспользоваться механизмом отладки. Давайте разберем, как быстро выйти на сбойный объект программным путем:
ОбъектXDTO.Проверить();.ДанныеИБ или Источник (в зависимости от текущего контекста модуля обмена). Там будет содержаться прямая ссылка на конкретный документ ОтчетОРозничныхПродажах, который в данный момент обрабатывается выгрузкой.Чтобы исключить повторение подобных ситуаций, рекомендуется настроить обязательность заполнения реквизитов на уровне платформы или конфигурации:
Отчет о розничных продажах с безналичным типом оплаты, если в терминале не заполнены Эквайер или Договор.Следуя этим системным шагам, мы не только успешно решим текущую проблему с выгрузкой данных, но и повысим общую надежность интеграционных процессов между конфигурациями 1С.