При обновлении конфигураций линейки 1С:ERP, Комплексная автоматизация или Управление торговлей на новые редакции пользователи и специалисты нередко сталкиваются с ошибками выгрузки данных через универсальный формат (EnterpriseData). Одной из частых проблем является аварийное завершение обмена при выгрузке документов реализации с ошибкой валидации структуры XDTO-пакета.
Проанализируем типовое проявление ошибки, выясним ее причину в программном коде и разберем варианты исправления как напрямую в модуле конфигурации, так и безопасными способами без снятия с типовой поддержки.
Во время выполнения регламентного или интерактивного обмена данными в журнале регистрации фиксируется исключение следующего вида:
{ОбщийМодуль.ОбменДаннымиXDTOСервер.Модуль(577)}: Ошибка при вызове метода контекста (Проверить)
ОбъектXDTO.Проверить();
по причине:
Ошибка проверки данных XDTO:
Структура объекта '/Товары/Строка[1]' не соответствует типу: {http://v8.1c.ru/edi/edi_stnd/EnterpriseData/1.4}Документ.РеализацияТоваровУслуг.Товары.Строка
Проверка свойства 'Количество':
форма: Элемент
тип: {http://v8.1c.ru/edi/edi_stnd/EnterpriseData/1.4}ТипКоличество
Не установлено значение одного из следующих свойств: ДанныеНоменклатуры
При анализе реквизитов документа в пользовательском режиме кажется, что номенклатура и количество полностью заполнены. Однако механизм валидации платформы 1С устроен таким образом, что при отсутствии обязательного составного элемента схемы (в данном случае блока номенклатурных данных ДанныеНоменклатуры) валидатор переходит к следующему ожидаемому тегу Количество и выдает диагностическое сообщение о несоответствии структуры объекта.
Разберем внутреннюю механику выгрузки. В правилах обмена универсального формата выгрузка табличных частей документов формируется на основании массивных пакетных запросов к базе данных. При переходе на редакцию 2.4 разработчики типового решения оптимизировали выборку движений и аналитики, добавив в пакет промежуточные подзапросы.
В результате добавления нового подзапроса в пакет сместились индексы результирующего массива РезультатыЗапроса. В обработчике события отправки документа обращение к таблице товаров продолжало выполняться по старому индексу, из-за чего в выборку попадали пустые строки или данные соседнего запроса (например, услуг или возвратной тары). Так как в сформированном дереве XDTO ключевые поля номенклатуры оказались пустыми, метод ОбъектXDTO.Проверить() справедливо заблокировал передачу некорректного XML-сообщения.
Разберем по шагам, как исправить программный код выгрузки документа «Реализация товаров и услуг»:
МенеджерОбменаЧерезУниверсальныйФормат.ПКОДокументРеализацияТоваровУслугОтправкаПриОтправкеДанных (или соответствующий обработчик правил конвертации для реализации).
ТабТовары = РезультатыЗапроса[5].Выгрузить();
ТабТовары = РезультатыЗапроса[6].Выгрузить();
После сдвига индекса в переменную ТабТовары загружается корректная выборка номенклатурных позиций, все обязательные свойства схемы XDTO заполняются штатно, и валидация успешно проходит.
Если конфигурация находится на официальной поддержке и вносить прямые правки в типовые модули нежелательно, рассмотрим альтернативные методы решения задачи:
Создадим расширение с назначением «Адаптация» или «Исправление», добавим в него модуль МенеджерОбменаЧерезУниверсальныйФормат и переопределим проблемную процедуру с помощью аннотации &Вместо. Это позволит исправить ошибку без снятия конфигурации с поддержки поставщика и без проблем накатывать следующие типовые релизы.
В форме настройки синхронизации данных (раздел Администрирование — Синхронизация данных) переключим режим использования правил на «Правила, загруженные из файла». Сохраним типовой модуль правил во внешний файл, внесем исправление индекса запроса в текстовом редакторе и загрузим правила обратно. Данный вариант позволяет решить проблему моментально прямо в режиме «1С:Предприятие» без монопольного доступа к базе.
В ситуациях, когда выгрузку нужно завершить немедленно для сдачи бухгалтерской отчетности, можно временно перехватить исключение в модуле ОбменДаннымиXDTOСервер:
Попытка
ОбъектXDTO.Проверить();
Исключение
// Временный пропуск строгой проверки при наличии заполненных ключевых данных
КонецПопытки;
Важно: этот способ следует использовать с осторожностью, так как при действительно некорректных данных ошибка возникнет уже на стороне базы-приемника (1С:Бухгалтерии) при десериализации XML-сообщения.
Подобные рассинхронизации индексов в обработчиках обмена являются типовыми ошибками первых сборок релизов. Проверим наличие официальных патчей от разработчиков 1С в сервисе обновления программ или выполним обновление на актуальную корректирующую сборку конфигурации.
Переход между крупными редакциями (например, с ERP 2.2 на 2.4) затрагивает фундаментальные механизмы учета — структуры регистров, концепцию видов запасов и резервирования. Поэтому перед обновлением рабочей базы настоятельно рекомендуется развернуть тестовую копию, выполнить контрольное перезакрытие расчетного месяца и осуществить сквозной тестовый обмен с бухгалтерской базой для выявления возможных ошибок сериализации до начала отчетного периода.