При обработке входящих файлов 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) в зависимости от своего юридического статуса и страны регистрации может описываться разными тегами:
oref:UL — Российское юридическое лицо.oref:FL — Индивидуальный предприниматель РФ (физическое лицо).oref:TS — Контрагент — резидент стран Таможенного союза.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.Значение;
КонецЕсли;
КонецЕсли;
КонецЕсли;
При таком подходе обработка файла пройдет успешно вне зависимости от того, кем является производитель продукции — российским юридическим лицом, ИП или иностранной организацией.