Как исправить ошибку «Отсутствует обязательное свойство Контрагент» при обмене данными через XDTO в 1С:ERP

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

При настройке синхронизации данных между конфигурациями 1С (например, ERP и Бухгалтерия предприятия) через формат EnterpriseData пользователи часто сталкиваются с критической ошибкой выгрузки. Система сообщает о несоответствии структуры объекта схеме XDTO, указывая на отсутствие обязательного свойства Контрагент. Рассмотрим детально, почему возникает эта проблема и как ее «вылечить», основываясь на реальном техническом кейсе.

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

Разберем типичный текст ошибки из лога обмена. Система указывает на метод ОбъектXDTO.Проверить. Это означает, что данные в базе 1С физически записаны, но перед отправкой механизм обмена проверяет их на соответствие международному стандарту EnterpriseData. Если какое-то поле в XML-схеме помечено как обязательное, а в объекте 1С оно не заполнено, валидатор блокирует выгрузку всего пакета.

Проанализируем ключевой фрагмент сообщения:

Ошибка проверки данных XDTO: Структура объекта '/РасшифровкаДопРасходов/Строка[41]/ДокументПоступления/ПоступлениеТоваровУслугСсылка' не соответствует типу... Отсутствует обязательное свойство 'Контрагент'

Выясним причину, по которой это происходит. В современных конфигурациях 1С (ERP, КА 2, УТ 11) документ ПриобретениеТоваровУслуг может содержать дополнительные расходы. Когда мы выбираем статью расходов с распределением на себестоимость, система требует указать аналитику. Если в качестве аналитики выбран другой документ поступления, формат обмена требует передать не только уникальный идентификатор (GUID) этого документа, но и его ключевые реквизиты: номер, дату и контрагента. Это необходимо для того, чтобы в приемнике объект мог быть корректно идентифицирован или создан как «объект-пустышка».

Выясняем причину расхождения номеров строк

Часто возникает путаница: в сообщении об ошибке указан индекс строки [41], а в самом документе Приобретение товаров и услуг пользователь видит, например, всего 24 строки. Рассмотрим, почему так происходит:

  1. Объединение табличных частей: При выгрузке в формат XDTO данные из разных таблиц (товары, услуги, доп. расходы) собираются в единую коллекцию. Порядковый номер в XML-файле отражает позицию элемента в этой структуре, а не визуальный номер строки на форме документа.
  2. Автоматическое распределение: Если включена функция автоматического распределения расходов, система может генерировать «виртуальные» строки расшифровки в памяти при выгрузке, что увеличивает их количество.
  3. Скрытые данные: В объекте могут присутствовать служебные строки, которые не отображаются в интерфейсе, но учитываются сериализатором XDTO.

Поэтому при поиске ошибки следует ориентироваться не на номер строки, а на содержимое колонки «Аналитика расходов» в табличной части «Услуги».

Пошаговое решение проблемы: исправление аналитики

Проанализируем ситуацию и выполним следующие действия для исправления документа:

  1. Откроем проблемный документ Приобретение товаров и услуг, указанный в ошибке.
  2. Перейдем на закладку «Услуги» (или «Дополнительные расходы»).
  3. Найдем строки, где заполнена колонка «Статья расходов».
  4. Внимательно изучим колонку «Аналитика расходов». Нам нужно найти строку, в которой выбрана ссылка на другой документ поступления.
  5. Нажмем кнопку открытия (лупу) в поле аналитики. Проверим, заполнен ли Контрагент в том документе, на который мы ссылаемся.

Важный момент: если документ-аналитика заполнен некорректно (например, он был создан программно или через обмен и не содержит контрагента), его необходимо дозаполнить и провести. Если поле Контрагент в нем пустое, XDTO-валидатор выдаст ошибку, так как не сможет сформировать обязательный узел в XML.

Техническое решение для разработчиков (через код)

Если подобных документов много, мы можем проанализировать их программно. Рассмотрим пример кода, который поможет найти строки с пустой аналитикой или проблемными документами в табличной части Расходы:


Для Каждого СтрокаТЧ Из Объект.Расходы Цикл
    Если ЗначениеЗаполнено(СтрокаТЧ.АналитикаРасходов) 
        И ТипЗнч(СтрокаТЧ.АналитикаРасходов) = Тип("ДокументСсылка.ПриобретениеТоваровУслуг") Тогда
        
        // Проверяем заполнение контрагента в документе-аналитике
        Если СтрокаТЧ.АналитикаРасходов.Контрагент.Пустая() Тогда
            Сообщить("В строке " + СтрокаТЧ.НомерСтроки + " у документа аналитики не заполнен контрагент!");
        КонецЕсли;
        
    КонецЕсли;
КонецЦикла;

Если вы используете расширение (как в исходном сообщении об ошибке), стоит проверить общий модуль ОбменДаннымиXDTOСервер. Возможно, в расширении переопределены правила выгрузки, которые делают проверку свойств более строгой.

Дополнительные рекомендации по «лечению» обмена

Разберем еще несколько способов устранения подобных сбоев, если ручное исправление не помогает:

Подведем итог: ошибка «Отсутствует обязательное свойство Контрагент» в 90% случаев связана с человеческим фактором — недозаполнением документов, которые выступают в роли аналитики расходов. Тщательная проверка связанных документов в цепочке поставок позволяет быстро восстановить работоспособность обмена без вмешательства в программный код.

← На главную