Как исправить ошибку «Значение не представляет агрегатный объект (ВыбратьУзел)» при разборе XML в 1С 7.7?

Программист 1С v7.7 Торговля и дистрибуция
← На главную

При обработке входящих файлов XML (например, приходных ТТН ЕГАИС) в платформе 1С 7.7 разработчики часто сталкиваются с ошибкой выполнения: «Значение не представляет агрегатный объект (ВыбратьУзел)». Рассмотрим подробно причины возникновения этой проблемы и разберем правильные варианты её решения.

Выясним причину возникновения ошибки

Проанализируем фрагмент кода, в котором происходит сбой:


Producer = Product.ВыбратьУзел("pref:Producer");
UL = Producer.ВыбратьУзел("oref:UL");
ТЗ.ClientRegIdПроизв = UL.ВыбратьУзел("oref:ClientRegId").Значение;

Данная ошибка возникает в строке UL.ВыбратьУзел(...) в тех случаях, когда переменная UL не содержит объект узла XML (возвращает пустое значение). В языке 1С 7.7 попытка вызвать метод у переменной, которая не является агрегатным объектом, приводит к аварийному завершению работы обработки.

В контексте файлов ЕГАИС это означает, что внутри тега pref:Producer отсутствует узел oref:UL. Разработчик рассчитывал, что производителем всегда является юридическое лицо РФ, однако структура XML-файлов ЕГАИС предусматривает различные типы контрагентов.

Разберем типы контрагентов в форматах ЕГАИС

В схемах XML ЕГАИС производитель или импортер товара (блок pref:Producer) в зависимости от своего юридического статуса и страны регистрации может описываться разными тегами:

  1. oref:UL — Российское юридическое лицо.
  2. oref:FL — Индивидуальный предприниматель РФ (физическое лицо).
  3. oref:TS — Контрагент — резидент стран Таможенного союза.
  4. oref:FO — Иностранный контрагент (иностранная организация/импортер).

Если в поступающей ТТН указан иностранный производитель, структура файла имеет следующий вид:


<pref:Producer>
    <oref:FO>
        <oref:ClientRegId>050000027008</oref:ClientRegId>
        <oref:FullName>Фэмели Брюери БЕРНАРД</oref:FullName>
        ...
    </oref:FO>
</pref:Producer>

При попытке выполнить Producer.ВыбратьУзел("oref:UL") для такого файла метод возвращает пустое значение, так как тег oref:UL отсутствует в дереве XML. Следующая строка кода пытается вызвать метод ВыбратьУзел у пустой переменной, что и вызывает сбой.

Способы решения и исправление алгоритма

Для предотвращения подобных ошибок в 1С 7.7 необходимо добавить проверку существования каждого получаемого узла и реализовать поддержку всех возможный типов контрагентов.

1. Проверка существования узлов перед вызовом методов

Перед тем как обращаться к свойствам или методам узла (например, .Значение или .ВыбратьУзел()), обязательно проверяем его с помощью функции ПустоеЗначение().

2. Универсальная обработка всех видов контрагентов

Рассмотрим пример корректной обработки, которая проверяет наличие каждого из возможных тегов контрагента:


Producer = Product.ВыбратьУзел("pref:Producer");
Если ПустоеЗначение(Producer) = 0 Тогда

    // Последовательно ищем узел контрагента по возможным типам
    УзелКонтрагента = Producer.ВыбратьУзел("oref:UL");
    
    Если ПустоеЗначение(УзелКонтрагента) = 1 Тогда
        УзелКонтрагента = Producer.ВыбратьУзел("oref:FO");
    КонецЕсли;
    
    Если ПустоеЗначение(УзелКонтрагента) = 1 Тогда
        УзелКонтрагента = Producer.ВыбратьУзел("oref:FL");
    КонецЕсли;
    
    Если ПустоеЗначение(УзелКонтрагента) = 1 Тогда
        УзелКонтрагента = Producer.ВыбратьУзел("oref:TS");
    КонецЕсли;
    
    // Если узел контрагента найден, получаем его реквизиты
    Если ПустоеЗначение(УзелКонтрагента) = 0 Тогда
        УзелRegId = УзелКонтрагента.ВыбратьУзел("oref:ClientRegId");
        Если ПустоеЗначение(УзелRegId) = 0 Тогда
            ТЗ.ClientRegIdПроизв = УзелRegId.Значение;
        КонецЕсли;
    КонецЕсли;

КонецЕсли;

При таком подходе обработка файла пройдет успешно вне зависимости от того, кем является производитель продукции — российским юридическим лицом, ИП или иностранной организацией.

← На главную