Почему в консоли запросов возникает ошибка Метод объекта не обнаружен (Количество) и как ее исправить?

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

При работе в управляемом приложении 1С:Предприятие 8.3 многие разработчики сталкиваются с досадной ошибкой при использовании стандартной консоли запросов (обычно взятой с диска ИТС). Ошибка «Метод объекта не обнаружен (Количество)» внезапно прерывает выполнение запроса, хотя тот же самый запрос в конфигураторе или в составе системы компоновки данных (СКД) отрабатывает без нареканий. В рамках данной статьи мы подробно разберем природу этого сбоя, проанализируем изменения в платформе и внесем необходимые правки в код консоли для ее стабильной работы.

Разберем причину возникновения ошибки

Для начала проанализируем ситуацию: почему один и тот же запрос в одном инструменте работает, а в другом — нет? Ключ к разгадке кроется в структуре данных, которую возвращает запрос. В языке запросов 1С существует секция ИТОГИ. Именно она кардинально меняет поведение метода Выгрузить() объекта РезультатЗапроса.

Рассмотрим два сценария:

  1. Запрос без итогов: Платформа возвращает плоскую структуру — ТаблицаЗначений. У этого объекта есть метод Количество(), который возвращает число строк в таблице. Стандартный код консоли запросов рассчитывает на получение именно этого объекта.
  2. Запрос с использованием ИТОГИ: Если в тексте запроса присутствуют итоги, метод Выгрузить() по умолчанию возвращает иерархическую структуру — ДеревоЗначений.

Проанализируем технический нюанс: у объекта ДеревоЗначений отсутствует метод Количество() непосредственно «в корне». Чтобы узнать количество строк в дереве, необходимо обратиться к коллекции строк верхнего уровня через свойство Строки. Таким образом, когда программный код консоли пытается выполнить инструкцию РезультатЗапроса.Количество(), не проверяя тип объекта, платформа выбрасывает исключение, так как у дерева такого метода нет.

Влияние версии платформы (8.3.16 и выше)

Многие пользователи отмечают, что ошибка стала массово проявляться на релизах платформы начиная с 8.3.16.1063 и выше (например, в 8.3.17). Выясним причину такой закономерности. В новых версиях платформы были оптимизированы механизмы работы с менеджером временных таблиц и способы передачи данных между сервером и клиентом в управляемом приложении. В некоторых случаях платформа стала более строго типизировать результаты запросов, содержащих пакеты или итоги. Если старая консоль писалась под требования 1С 8.2, то изменения в логике работы МенеджерВременныхТаблиц и изменения в поведении функций выгрузки итогов в управляемом интерфейсе приводят к конфликту типов.

Пошаговое исправление кода консоли запросов

Если вы используете стандартную консоль запросов и не хотите переходить на альтернативные инструменты, проблему можно решить «хирургическим» путем, внеся изменения в модуль обработки. Рассмотрим процесс модификации кода.

Нам необходимо найти процедуру или функцию, отвечающую за вывод результата запроса в табличный документ. В типовых консолях с ИТС это обычно функция ВывестиРезультатОдногоЗапроса в модуле объекта (или в модуле формы, в зависимости от версии обработки).

Выполним следующие шаги по исправлению:

  1. Откроем обработку «Консоль запросов» в конфигураторе.
  2. Перейдем в модуль объекта и найдем место, где происходит обращение к методу Количество() для переменной, содержащей результат выгрузки запроса.
  3. Заменим прямой вызов метода на проверку типа объекта.

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


// Находим фрагмент, где определяется переменная КоличествоСтрок
// Было: КоличествоСтрок = РезультатЗапроса.Количество();

// Ставим безопасную проверку типа:
Если ТипЗнч(РезультатЗапроса) = Тип("ДеревоЗначений") Тогда
    КоличествоСтрок = РезультатЗапроса.Строки.Количество();
ИначеЕсли ТипЗнч(РезультатЗапроса) = Тип("ТаблицаЗначений") Тогда
    КоличествоСтрок = РезультатЗапроса.Количество();
Иначе
    // Обработка случая, если результат пуст или имеет неопределенный тип
    КоличествоСтрок = 0;
КонецЕсли;

// Далее продолжается стандартный вывод в табличный документ

После внесения этих изменений консоль научится «понимать», что ей вернули дерево итогов, и будет корректно обращаться к его строкам. Это позволит вам тестировать сложные запросы с иерархией прямо в консоли без падений системы.

Нюансы работы с секцией ИТОГИ в СКД

Рассмотрим ситуацию, описанную в сообщениях форума, когда программист пытается перенести рабочий запрос с итогами из консоли в Систему компоновки данных (СКД). Здесь возникает другая ошибка — синтаксическая.

Важно помнить: в запросах для наборов данных СКД нельзя использовать секцию ИТОГИ. Это архитектурное ограничение платформы. Рассмотрим, почему это так. Система компоновки данных — это мощный построитель, который берет на себя функции группировки, расчета итогов и формирования иерархии на основе настроек пользователя. Если вы добавите ИТОГИ в текст запроса внутри СКД, возникнет конфликт: СКД попытается наложить свои итоги поверх уже рассчитанных итогов запроса, что приведет к непредсказуемым результатам или ошибке парсера.

Если вам нужно перенести логику из консоли в отчет на СКД, просто удалите секцию ИТОГИ из текста запроса, а группировки и ресурсы настройте на соответствующих вкладках конструктора схемы компоновки данных. Для удобной работы с текстами запросов из модулей и отчетов СКД можно использовать инженерную консоль запросов для управляемых форм.

Профессиональные альтернативы консоли

Посмотрим на ситуацию шире. Стандартная консоль запросов с ИТС — это базовый инструмент, который часто не справляется с современными задачами. В обсуждении упоминались более продвинутые инструменты, которые разработчики называют «божественными». Проанализируем, что делает их такими удобными:

Если ваша текущая консоль постоянно выдает ошибки типа Метод объекта не обнаружен, возможно, это сигнал к тому, чтобы изучить более мощные альтернативы, такие как консоли от портала Инфостарт или консоль запросов в составе подсистемы «Инструменты разработчика» (ИР). Они изначально спроектированы с учетом особенностей ДеревоЗначений и корректно обрабатывают любые типы возвращаемых данных. В качестве готовой альтернативы подойдёт управляемая консоль запросов с поддержкой пакетных запросов и разбором дерева результата.

Заключение

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

← На главную