1С Ошибка: Поле агрегатного объекта не обнаружено — Причины и решение
- Ошибка выполнения:
{ОбщийМодуль.Имя.Модуль(Строка)}: Поле агрегатного объекта не обнаружено (ИмяПоля). - Сбой возникает при обращении к несуществующему ключу
Структуры, колонкеТаблицыЗначений, реквизитуШапкиили строкиТабличнойЧасти. - Ошибка проявляется при изменении формата ответа стороннего REST/JSON API или обновлении метаданных.
1. Безопасное чтение свойств структуры с помощью метода Свойство()
Вместо прямого обращения через точку Параметры.МоеПоле используйте метод Свойство():
// НЕВЕРНО (вызовет ошибку, если ключа нет):
// Значение = ДанныеКлиента.Телефон;
// ВЕРНО:
ЗначениеТелефона = "";
Если ДанныеКлиента.Свойство("Телефон", ЗначениеТелефона) Тогда
// Поле существует, значение помещено в переменную ЗначениеТелефона
Сообщить("Телефон: " + ЗначениеТелефона);
Иначе
// Поле отсутствует в структуре
ЗаписьЖурналаРегистрации("Внимание", УровеньЖурналаРегистрации.Предупреждение,,, "Поле Телефон не найдено в структуре!");
КонецЕсли;2. Проверка наличия колонок в Таблице Значений
Перед обращением к строке таблицы проверьте наличие нужной колонки:
Если ТаблицаТоваров.Колонки.Найти("СуммаСкидки") <> Неопределено Тогда
Для Каждого Стр Из ТаблицаТоваров Цикл
Стр.СуммаСкидки = 0;
КонецЦикла;
КонецЕсли;3. Проверка типов перед обращением через точку
Если переменная содержит Неопределено или примитивный тип вместо агрегатного объекта (Структуры / Выборки / Строки):
// Защитная проверка
Если ТипЗнч(СтрокаДерева) = Тип("СтрокаДереваЗначений") Тогда
СтрокаДерева.Количество = 10;
КонецЕсли;4. Проверка регистра и опечаток в именах реквизитов
Проверьте точное соответствие имени реквизита в дереве метаданных Конфигуратора (опечатки, смешение латинских и русских букв 'C', 'O', 'A', 'P').
Частые вопросы (FAQ)
Что такое 'Агрегатный объект' в терминологии 1С?
Агрегатный объект — это составной тип данных, содержащий коллекцию именованных элементов или свойств: Структура, Соответствие, ТаблицаЗначений, СтрокаТабличнойЧасти, ВыборкаИзРезультатаЗапроса, COMSafeArray.
В чем разница между Структурой и Соответствием при обращении к несуществующему ключу?
Обращение к несуществующему ключу Структуры через точку (Структура.Поле) вызывает фатальную ошибку 'Поле агрегатного объекта не обнаружено'. Соответствие при обращении по индексу (Соответствие[Ключ]) возвращает значение 'Неопределено' без ошибки.
Как создать структуру, которая не падает при обращении к отсутствующим полям?
Используйте объект ФиксированнаяСтруктура или используйте объект Соответствие вместо Структуры.
Почему ошибка возникает в отчете на СКД?
Если в выражении поля СКД указан путь к реквизиту, который был удален из метаданных или переименован при обновлении конфигурации.