Почему возникает ошибка «Метод объекта не обнаружен (Следующий)» при обходе выборки запроса?

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

При написании программного кода для обработки результатов запросов с группировками разработчики нередко сталкиваются с ошибкой времени выполнения «Метод объекта не обнаружен». Разберем по шагам, почему возникает эта исключительная ситуация, как ее исправить, а также рассмотрим правильные приемы работы с выборками запроса при наличии секции ИТОГИ.

Анализ причины ошибки

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


ВыборкаРегистратор = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
Пока ВыборкаРегистратор.Следующий() Цикл
    ВыборкаСтрока = ВыборкаРегистратор.Выбрать();
    Пока ВыборкаСтрока.Следущий() Цикл
        // Обработка детальных записей
    КонецЦикла;
КонецЦикла;

При выполнении этого кода платформа 1С сообщает об ошибке: Метод объекта не обнаружен (Следующий) или указывает на неверное имя метода. Проанализируем ситуацию:

  1. Опечатка в имени метода: В коде вложенного цикла вызван метод Следущий() (без буквы «ю»). Платформа 1С строго проверяет имена методов встроенного языка. Правильное написание — Следующий(). Подобная опечатка часто маскируется в тексте модуля и сложно выявляется визуально.
  2. Неверный тип объекта в переменной: Ошибка «Метод объекта не обнаружен» может возникать, если метод Выбрать() вызван у объекта, который вернул не ВыборкаИзРезультатаЗапроса, а Неопределено или другой тип данных, не содержащий метода перебора строк.

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

Исправим опечатку и посмотрим на корректный вариант обхода выборки верхнего и детального уровней:


РезультатЗапроса = Запрос.Выполнить();

// Выборка верхнего уровня группировки
ВыборкаРегистратор = РезультатЗапроса.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);

Пока ВыборкаРегистратор.Следующий() Цикл
    // Получение детальных записей для текущей группировки
    ВыборкаСтрока = ВыборкаРегистратор.Выбрать();
    
    Пока ВыборкаСтрока.Следующий() Цикл
        // Доступ к полям детальной записи
        Сообщить("Регистратор: " + Строка(ВыборкаСтрока.Регистратор) + ", Номер строки: " + Строка(ВыборкаСтрока.НомерСтроки));
    КонецЦикла;
КонецЦикла;

Особенности работы с методом Выбрать()

Рассмотрим подробнее нюансы использования методов объекта РезультатЗапроса и ВыборкаИзРезультатаЗапроса:

  1. Обход нескольких уровней группировок: Если в запросе присутствует несколько полей в секции ИТОГИ ПО (например, ИТОГИ ПО Организация, Номенклатура), при получении выборки подчиненного уровня рекомендуется явно указывать имя группировки вторым параметром: ВыборкаОрганизация.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам, "Номенклатура").
  2. Влияние общих итогов: Если в запросе указана конструкция ИТОГИ ... ОБЩИЕ, первый вызов метода Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам) возвращает строку общих итогов. Для перехода к первой группировке потребуется сначала вызвать ВыборкаОбщая.Следующий(), и только затем получать подчиненные выборки.
  3. Детальные записи: Вызов Выборка.Выбрать() без параметров по умолчанию использует ОбходРезультатаЗапроса.Прямой и возвращает детальные записи текущей ветки группировки.

Альтернативные способы обработки иерархических данных

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


РезультатЗапроса = Запрос.Выполнить();
ДеревоРезультата = РезультатЗапроса.Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкам);

Для Каждого СтрокаГруппировки Из ДеревоРезультата.Строки Цикл
    // Обработка данных уровня группировки
    Для Каждого СтрокаДеталей Из СтрокаГруппировки.Строки Цикл
        // Обработка детальных записей
    КонецЦикла;
КонецЦикла;

Выгрузка в ДеревоЗначений удобна для последующей передачи данных на сторону клиента или визуального отображения в элементах формы.

← На главную