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