Как исправить ошибку XDTO-валидации при выгрузке мультитоварных упаковок SSCC через EnterpriseData в 1С:Бухгалтерии?

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

При организации обмена между конфигурациями «1С:Бухгалтерия предприятия, ред. 3.0» через формат EnterpriseData разработчики и администраторы могут столкнуться с критической ошибкой сериализации. Обмен завершается аварийно при попытке выгрузить документы (например, ПоступлениеТоваровУслуг или РеализацияТоваровУслуг), в которых присутствуют мультитоварные логистические упаковки (SSCC).

Разберем детально механизм возникновения сбоя, проанализируем конфликт форматов и рассмотрим практические способы обхода этой ошибки.

Причина ошибки и суть коллизии форматов

Выясним причину падения обмена. Согласно методологии системы маркировки «Честный Знак» (ГИС МТ), логистический код SSCC (Serial Shipping Container Code) идентифицирует сборную транспортную паллету. Если на паллете находятся товары с разным составом (мультитоварная упаковка), в справочнике штрихкодов упаковок реквизит Номенклатура для верхнего транспортного узла остается пустым. Состав такой паллеты определяется исключительно ее иерархией во вложенных штрихкодах.

С другой стороны, в универсальном формате обмена EnterpriseData (например, версии 1.21) в схеме XDTO для объекта Справочник.МаркировкаУпаковки ветка реквизитов имеет следующую структуру:

Справочник.МаркировкаУпаковки -> КлючевыеСвойства -> ДанныеНоменклатуры -> Номенклатура

В схеме XSD данный реквизит жестко помечен как обязательный к заполнению. Когда типовой механизм пытается выгрузить документ, он выполняет конвертацию табличной части маркировки. Обращаясь к SSCC-упаковке без указанной номенклатуры, фабрика XDTO не находит обязательного реквизита и выбрасывает исключение валидации. В результате файл сообщения обмена даже не формируется в базе-источнике.

Важно понимать: ошибка всегда происходит на стороне базы-отправителя в момент формирования XML через объект ФабрикаXDTO, независимо от того, куда осуществляется выгрузка (в локальную базу или в облако 1С:Фреш).

Вариант 1. Временное использование служебной номенклатуры (быстрый обход)

Рассмотрим самое быстрое временное решение, если обмен требуется запустить немедленно, а доработка правил невозможна в текущий момент.

Суть способа заключается в подстановке служебной (технической) позиции номенклатуры в пустые реквизиты транспортных упаковок перед началом процедуры синхронизации:

  1. Создаем в справочнике Номенклатура служебный элемент (например, с наименованием «Техническая позиция маркировки»).
  2. Для штрихкодов упаковок с типом «Мультитоварная» программно заполняем пустой реквизит Номенклатура этой служебной позицией в режиме отключения проверок:
    
    ОбъектУпаковки = ВыбранныйШтрихкод.ПолучитьОбъект();
    ОбъектУпаковки.ОбменДанными.Загрузка = Истина;
    ОбъектУпаковки.Номенклатура = СлужебнаяНоменклатура;
    ОбъектУпаковки.Записать();
    
  3. Выполняем выгрузку пакета данных через стандартную синхронизацию. Валидация XDTO успешно проходит, так как узел ДанныеНоменклатуры теперь заполнен.
  4. При необходимости после успешной отправки реквизит очищается обратно в значение ПустаяСсылка().

Минусы подхода: метод требует контроля целостности данных, блокировки работы пользователей во время подмены и не подходит для постоянного регламентного использования на базах с большими объемами данных.

Вариант 2. Подавление выгрузки маркировки через расширение (системное решение)

Если в базе-приемнике учет ведется исключительно в бухгалтерских целях, данные кодов маркировки и упаковок там не требуются. Самым чистым и архитектурно правильным решением является программная очистка данных маркировки из структуры выгрузки документа.

Даже если одна из баз расположена в сервисе 1С:Фреш, расширения конфигурации (файлы .cfe) можно загружать через личный кабинет абонента. Поскольку обработка данных обмена выполняется штатными методами без обращения к внешним библиотекам или файловой системе сервера, расширение без труда проходит аудит безопасности сервиса.

Проанализируем шаги реализации в расширении для базы-источника:

  1. Подключаем расширение к конфигурации в режиме совместимости с основной конфигурацией.
  2. Перехватываем обработчик выгрузки документа в общем модуле менеджера обмена (например, в обработчике события перед конвертацией или при отправке данных документа ПКО_Документ_ПоступлениеТоваровУслуг_Отправка_ПриОтправкеДанных).
  3. В сформированной структуре данных удаляем узлы маркировки или очищаем табличную часть со штрихкодами, если они относятся к мультитоварным паллетам:
    
    &Вместо("ПКО_Документ_ПоступлениеТоваровУслуг_Отправка_ПриОтправкеДанных")
    Процедура Расш_ПКО_Документ_ПоступлениеТоваровУслуг_Отправка_ПриОтправкеДанных(ДанныеИБ, ДанныеXDTO, КомпонентыОбмена, Стек)
        // Вызываем стандартную логику
        ПродолжитьВызов(ДанныеИБ, ДанныеXDTO, КомпонентыОбмена, Стек);
        
        // Очищаем коллекцию маркировки, чтобы узел не генерировался в XML
        Если ДанныеXDTO.Свойство("МаркировкаУпаковки") Тогда
            ДанныеXDTO.МаркировкаУпаковки.Очистить();
        КонецЕсли;
    КонецПроцедуры
    

Когда коллекция маркировки пуста, сериализатор XDTO пропускает формирование узла МаркировкаУпаковки. В результате валидация схемы завершается без ошибок, а данные бухгалтерского учета (суммы, счета, номенклатура, контрагенты) передаются корректно.

Вариант 3. Понижение версии формата синхронизации

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

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

← На главную