При организации обмена между конфигурациями «1С:Бухгалтерия предприятия, ред. 3.0» через формат EnterpriseData разработчики и администраторы могут столкнуться с критической ошибкой сериализации. Обмен завершается аварийно при попытке выгрузить документы (например, ПоступлениеТоваровУслуг или РеализацияТоваровУслуг), в которых присутствуют мультитоварные логистические упаковки (SSCC).
Разберем детально механизм возникновения сбоя, проанализируем конфликт форматов и рассмотрим практические способы обхода этой ошибки.
Выясним причину падения обмена. Согласно методологии системы маркировки «Честный Знак» (ГИС МТ), логистический код SSCC (Serial Shipping Container Code) идентифицирует сборную транспортную паллету. Если на паллете находятся товары с разным составом (мультитоварная упаковка), в справочнике штрихкодов упаковок реквизит Номенклатура для верхнего транспортного узла остается пустым. Состав такой паллеты определяется исключительно ее иерархией во вложенных штрихкодах.
С другой стороны, в универсальном формате обмена EnterpriseData (например, версии 1.21) в схеме XDTO для объекта Справочник.МаркировкаУпаковки ветка реквизитов имеет следующую структуру:
Справочник.МаркировкаУпаковки -> КлючевыеСвойства -> ДанныеНоменклатуры -> Номенклатура
В схеме XSD данный реквизит жестко помечен как обязательный к заполнению. Когда типовой механизм пытается выгрузить документ, он выполняет конвертацию табличной части маркировки. Обращаясь к SSCC-упаковке без указанной номенклатуры, фабрика XDTO не находит обязательного реквизита и выбрасывает исключение валидации. В результате файл сообщения обмена даже не формируется в базе-источнике.
Важно понимать: ошибка всегда происходит на стороне базы-отправителя в момент формирования XML через объект ФабрикаXDTO, независимо от того, куда осуществляется выгрузка (в локальную базу или в облако 1С:Фреш).
Рассмотрим самое быстрое временное решение, если обмен требуется запустить немедленно, а доработка правил невозможна в текущий момент.
Суть способа заключается в подстановке служебной (технической) позиции номенклатуры в пустые реквизиты транспортных упаковок перед началом процедуры синхронизации:
Номенклатура служебный элемент (например, с наименованием «Техническая позиция маркировки»).Номенклатура этой служебной позицией в режиме отключения проверок:
ОбъектУпаковки = ВыбранныйШтрихкод.ПолучитьОбъект();
ОбъектУпаковки.ОбменДанными.Загрузка = Истина;
ОбъектУпаковки.Номенклатура = СлужебнаяНоменклатура;
ОбъектУпаковки.Записать();
ДанныеНоменклатуры теперь заполнен.ПустаяСсылка().Минусы подхода: метод требует контроля целостности данных, блокировки работы пользователей во время подмены и не подходит для постоянного регламентного использования на базах с большими объемами данных.
Если в базе-приемнике учет ведется исключительно в бухгалтерских целях, данные кодов маркировки и упаковок там не требуются. Самым чистым и архитектурно правильным решением является программная очистка данных маркировки из структуры выгрузки документа.
Даже если одна из баз расположена в сервисе 1С:Фреш, расширения конфигурации (файлы .cfe) можно загружать через личный кабинет абонента. Поскольку обработка данных обмена выполняется штатными методами без обращения к внешним библиотекам или файловой системе сервера, расширение без труда проходит аудит безопасности сервиса.
Проанализируем шаги реализации в расширении для базы-источника:
ПКО_Документ_ПоступлениеТоваровУслуг_Отправка_ПриОтправкеДанных).
&Вместо("ПКО_Документ_ПоступлениеТоваровУслуг_Отправка_ПриОтправкеДанных")
Процедура Расш_ПКО_Документ_ПоступлениеТоваровУслуг_Отправка_ПриОтправкеДанных(ДанныеИБ, ДанныеXDTO, КомпонентыОбмена, Стек)
// Вызываем стандартную логику
ПродолжитьВызов(ДанныеИБ, ДанныеXDTO, КомпонентыОбмена, Стек);
// Очищаем коллекцию маркировки, чтобы узел не генерировался в XML
Если ДанныеXDTO.Свойство("МаркировкаУпаковки") Тогда
ДанныеXDTO.МаркировкаУпаковки.Очистить();
КонецЕсли;
КонецПроцедуры
Когда коллекция маркировки пуста, сериализатор XDTO пропускает формирование узла МаркировкаУпаковки. В результате валидация схемы завершается без ошибок, а данные бухгалтерского учета (суммы, счета, номенклатура, контрагенты) передаются корректно.
Если нет возможности устанавливать расширения, рассмотрим штатные настройки подключения синхронизации данных.
В настройках обмена есть возможность зафиксировать более раннюю версию формата EnterpriseData. В ряде предыдущих версий формата проверки на обязательность номенклатуры в блоке транспортных упаковок отсутствовали либо данный состав табличной части не выгружался. Это позволяет штатно обойти конфликт валидации до момента выпуска официального исправления (патча) от разработчиков конфигурации.