При настройке или выполнении синхронизации данных между конфигурациями (например, 1С:Управление торговлей 11 и 1С:Бухгалтерия предприятия 3.0) специалисты часто сталкиваются с ошибкой валидации XDTO. Сообщение обычно выглядит так: «Структура объекта '/Товары/Строка[20]/ДанныеНоменклатуры/Упаковка' не соответствует типу... не установлено значение свойства ЕдиницаИзмерения». Это критическая ошибка, которая полностью блокирует процесс выгрузки или загрузки данных.
В данной статье мы подробно разберем, почему возникает эта ситуация, как локализовать проблемный объект и какие инструменты использовать для исправления данных, чтобы восстановить работоспособность обмена. В дальнейшем для контроля результата синхронизации может потребоваться автоматическая сверка бухгалтерских и налоговых проводок между базами 1С через COM-соединение.
Проанализируем механику работы обмена. В современных конфигурациях 1С используется формат EnterpriseData, построенный на технологии XDTO (XML Data Transfer Objects). Каждый объект перед отправкой проходит проверку на соответствие схеме (пакету XDTO). В описании типа Упаковка для реквизита ЕдиницаИзмерения установлено правило: Минимальное количество = 1 (nillable = false).
Это означает, что поле «Единица измерения» в справочнике Упаковки является обязательным для заполнения на уровне программного интерфейса. Если в базе данных это поле пустое или содержит так называемую «Битую ссылку» (объект удален, но ссылка на него осталась), сериализатор 1С не может сформировать корректный XML-узел. Система видит отсутствие обязательного элемента и прерывает выгрузку с ошибкой соответствия типу.
Рассмотрим основные ситуации, которые приводят к нарушению целостности данных в справочнике Упаковки:
Упаковки, не заполняя все необходимые реквизиты.Посмотрим на текст ошибки: «Строка [20]». Это индекс объекта в текущем наборе данных, который система пытается выгрузить. Найти объект по этому индексу в интерфейсе практически невозможно, поэтому применим следующие методы диагностики:
Анализ Журнала регистрации: Перейдем в Журнал регистрации и установим фильтр по событию «Синхронизация данных». Часто в расшифровке события можно найти внутренний идентификатор (GUID) или наименование номенклатуры, к которой относится проблемная упаковка.
Поиск через выгрузку в файл: Если используется прямой обмен, временно перенастроим его на «Обмен через локальный каталог». После запуска синхронизации откроем сформированный XML-файл текстовым редактором. Найдем узел Товары и отсчитаем 20-й элемент. Там мы увидим GUID упаковки и её владельца (Номенклатуру). Это позволит нам точно определить, какой элемент справочника нужно лечить.
Проанализируем стандартный механизм ТИИ. Многие пользователи пытаются решить проблему запуском режима «Тестирование и исправление» с настройкой «Очищать ссылки». Однако в данном случае это может только усугубить ситуацию. ТИИ заменит «Битую ссылку» на пустое значение (Неопределено). Поскольку ЕдиницаИзмерения в схеме обмена обязательна, ошибка никуда не исчезнет — пустое значение точно так же не пройдет валидацию XDTO.
Правильный подход — не очищать, а восстанавливать данные или заменять их на корректные значения. Для этой задачи подойдёт обработка для автоматического поиска и замены ссылок во всей базе.
Чтобы найти все проблемные упаковки во всей базе, воспользуемся консолью запросов. Проанализируем ситуацию с помощью следующего кода:
ВЫБРАТЬ
Упаковки.Ссылка КАК Ссылка,
Упаковки.Владелец КАК Номенклатура,
Упаковки.Наименование КАК Наименование
ИЗ
Справочник.Упаковки КАК Упаковки
ГДЕ
(Упаковки.ЕдиницаИзмерения ЕСТЬ NULL
ИЛИ Упаковки.ЕдиницаИзмерения = ЗНАЧЕНИЕ(Справочник.ЕдиницыИзмерения.ПустаяСсылка)
ИЛИ Упаковки.ЕдиницаИзмерения.Наименование ЕСТЬ NULL)
Если запрос вернул результат, значит, у вас действительно есть «битые» или незаполненные данные. Для исправления выполним следующие действия (для планового обслуживания и профилактики ошибок полезно настроить автоматическое архивирование, обновление и тестирование нескольких баз 1С в фоновом режиме):
Если ошибка блокирует работу, а разбираться с каждой упаковкой нет времени, рассмотрим вариант временного обхода проблемы через Регистрацию изменений:
Откроем обработку «Регистрация изменений для обмена». Найдем в списке справочник Упаковки. Нажмем «Показать зарегистрированные изменения». Если мы нашли проблемный элемент, мы можем просто удалить его из регистрации. Это позволит синхронизации пройти успешно для всех остальных объектов. Однако помните: как только кто-то снова запишет эту упаковку или номенклатуру, она опять попадет в регистрацию, и ошибка вернется.
Проверка наборов упаковок: В современных конфигурациях УТ 11 / ERP упаковки могут быть индивидуальными или входить в Наборы упаковок. Если вы используете наборы, проверьте заполнение единиц измерения именно в справочнике Наборы упаковок. Ошибка в одной строке набора может блокировать выгрузку всей номенклатуры, использующей этот набор.
Версии формата EnterpriseData: Выясним, не было ли недавнего обновления программы. Иногда в Бухгалтерии формат обмена обновляется до 1.15, а в Управлении торговлей остается 1.10. Проверьте в настройках синхронизации используемую версию формата. Если возможно, попробуйте временно понизить версию формата в настройках обмена (в обеих базах).
Очистка кэша XDTO: В редких случаях после исправления всех данных ошибка сохраняется. Это может быть связано с серверным кэшем определений типов XDTO. В такой ситуации рекомендуется перезапустить службу 1C:Enterprise Server или хотя бы перезайти в программу всем пользователям, чтобы сеансы обмена инициализировались заново с чистой памятью.
Единицы измерения для отчетов: Проанализируем еще одну скрытую причину. Иногда в самой карточке Номенклатуры не заполнены Единица измерения для отчетов или Базовая единица. Некоторые алгоритмы формирования XML для упаковок пытаются обратиться к свойствам базовой единицы владельца. Убедитесь, что в карточках номенклатуры, на которые ругается обмен, заполнены все основные реквизиты единиц измерения.
Используя данные методы, мы сможем не только устранить текущую ошибку, но и обеспечить чистоту данных для стабильной работы синхронизации в будущем. Для исключения ручного запуска процедуру можно перевести на регулярный автоматический обмен данными между базами 1С по расписанию.