При написании программного кода для обработки результатов запросов с группировками разработчики нередко сталкиваются с ошибкой времени выполнения «Метод объекта не обнаружен». Разберем по шагам, почему возникает эта исключительная ситуация, как ее исправить, а также рассмотрим правильные приемы работы с выборками запроса при наличии секции ИТОГИ.
Рассмотрим типовой фрагмент кода, в котором выполняется запрос с итогами и последующий обход по группировкам:
ВыборкаРегистратор = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
Пока ВыборкаРегистратор.Следующий() Цикл
ВыборкаСтрока = ВыборкаРегистратор.Выбрать();
Пока ВыборкаСтрока.Следущий() Цикл
// Обработка детальных записей
КонецЦикла;
КонецЦикла;
При выполнении этого кода платформа 1С сообщает об ошибке: Метод объекта не обнаружен (Следующий) или указывает на неверное имя метода. Проанализируем ситуацию:
Следущий() (без буквы «ю»). Платформа 1С строго проверяет имена методов встроенного языка. Правильное написание — Следующий(). Подобная опечатка часто маскируется в тексте модуля и сложно выявляется визуально.Выбрать() вызван у объекта, который вернул не ВыборкаИзРезультатаЗапроса, а Неопределено или другой тип данных, не содержащий метода перебора строк.Исправим опечатку и посмотрим на корректный вариант обхода выборки верхнего и детального уровней:
РезультатЗапроса = Запрос.Выполнить();
// Выборка верхнего уровня группировки
ВыборкаРегистратор = РезультатЗапроса.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
Пока ВыборкаРегистратор.Следующий() Цикл
// Получение детальных записей для текущей группировки
ВыборкаСтрока = ВыборкаРегистратор.Выбрать();
Пока ВыборкаСтрока.Следующий() Цикл
// Доступ к полям детальной записи
Сообщить("Регистратор: " + Строка(ВыборкаСтрока.Регистратор) + ", Номер строки: " + Строка(ВыборкаСтрока.НомерСтроки));
КонецЦикла;
КонецЦикла;
Рассмотрим подробнее нюансы использования методов объекта РезультатЗапроса и ВыборкаИзРезультатаЗапроса:
ИТОГИ ПО (например, ИТОГИ ПО Организация, Номенклатура), при получении выборки подчиненного уровня рекомендуется явно указывать имя группировки вторым параметром: ВыборкаОрганизация.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам, "Номенклатура").ИТОГИ ... ОБЩИЕ, первый вызов метода Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам) возвращает строку общих итогов. Для перехода к первой группировке потребуется сначала вызвать ВыборкаОбщая.Следующий(), и только затем получать подчиненные выборки.Выборка.Выбрать() без параметров по умолчанию использует ОбходРезультатаЗапроса.Прямой и возвращает детальные записи текущей ветки группировки.Если требуется обработать результаты запроса с группировками без вложенных циклов по выборкам, можно воспользоваться выгрузкой в дерево значений:
РезультатЗапроса = Запрос.Выполнить();
ДеревоРезультата = РезультатЗапроса.Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкам);
Для Каждого СтрокаГруппировки Из ДеревоРезультата.Строки Цикл
// Обработка данных уровня группировки
Для Каждого СтрокаДеталей Из СтрокаГруппировки.Строки Цикл
// Обработка детальных записей
КонецЦикла;
КонецЦикла;
Выгрузка в ДеревоЗначений удобна для последующей передачи данных на сторону клиента или визуального отображения в элементах формы.