Как исправить ошибку проверки XDTO «Не установлено значение свойства: ЕдиницаИзмерения» при синхронизации УТ 11 и БП 3.0?

Программист 1С v8.3 (Управляемые формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

При обновлении конфигураций, особенно таких динамичных, как 1С:Управление торговлей 11, пользователи часто сталкиваются с тем, что отлаженные процессы синхронизации начинают давать сбои. Типичный пример — ошибка при вызове метода Проверить() в общем модуле ОбменДаннымиXDTOСервер. Рассмотрим подробнее, почему это происходит и как мы можем исправить ситуацию самостоятельно.

Анализ технической причины ошибки

Разберем текст ошибки, который мы видим в журнале регистрации. Сообщение указывает на то, что структура объекта Упаковка не соответствует типу КлючевыеСвойстваУпаковка из пространства имен EnterpriseData 1.6. Проблема заключается в том, что в XML-пакете, который формирует 1С для передачи в бухгалтерию, создается узел упаковки, но обязательный реквизит Наименование или ЕдиницаИзмерения внутри него оказывается пустым или неопределенным.

Проанализируем ситуацию: в новых релизах (начиная с 11.4.7.114 и выше) правила обмена через формат EnterpriseData стали гораздо строже относиться к типам данных. Если в документе (например, в «Заказе поставщику») реквизит Упаковка заполнен значением Неопределено или содержит «битую ссылку», XDTO-валидатор воспринимает это как попытку передать объект, который не заполнен до конца. В идеале, если упаковки не используются, поле должно содержать СправочникСсылка.УпаковкиЕдиницыИзмерения.ПустаяСсылка. Разберем по шагам, как локализовать и устранить этот дефект.

Шаг 1. Глубокая диагностика через отладчик

Поскольку ошибка возникает при выполнении фонового задания обмена, обычная точка останова может не сработать. Выясним причину, настроив отладку фоновых заданий:

  1. Откроем Конфигуратор.
  2. Перейдем в меню Отладка — Подключение. Нажмем кнопку Автоматическое подключение и установим флажок Фоновые задания.
  3. Установим режим «Остановка по ошибке». Для этого перейдем в Отладка — Остановка по ошибке, нажмем «Добавить» и выберем «Все ошибки» (или укажем конкретную, если мы опытные разработчики).
  4. Запустим синхронизацию из режима «Предприятие».

Когда отладчик «поймает» ошибку в модуле ОбменДаннымиXDTOСервер, проанализируем содержимое переменной ОбъектXDTO. Нам нужно добраться до коллекции Товары и найти ту строку, на которой спотыкается система. Посмотрим на выражение:

ОбъектXDTO.Товары.Строка[1].ДанныеНоменклатуры.Упаковка.ЕдиницаИзмерения

Если мы видим там Неопределено, значит, в самой базе данных 1С в табличной части документа записан мусор или некорректный тип данных, который визуально в интерфейсе может выглядеть как пустое поле.

Шаг 2. Проверка справочника упаковок

Иногда корень проблемы лежит в справочнике УпаковкиЕдиницыИзмерения. Даже если вы не используете упаковки, система может обращаться к ним. Рассмотрим, как проверить чистоту данных в справочнике:

  1. Зайдем в «Все функции» (или «Функции для технического специалиста»).
  2. Откроем справочник Упаковки и единицы измерения.
  3. Проверим, нет ли там записей с пустым наименованием или незаполненной единицей измерения.
  4. Особое внимание уделим тем позициям, которые связаны с номенклатурой из проблемного документа.

Важный момент: Если вы обнаружили записи, где реквизиты не заполнены, попробуйте перевыбрать их вручную. Как показывает практика, простая перезапись элемента справочника (нажать Enter в поле, чтобы установилась пустая ссылка вместо Null) часто решает проблему валидации XDTO.

Шаг 3. Исправление данных в документах (программный метод)

Если документов много, исправлять каждый вручную невозможно. Мы можем воспользоваться обработкой или написать небольшой код для очистки «фантомных» упаковок. Рассмотрим пример кода, который обходит табличную часть Товары в документе и гарантированно очищает поле упаковки, если оно заполнено неверно:


// Пример кода для исправления документов "Заказ поставщику"
Выборка = Документы.ЗаказПоставщику.Выбрать(ДатаНачала, ДатаОкончания);
Пока Выборка.Следующий() Цикл
    ОбъектДок = Выборка.ПолучитьОбъект();
    Модифицирован = Ложно;
    
    Для Каждого СтрокаТЧ Из ОбъектДок.Товары Цикл
        // Проверяем, если значение не является ссылкой или это битая ссылка
        Если ТипЗнч(СтрокаТЧ.Упаковка) <> Тип("СправочникСсылка.УпаковкиЕдиницыИзмерения") 
            Или СтрокаТЧ.Упаковка = Неопределено Тогда
            
            СтрокаТЧ.Упаковка = Справочники.УпаковкиЕдиницыИзмерения.ПустаяСсылка();
            Модифицирован = Истина;
        КонецЕсли;
    КонецЦикла;
    
    Если Модифицирован Тогда
        ОбъектДок.Записать(РежимЗаписиДокумента.Запись);
        Сообщить("Исправлен документ: " + ОбъектДок.Ссылка);
    КонецЕсли;
КонецЦикла;

В некоторых случаях, как отмечают специалисты на форумах, помогает даже присвоение пустой строки "", так как платформа 1С при записи сама приводит это к пустой ссылке нужного типа, очищая скрытые некорректные значения.

Шаг 4. Использование группового изменения реквизитов

Если вы не хотите писать код, воспользуемся стандартной обработкой «Групповое изменение реквизитов»:

  1. Выберем объект Заказ поставщику (или другой проблемный документ).
  2. Добавим условие отбора (например, по конкретной дате или ссылке).
  3. Нажмем «Дополнительные параметры» и установим флаг «Показывать служебные реквизиты».
  4. Найдем в списке Товары.Упаковка.
  5. Установим значение в состояние «Пустая ссылка» (выбрать из справочника и нажать «Очистить»).
  6. Выполним изменение.

Резюме и рекомендации

Проанализировав ситуацию, мы выяснили, что ошибка синхронизации — это следствие несоответствия данных в базе новым правилам валидации XDTO. Основные рекомендации по предотвращению подобных проблем в будущем:

После проведения очистки данных обязательно выполните ТиИ (Тестирование и исправление) с проверкой ссылочной целостности, чтобы исключить наличие объектов, ссылающихся на несуществующие записи в справочнике упаковок.

← На главную