Синхронизация данных между 1С:Управление торговлей (УТ) и 1С:Бухгалтерия предприятия (БП) через универсальный формат (EnterpriseData) — процесс технологически сложный. Одной из самых частых и неприятных проблем является ошибка валидации XDTO, когда система сообщает, что объект не соответствует типу из-за отсутствия обязательного свойства, например, ЮридическоеФизическоеЛицо. В этой статье мы подробно разберем причины возникновения таких ситуаций и рассмотрим эффективные способы их решения.
Когда мы выполняем обмен через универсальный формат, данные сначала выгружаются во временный XML-файл, структура которого должна строго соответствовать XDTO-пакету EnterpriseData. В отличие от старых правил обмена (на базе КД 2.0), универсальный формат крайне чувствителен к заполнению обязательных реквизитов. Если в схеме указано, что поле должно быть заполнено, а в базе данных 1С оно пустое или содержит некорректный тип, выгрузка прервется ошибкой.
Рассмотрим типичную ситуацию: выгрузка контрагента. Ошибка часто указывает на свойство ЮридическоеФизическоеЛицо. Основная сложность заключается в том, что в интерфейсе программы поле может выглядеть заполненным, но на уровне базы данных значение может отсутствовать или ссылаться на битый элемент перечисления.
Прежде чем что-то исправлять, нам нужно точно определить, какие именно записи справочника Контрагенты вызывают сбой. Проанализируем ситуацию с помощью консоли запросов или специально написанной обработки. Нам важно проверить не только само значение, но и его тип.
Разберем пример кода, который поможет выявить контрагентов с некорректно заполненным типом лица:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Контрагенты.Ссылка КАК Ссылка,
| Контрагенты.Код КАК Код,
| Контрагенты.ЮридическоеФизическоеЛицо КАК ЮридическоеФизическоеЛицо,
| ТИПЗНАЧЕНИЯ(Контрагенты.ЮридическоеФизическоеЛицо) КАК ТипРеквизита
|ИЗ
| Справочник.Контрагенты КАК Контрагенты
|ГДЕ
| Контрагенты.ЭтоГруппа = ЛОЖЬ
| И (Контрагенты.ЮридическоеФизическоеЛицо = ЗНАЧЕНИЕ(Перечисление.ЮридическоеФизическоеЛицо.ПустаяСсылка)
| ИЛИ Контрагенты.ЮридическоеФизическоеЛицо ЕСТЬ NULL)";
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
Пока Выборка.Следующий() Цикл
Сообщить("Для контрагента: " + Выборка.Код + " " + Выборка.Ссылка + " не заполнено Юр/Физ лицо!");
КонецЦикла;
Важный нюанс: в некоторых версиях конфигураций после обновлений реквизит мог быть переименован (например, в УдалитьЮридическоеФизическоеЛицо), а вместо него добавлен новый. Если данные переносились программно, новый реквизит мог остаться пустым, что и вызывает ошибку при попытке выгрузки через EnterpriseData.
Если проблемных объектов много, мы можем воспользоваться стандартным механизмом «Групповое изменение реквизитов» (находится в разделе НСИ и Администрирование — Обслуживание — Корректировка данных).
Контрагенты.ЮридическоеФизическоеЛицо не заполнено.Иногда помогает даже простая перезапись объекта. Попробуйте открыть карточку проблемного контрагента, перевыбрать тип лица и нажать «Записать и закрыть». Это принудительно инициирует заполнение всех служебных реквизитов, которые могут использоваться правилами обмена.
Часто при обмене УТ 11.2 и БП 3.0 возникает ошибка соответствия типа в табличных частях документов (например, РасшифровкаПлатежа). Система может ругаться на свойство СтавкаНДС или Сумма. Это случается, если в документе есть строки с нулевыми суммами или суммами меньше рубля (например, 0.13 коп.), которые XDTO-валидатор считает недопустимыми для данной схемы.
Рассмотрим способ обхода этой проблемы через использование внешнего менеджера обмена. Это позволит нам не снимать конфигурацию с поддержки, но внести правки в логику выгрузки:
МенеджерОбменаНовый.МенеджерОбменаЧерезУниверсальныйФормат.ПКО_Документ_ПоступлениеБезналичныхДенежныхСредств_Отправка_ПриОтправкеДанных).Если визуально данные в порядке, а ошибка сохраняется, нам придется заглянуть «под капот» механизма обмена. Разберем, как найти место ошибки программно:
ОбменДаннымиXDTOСервер.Проверить() (обычно это вызов ОбъектXDTO.Проверить()).ОбъектXDTO. Метод Проверить() не возвращает подробностей в пользовательский интерфейс, но при пошаговой отладке можно увидеть, на каком именно свойстве спотыкается валидатор.Используйте следующий прием для вывода подробностей в журнал регистрации:
Попытка
ОбъектXDTO.Проверить();
Исключение
ЗаписьЖурналаРегистрации("ОбменДаннымиXDTO", УровеньЖурналаРегистрации.Ошибка, , ,
"Ошибка валидации объекта: " + Строка(ДанныеИБ.Ссылка) + Символы.ПС + ОписаниеОшибки());
ВызватьИсключение;
КонецПопытки;
Мы проанализировали основные причины сбоев при выгрузке из УТ 11.2 в БП 3.0. Подведем итоги:
EnterpriseData в обеих базах совместимы. Иногда обновление БП требует обновления правил и в старой УТ.Помните, что универсальный формат требует гораздо более высокого качества ведения НСИ, чем старые обмены по правилам конвертации. Регулярный аудит справочников поможет избежать подобных проблем в будущем.