Как исправить ошибку проверки XDTO «Отсутствует обязательное свойство Контрагент» при синхронизации в УТ 11.5?

Программист 1С v8.3 (Управляемые формы) 1С:Управление торговлей IT и автоматизация бизнеса
← На главную

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

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

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

Проанализируем стек вызова и структуру ошибки. В процессе выгрузки задействовано правило Справочник_СостоянияЭД_Отправка, обрабатывающее записи регистра сведений СостоянияПоОбъектамУчетаЭДО. При формировании XML-сообщения конфигурация выгружает не только сами состояния, но и ключевые свойства связанных объектов учета, выступающих основаниями электронных документов.

Выделим основные предпосылки появления ошибки:

  1. Разделение понятий «Партнер» и «Контрагент» в УТ 11. В прикладном решении управленческий учет ведется по партнерам, а регламентированный — по контрагентам. При автоматической загрузке документов через сервис 1С-ЭДО (особенно фоновыми заданиями до сопоставления номенклатуры и контрагентов) создаются черновые документы. В таких объектах реквизит Партнер может быть заполнен автоматически, а Контрагент остается пустым. При этом запись в регистре СостоянияПоОбъектамУчетаЭДО создается сразу же.
  2. Ограничения схемы EnterpriseData. Согласно XDTO-пакету стандарта EnterpriseData, для типа КлючевыеСвойстваСчетФактураПолученный реквизит Контрагент имеет фасет минимального количества вхождений minOccurs = 1. Это делает реквизит строго обязательным. Если платформа встречает пустую ссылку, вызов метода ОбъектXDTO.Проверить() генерирует исключение и аварийно завершает выгрузку всего сообщения обмена.
  3. «Битые» и зависшие ссылки после удаления. Регистр СостоянияПоОбъектамУчетаЭДО является независимым. Если пользователь помечает на удаление дублированный или ошибочный входящий документ ЭДО (или выполняет физическое удаление), записи в регистре часто остаются нетронутыми. В измерении СсылкаНаОбъект образуется ссылка на несуществующий или удаленный документ, чтение контрагента из которого возвращает пустое значение.

Способ 1. Поиск проблемных документов через консоль запросов

Выясним причину сбоя, проверив зарегистрированные к обмену объекты и связанные с ними документы поступления. Проверять сам регистр сведений на пустые поля бессмысленно, так как поле Контрагент отсутствует в измерениях и ресурсах регистра напрямую — проверять нужно именно реквизиты объектов, указанных в поле СсылкаНаОбъект.

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


ВЫБРАТЬ
    СчетФактура.Ссылка КАК Документ,
    СчетФактура.Номер КАК Номер,
    СчетФактура.Дата КАК Дата,
    СчетФактура.Партнер КАК Партнер,
    СчетФактура.Контрагент КАК Контрагент
ИЗ
    Документ.СчетФактураПолученный КАК СчетФактура
ГДЕ
    СчетФактура.Контрагент = ЗНАЧЕНИЕ(Справочник.Контрагенты.ПустаяСсылка)
    И НЕ СчетФактура.ПометкаУдаления

Аналогичным образом проверим документы ПриобретениеТоваровУслуг, так как счета-фактуры часто формируются на их основании:


ВЫБРАТЬ
    Приобретение.Ссылка КАК Документ,
    Приобретение.Номер КАК Номер,
    Приобретение.Дата КАК Дата,
    Приобретение.Партнер КАК Партнер,
    Приобретение.Контрагент КАК Контрагент
ИЗ
    Документ.ПриобретениеТоваровУслуг КАК Приобретение
ГДЕ
    Приобретение.Контрагент = ЗНАЧЕНИЕ(Справочник.Контрагенты.ПустаяСсылка)

Также важно выявить «хвосты» в регистре сведений, ссылающиеся на уже помеченные на удаление или физически отсутствующие документы:


ВЫБРАТЬ
    Состояния.СсылкаНаОбъект КАК Объект,
    Состояния.СостояниеЭДО КАК Состояние
ИЗ
    РегистрСведений.СостоянияПоОбъектамУчетаЭДО КАК Состояния
ГДЕ
    Состояния.СсылкаНаОбъект ССЫЛКА Документ.СчетФактураПолученный
    И (Состояния.СсылкаНаОбъект.Ссылка ЕСТЬ NULL
        ИЛИ Состояния.СсылкаНаОбъект.ПометкаУдаления)

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

Способ 2. Снятие регистрации изменений для узла обмена

Если обмен данными необходимо восстановить незамедлительно, воспользуемся стандартной обработкой «Регистрация изменений для обмена данными»:

  1. Перейдем в раздел НСИ и администрирование → Синхронизация данных → Настройки синхронизации данных.
  2. Выберем нужный узел плана обмена и нажмем кнопку Состав отправляемых данных.
  3. В открывшемся дереве метаданных раскроем ветку Регистры сведений и найдем регистр Состояния по объектам учета ЭДО.
  4. Нажмем правой кнопкой мыши по регистру и выберем пункт Отменить регистрацию изменений для всего набора или точечно для сбойных документов.
  5. Запустим синхронизацию повторно. Выгрузка пройдет успешно, так как невалидный объект будет исключен из очереди отправки.

Способ 3. Программная очистка зависших записей регистра

В ситуациях, когда битый объект уже удален из информационной базы, а запись регистра продолжает регистрироваться к выгрузке, очистим ее с помощью внешней обработки. Напишем код для программного удаления записи из независимого регистра сведений:


НаборЗаписей = РегистрыСведений.СостоянияПоОбъектамУчетаЭДО.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.СсылкаНаОбъект.Установить(ПроблемнаяСсылка);
НаборЗаписей.Прочитать();

Если НаборЗаписей.Количество() > 0 Тогда
    НаборЗаписей.Очистить();
    НаборЗаписей.Записать();
КонецЕсли;

При записи пустого набора платформа автоматически зарегистрирует удаление записи для всех узлов плана обмена, что устранит ошибку схемы XDTO в последующих сеансах синхронизации.

Предотвращение повторных сбоев

Для исключения подобных проблем в будущем рекомендуется предпринять следующие меры:

  1. Настройка правил регистрации объектов (ПРО). Если в целевой информационной базе (например, в «1С:Бухгалтерии предприятия») не требуется отслеживать состояния электронных документов из базы-источника, отключим авторегистрацию для регистра СостоянияПоОбъектамУчетаЭДО в правилах обмена.
  2. Перехват валидации в расширении. В общем модуле ОбменДаннымиXDTOСервер или в обработчиках конвертации через расширение конфигурации можно внедрить проверку: если у выгружаемого основания электронного документа реквизит Контрагент не заполнен, устанавливать параметр Отказ = Истина. Это предотвратит аварийную остановку фонового обмена.
  3. Организационные меры при работе с ЭДО. Разъяснить пользователям порядок работы с входящими электронными документами: нельзя оставлять документы в промежуточном состоянии с заполненным партнером без выбора юридического лица (контрагента), а также помечать документы на удаление без предварительной отмены или архивации связанного электронного документа.
← На главную