К статье
Практический материал

Разработка и Конфигурация · 12 мин

Как проверить результат запроса в 1С

Как проверить результат запроса 1С: методы Пустой(), Выгрузить(), консоль запросов, отладчик и типовые ошибки при работе с результатом запроса.

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

Проверка результата нужна в трёх типовых ситуациях: когда запрос вернул пустой результат и алгоритм должен это корректно обработать; когда данные есть, но их состав или количество не совпадают с ожиданиями; когда запрос сложный (с итогами, группировками, объединениями) и нужно убедиться, что структура выборки соответствует логике обхода. Ниже разобраны рабочие способы проверки — от быстрых приёмов в отладчике до консоли запросов и типовых ошибок.

Что возвращает метод Выполнить() и как устроен результат

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

Важно понимать: «РезультатЗапроса» нельзя просто «посмотреть глазами» в табло отладчика — в нём не отобразятся строки. Поэтому стандартный приём при отладке — временно выгрузить результат в таблицу значений и изучить её. Таблица значений, в отличие от результата запроса, отлично просматривается в отладчике: видны колонки, типы и каждая строка.

Если запрос содержит итоги (конструкция ИТОГИ ПО), выгрузка по умолчанию даст таблицу с итоговыми строками, а Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкам) — дерево значений. Это принципиально разные структуры, и путать их нельзя: обход дерева и обход плоской таблицы пишутся по-разному.

Быстрая проверка: есть ли данные вообще

Первый и самый дешёвый по производительности способ — метод Пустой(). Он возвращает «Истина», если запрос не вернул ни одной записи. Типовой шаблон выглядит так:

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

Если РезультатЗапроса.Пустой() Тогда

// Данных нет: выводим сообщение или пропускаем обработку

Возврат;

КонецЕсли;

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

Пока Выборка.Следующий() Цикл

// Обработка строк

КонецЦикла;

Частая ошибка — проверять наличие данных через Выборка.Количество() без предварительной проверки на пустоту или вместо неё. Метод Количество() у выборки работает, но для некоторых типов выборок (например, по группировкам) может требовать полного обхода данных, что медленнее. Проверка Пустой() — канонический вариант.

Обратная ситуация: запрос должен вернуть ровно одну строку (например, поиск элемента по уникальному коду), а вернул несколько или ни одной. Здесь после проверки на пустоту полезно выгрузить результат и посмотреть ТаблицаРезультата.Количество(). Если строк больше одной — значит, условие отбора недостаточно точное, и дальнейшая обработка «первой попавшейся» строки даст непредсказуемый результат.

Проверка содержимого через выгрузку в таблицу значений

Метод Выгрузить() превращает результат в таблицу значений — это основной способ увидеть данные целиком. В отладчике поставьте точку останова после строки с выгрузкой, затем через «Вычислить выражение» (Shift+F9) откройте переменную с таблицей: конфигуратор покажет её в виде привычной таблицы с колонками и строками.

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

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

// Точка останова здесь — смотрим ТаблицаРезультата в отладчике

При просмотре обращайте внимание на три вещи. Первая — состав колонок: все ли поля из секции ВЫБРАТЬ присутствуют и совпадают ли имена (псевдонимы через КАК). Вторая — типы значений: например, поле, которое вы ожидаете как ссылку, может оказаться NULL из-за левого соединения без совпадений. Третья — количество строк и наличие дублей: дубли при соединениях — классический признак того, что связь идёт по неуникальному полю.

Контрольные точки

Как проверить выгруженную таблицу

Количество строк
Норма

Совпадает с ожидаемым числом записей по условию отбора

Тревожный признак

Строк больше (дубли при соединении) или ноль при заведомо существующих данных

Значения полей
Норма

Поля заполнены ожидаемыми типами: ссылки, числа, даты

Тревожный признак

NULL в полях, которые по логике обязаны быть заполнены

Состав колонок
Норма

Все поля из запроса присутствуют с ожидаемыми именами

Тревожный признак

Колонка отсутствует или названа иначе — обращение по имени в коде упадёт с ошибкой

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

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

Порядок работы такой: скопируйте текст запроса из модуля, подставьте реальные значения параметров (те, которые передаются через УстановитьПараметр()), выполните и проанализируйте результат. Если данные в консоли корректны, а в коде — нет, проблема почти наверняка в параметрах: не тот тип значения, неинициализированная переменная, дата без времени или наоборот.

Порядок отладки запроса в консоли
  1. 1
    Скопируйте текст запроса из модуля в консоль запросов
  2. 2
    Задайте параметры теми же значениями, что передаёт код (проверьте тип каждого параметра)
  3. 3
    Выполните запрос и проверьте количество строк и содержимое полей
  4. 4
    Если результат пустой — упрощайте запрос: убирайте условия по одному, пока данные не появятся
  5. 5
    Перенесите исправленный текст обратно в модуль и проверьте в отладчике

Отдельно проверяйте параметры виртуальных таблиц: период регистра накопления, отбор по измерениям. Частая ситуация — запрос к виртуальной таблице «Остатки» без указания периода возвращает текущие остатки, а разработчик ожидал остатки на конкретную дату. В консоли это видно сразу, в коде — только по косвенным признакам.

Отладка в конфигураторе: что смотреть в точке останова

Если консоли под рукой нет, достаточно отладчика. Установите точку останова на строке после Выполнить(), запустите отладку и используйте «Вычислить выражение» для проверки: РезультатЗапроса.Пустой() покажет наличие данных, РезультатЗапроса.Выгрузить() — откроет таблицу для просмотра прямо в диалоге вычисления.

Для проверки параметров запроса вычислите выражение Запрос.Параметры — откроется структура со всеми установленными параметрами и их значениями. Здесь ловятся типовые ошибки: параметр не установлен (тогда запрос может вернуть пустой результат или ошибку), параметр содержит пустую ссылку, параметр-дата срезана до начала дня, хотя нужен конец дня.

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

Типовые ошибки при проверке результата и как их избежать

Первая группа ошибок связана с NULL. Любое левое соединение, поле через точку от ссылки (разыменование), агрегатная функция по пустому набору могут дать NULL. Сравнение Если Выборка.Сумма = 0 не сработает для NULL — условие будет ложным, но и значение не нулевое. Проверяйте явно: Выборка.Сумма = NULL или используйте функцию ЕСТЬNULL() прямо в тексте запроса.

Вторая группа — дубли строк. Если запрос соединяет таблицы по неуникальному ключу (например, документ с табличной частью без соединения по номеру строки), результат размножается. Признак — количество строк кратно больше ожидаемого, а итоговые суммы завышены. Проверка проста: выгрузите результат и сравните число строк с количеством записей в основной таблице без соединений.

Третья группа — обход результата с группировками как плоской таблицы. Если в запросе есть ИТОГИ, а вы используете Выбрать() без указания типа обхода, в выборку попадут и итоговые строки, где детальные поля равны NULL. Либо обходите с ОбходРезультатаЗапроса.ПоГруппировкам, либо проверяйте тип записи выборки.

Типичные ошибки
01
Обращение к полю выборки, которого нет в запросе — ошибка «Поле не найдено» при первой итерации
02
Сравнение поля с нулём вместо проверки на NULL — условие не срабатывает, дефект остаётся незамеченным
03
Проверка результата через Количество() вместо Пустой() — лишние затраты и неочевидное поведение с группировками
04
Игнорирование дублей после соединения — завышенные суммы в отчётах и проводках
05
Отладка запроса только в коде без консоли — долгий поиск причины пустого результата

Когда результата нет: разбор пустого запроса

Если Пустой() возвращает «Истина», хотя данные в базе точно есть, двигайтесь методом исключения. Сначала выполните запрос вообще без условий ГДЕ — если данных нет и тут, проблема в соединениях или в самом источнике (например, регистр действительно пуст за нужный период). Затем возвращайте условия по одному и смотрите, какое из них «убивает» результат.

Чаще всего виноваты: условие по дате (период передан без времени, и граница срезала данные), сравнение ссылок разных типов, условие по строковому полю с учётом регистра или лишних пробелов, отбор по параметру, который оказался пустой ссылкой. Проверка каждого параметра в отладчике через Запрос.Параметры закрывает большинство таких случаев за минуты.

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

Если запрос использует менеджер временных таблиц и пакетное выполнение, метод Выполнить() вернёт только результат последнего запроса пакета. Чтобы проверить промежуточные результаты, используйте ВыполнитьПакет() — он возвращает массив результатов, по одному на каждый запрос пакета. Каждый элемент массива проверяется теми же методами: Пустой(), Выгрузить().

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

Для Каждого Результат Из Результаты Цикл

Если Не Результат.Пустой() Тогда

ТаблицаДанных = Результат.Выгрузить();

// Просмотр в отладчике

КонецЕсли;

КонецЦикла;

Для проверки содержимого временной таблицы после выполнения пакета добавьте в конец пакета выборку из неё (ВЫБРАТЬ * ИЗ ВТ_Имя) — временно, на период отладки. Это самый надёжный способ увидеть, что реально попало во временную таблицу, вместо догадок о промежуточных данных.

Итог

Что важно запомнить

Проверка результата запроса строится на трёх методах: Пустой() — есть ли данные, Выгрузить() — что именно вернул запрос, Выбрать() — построчный обход. Отлаживайте текст запроса в консоли, параметры смотрите в отладчике, а NULL и дубли проверяйте всегда — это самые частые источники скрытых дефектов.

Частые вопросы о проверке результата запроса

Чем отличается Выгрузить() от Выбрать()?

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

Как посмотреть результат запроса без изменения кода?

В отладчике на точке останова после Выполнить() откройте «Вычислить выражение» и введите РезультатЗапроса.Выгрузить() — таблица откроется для просмотра без правки модуля. Для проверки параметров вычислите Запрос.Параметры.

Почему запрос в консоли возвращает данные, а в коде — пустой результат?

Почти всегда причина в параметрах: в коде они имеют другой тип или значение (пустая ссылка, дата без времени, незаполненная переменная). Сравните значения параметров в консоли и в отладчике через Запрос.Параметры — расхождение найдётся сразу.

Как проверить, вернул ли запрос ровно одну строку?

Выгрузите результат методом Выгрузить() и проверьте ТаблицаРезультата.Количество() = 1. Если строк больше — условие отбора недостаточно уникально, и брать первую строку выборки небезопасно.

Что делать, если поле выборки содержит NULL?

Лучшее решение — обработать NULL на уровне запроса функцией ЕСТЬNULL(Поле, ЗначениеПоУмолчанию). Если запрос менять нельзя, проверяйте в коде через сравнение с NULL до использования значения в расчётах или сравнениях.

Как проверить результат запроса с итогами?

Используйте Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкам) — получите дерево значений, где видны уровни группировок и итоговые строки. В отладчике дерево просматривается по узлам, что позволяет сверить итоги на каждом уровне с ожидаемыми значениями.