При настройке или регулярном выполнении синхронизации между конфигурациями «1С:Управление торговлей» (редакция 11) и «1С:Бухгалтерия предприятия» (редакция 3.0) пользователи и администраторы часто сталкиваются с аппаратными сбоями конвертации данных. Один из наиболее запутанных сбоев — ошибка проверки XDTO-пакета при отправке документов поступления, в которой фигурирует незаполненное обязательное поле Контрагент.
В этой статье мы подробно разберем природу данной ошибки, выясним, почему объект с названием ПоступлениеТоваровУслуг отсутствует в конфигураторе «Управления торговлей», и рассмотрим пошаговые инструкции по устранению этой неисправности как на уровне пользовательских данных, так и программными методами.
Первое, с чем сталкивается специалист при анализе логов журнала регистрации — это упоминание объекта Документ.ПоступлениеТоваровУслуг. При попытке найти этот документ в дереве метаданных конфигурации «Управление торговлей» через поиск конфигуратора, система выдает пустой результат. Возникает логичный вопрос: как программа пытается выгрузить то, чего физически не существует в базе данных?
Рассмотрим этот механизм подробнее. Современный обмен между конфигурациями 1С строится на базе технологии EnterpriseData (универсальный формат обмена данными). Этот формат представляет собой стандартизированную схему XML (XDTO-пакет), которая служит «переводчиком» между различными информационными базами. Архитектура обмена выглядит следующим образом: при необходимости полностью автоматизировать эти процессы можно настроить регулярный автоматический обмен между базами 1С по расписанию.
ПриобретениеТоваровУслуг. Однако в формате EnterpriseData он транслируется в универсальное имя — Документ.ПоступлениеТоваровУслуг.Документ.ПоступлениеТоваровУслуг в свой внутренний документ, который в бухгалтерии называется ПоступлениеТоваровУслуг (в интерфейсе — «Поступление (акты, накладные, УПД)»).Таким образом, ошибка возникает на этапе **отправки** (конвертации в промежуточный формат XDTO внутри базы УТ). Система пытается заполнить свойства универсальной схемы, но натыкается на пустое обязательное поле.
Проанализируем детальный лог ошибки из журнала регистрации:
Не удалось выполнить конвертацию в объект формата "Документ.ПоступлениеТоваровУслуг": Документ.ПоступлениеТоваровУслуг -> РасшифровкаДопРасходов -> Строка[1] -> ДокументПоступления -> ПоступлениеТоваровУслугСсылка -> Контрагент - не заполнено обязательное поле.
Цепочка связей указывает на то, что проблема кроется в табличной части дополнительных расходов. Выгружаемый документ Приобретение товаров и услуг содержит информацию о распределении транспортно-заготовительных или иных сопутствующих расходов. При заполнении таблицы РасшифровкаДопРасходов программа формирует XML-узлы, ссылающиеся на документы-основания (партии поступления).
По правилам XDTO-схемы EnterpriseData, любая ссылка на документ типа ПоступлениеТоваровУслугСсылка обязана содержать ключевые поля для однозначной идентификации объекта в базе-приемнике. К таким обязательным полям относятся:
Если в документе-основании, на который распределяются расходы, поле «Контрагент» (в УТ это «Поставщик») по какой-то причине не заполнено или не выгружается, XML-файл признается некорректным, и синхронизация аварийно завершается. Чтобы избежать остановки процесса из-за некорректных объектов, можно применить обработку выгрузки EnterpriseData с фиксацией ошибок без прерывания обмена.
Самый быстрый и безопасный способ решить проблему без программирования — провести аудит первичных документов. Выясним причину незаполненного поля по шагам:
УТ 11 и найдем документ, указанный в ошибке. В нашем примере это документ Приобретение товаров и услуг УТ00-000008 от 11.02.2019. Для быстрого перехода можно воспользоваться поиском по номеру или навигационной ссылкой вида e1cib/data/Документ.ПриобретениеТоваровУслуг?ref=....Поставщик и Контрагент. Если эти поля пусты (например, при оформлении внутреннего перемещения или при техническом сбое ввода данных), система не сможет передать их в файл обмена.Иногда ошибка возникает из-за того, что документ-основание физически существует и заполнен в УТ, но база-приемник еще «не знает» о нем, поскольку он не зарегистрирован к отправке в текущем сеансе обмена. Разберем, как исправить это вручную:
Администрирование -> Синхронизация данных.Настройки синхронизации данных и выберем нашу настройку обмена с Бухгалтерией.Документы -> Приобретение товаров и услуг.Зарегистрировать одиночный объект. Это гарантирует, что все связанные сущности попадут в выгружаемый пакет данных вместе с документом дополнительных расходов.Если документов с распределением доп. расходов много, а ошибка носит системный характер (например, расходы распределяются на внутренние перемещения, у которых в принципе нет контрагента в УТ), ручная корректировка не поможет. В этом случае программисту необходимо переопределить правила выгрузки через расширение конфигурации.
Выясним причину сбоя в кодовой базе. Все правила конвертации для универсального формата описаны в общем модуле МенеджерОбменаЧерезУниверсальныйФормат. Нам необходимо доработать процедуру, отвечающую за заполнение табличной части дополнительных расходов.
Создадим расширение конфигурации, добавим в него общий модуль МенеджерОбменаЧерезУниверсальныйФормат и переопределим обработчик выгрузки свойств для ссылочных документов. Напишем код, который будет автоматически подставлять технического (пустого или предопределенного) контрагента, если реальный контрагент у документа-основания отсутствует.
Рассмотрим пример кода адаптации обработчика:
&Вместо("ЗаполнитьСвойстваДокументаПоступленияXDTO")
Процедура Расш_ЗаполнитьСвойстваДокументаПоступленияXDTO(ДанныеДокумента, ОбъектXDTO, КомпонентОбмена)
// Вызываем оригинальный обработчик
ПродолжитьВызов(ДанныеДокумента, ОбъектXDTO, КомпонентОбмена);
// Проверяем заполнение обязательного реквизита "Контрагент" в структуре XDTO
Если ОбъектXDTO.Контрагент = Неопределено Или ПустаяСтрока(ОбъектXDTO.Контрагент) Тогда
// Если контрагент не определен, пытаемся подставить данные из родительского документа
Если ЗначениеЗаполнено(ДанныеДокумента.Ссылка) Тогда
ОрганизацияДокумента = ДанныеДокумента.Ссылка.Организация;
// Инициализируем пустого или дефолтного контрагента для прохождения валидации XDTO
ОбъектXDTO.Контрагент = НайтиДефолтногоКонтрагентаДляОбмена(ОрганизацияДокумента);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Этот код предотвращает аварийное завершение обмена. База-приемник успешно загрузит файл, после чего бухгалтер сможет вручную перенаправить распределение расходов в учете БП. Для последующей проверки правильности отражения документов и контроля расхождений в учете после завершения обмена запускают автоматическую сверку проводок между базами 1С.
Поскольку версии конфигураций УТ 11.4.7.128 и БП 3.0.69.32 относятся к релизам 2019 года, описанная проблема могла быть вызвана зарегистрированной ошибкой платформенных правил обмена. В последующих релизах разработчики фирмы «1С» скорректировали схемы XDTO и логику выгрузки сопутствующих затрат.
Рекомендуется выполнить следующие действия:
УТ 11.4.7.128.