Синхронизация данных между конфигурациями 1С:Управление торговлей 11 и 1С:Бухгалтерия предприятия 3.0 на основе универсального формата EnterpriseData — это мощный инструмент, который, однако, иногда может преподносить неприятные сюрпризы в виде ошибок проверки XDTO-пакетов. Одна из наиболее распространенных и труднодиагностируемых на первый взгляд ошибок возникает при выгрузке документа Отчет о розничных продажах.
В процессе выгрузки система возвращает ошибку следующего вида:
Ошибка проверки данных XDTO: Структура объекта '/ОплатаПлатежнымиКартамиПодарочныхСертификатов/Строка[1]' не соответствует типу... Не установлено значение одного из следующих свойств: НомерКарты.
В этой статье мы подробно разберем, почему возникает данная ошибка, даже если визуально табличные части документа кажутся абсолютно пустыми, и рассмотрим пошаговый алгоритм её локализации и устранения.
---
Прежде всего, давайте разберемся с технической стороной вопроса. Формат обмена EnterpriseData жестко регламентирует структуру передаваемых XML-файлов с помощью XDTO-схем. В этих схемах для каждого типа документа описаны обязательные к заполнению реквизиты.
Для документа Отчет о розничных продажах (в XML-пакете он описывается как Документ_ОтчетОРозничныхПродажах_Отправка) существует ветка под названием ОплатаПлатежнымиКартамиПодарочныхСертификатов. По правилам схемы EnterpriseData версии 1.3 и выше, если в XML-структуру попадает хотя бы одна строка этой таблицы, для нее обязательно должны быть заполнены ключевые свойства:
КлючевыеСвойстваКонтрагент. Для эквайрера обязательными являются базовые реквизиты контрагента (наименование, ИНН и т.д.).Если при формировании XML-сообщения обработчик выгрузки создает эту ветку, но не находит в базе данных заполненных значений для номера карты или терминала эквайринга, метод платформы ОбъектXDTO.Проверить() аварийно завершает работу, блокируя выгрузку всего пакета обмена.
---
Часто пользователи и администраторы заявляют: "Мы открыли документ, вкладки 'Оплата платежными картами' и 'Подарочные сертификаты' абсолютно пусты!". Выясним, почему так происходит:
Del или Backspace), вместо того чтобы удалить саму строку из таблицы (клавишей Delete на клавиатуре или через контекстное меню). Физически строка с нулевой суммой и пустыми реквизитами остается в табличной части документа. На форме она не видна или отображается как тонкая пустая полоска, но алгоритм выгрузки пытается ее обработать.ОплатаПлатежнымиКартамиПодарочныхСертификатов. При этом, если в исходной оплате не были заполнены данные терминала или карты, система выдаст ошибку валидации XDTO.Контрагент, Эквайрер и НомерКарты не находятся в шапке документа Отчет о розничных продажах. Они привязаны к строкам табличной части оплат и карточке терминала. При беглом осмотре шапки документа пользователь может решить, что этих реквизитов просто нет.---
Проанализируем ситуацию и выполним последовательность действий, гарантированно решающих эту проблему.
Не полагайтесь на визуальное совпадение номеров. В ошибке всегда указан точный номер, дата и организация (например, БЛРБ-000122 от 30.12.2017 19:58:55). Убедитесь, что вы открыли именно тот документ, на который ругается система. Лучше всего найти его программно по уникальному идентификатору (GUID) или через функции технического специалиста.
Открыв нужный документ в режиме предприятия, перейдите на вкладку Оплата платежными картами. Выделите табличную часть и попробуйте нажать комбинацию клавиш Ctrl + A (Выделить все). Если выделились пустые строки, удалите их программно или стандартным интерактивным способом (правой кнопкой мыши — "Удалить").
Для надежности выполните следующий код в консоли кода или во внешней обработке для очистки пустых строк в документе:
// Получаем объект документа по ссылке
ДокументОбъект = СсылкаНаОтчет.ПолучитьОбъект();
Модифицирован = Ложь;
// Перебираем строки ТЧ оплаты платежными картами с конца
Индекс = ДокументОбъект.ОплатаПлатежнымиКартами.Количество() - 1;
Пока Индекс >= 0 Цикл
СтрокаОплаты = ДокументОбъект.ОплатаПлатежнымиКартами[Индекс];
// Если строка не содержит суммы и терминала, удаляем её
Если СтрокаОплаты.Сумма = 0 И Не ЗначениеЗаполнено(СтрокаОплаты.ЭквайринговыйТерминал) Тогда
ДокументОбъект.ОплатаПлатежнымиКартами.Удалить(СтрокаОплаты);
Модифицирован = Истина;
КонецЕсли;
Индекс = Индекс - 1;
КонецЦикла;
// Если были изменения, записываем документ
Если Модифицирован Тогда
ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение);
Сообщить("Документ успешно очищен от фантомных строк и перезаписан!");
КонецЕсли;
Если оплата картой в документе действительно присутствует, и строка не является "фантомной", обязательно проверьте заполнение следующих полей:
*0000, так как схема XDTO требует непустую строку).Если визуально всё заполнено, но ошибка сохраняется, воспользуемся отладчиком. Установим точку останова в общем модуле ОбменДаннымиXDTOСервер на строке 551 (или рядом, в зависимости от релиза конфигурации), где вызывается метод ОбъектXDTO.Проверить().
Рассмотрим порядок действий при отладке:
ОбщийМодуль.ОбменДаннымиXDTOСервер.Модуль.ОбъектXDTO.Проверить(); и установите точку останова (клавиша F9).ОбъектXDTO в табло.ОплатаПлатежнымиКартамиПодарочныхСертификатов. Вы сможете увидеть, какая именно строка вызывает сбой и какие свойства (например, НомерКарты) в ней не инициализированы.Выполнив эти шаги, вы сможете оперативно локализовать проблему, исправить поврежденные документы и возобновить штатный обмен данными между конфигурациями.