Разработка и Конфигурация · 12 мин
Как проверить результат запроса в 1С
Как проверить результат запроса 1С: методы Пустой(), Выгрузить(), консоль запросов, отладчик и типовые ошибки при работе с результатом запроса.
Результат запроса в 1С — это объект типа «РезультатЗапроса», который возвращает метод Выполнить(). Сам по себе он не содержит данных в удобном виде: чтобы понять, что вернул запрос, нужно либо проверить его на пустоту, либо выгрузить в таблицу значений или дерево, либо обойти выборкой. Ошибка на этом этапе — одна из самых частых причин «молчаливых» дефектов: код работает, но обрабатывает не те данные, которые ожидал разработчик.
Проверка результата нужна в трёх типовых ситуациях: когда запрос вернул пустой результат и алгоритм должен это корректно обработать; когда данные есть, но их состав или количество не совпадают с ожиданиями; когда запрос сложный (с итогами, группировками, объединениями) и нужно убедиться, что структура выборки соответствует логике обхода. Ниже разобраны рабочие способы проверки — от быстрых приёмов в отладчике до консоли запросов и типовых ошибок.
Что возвращает метод Выполнить() и как устроен результат
Метод Запрос.Выполнить() возвращает объект «РезультатЗапроса». У него есть три ключевых инструмента работы: метод Пустой() — проверка на отсутствие записей, метод Выгрузить() — получение таблицы значений или дерева значений, и метод Выбрать() — получение выборки для построчного обхода. Пока вы не вызвали один из этих методов, данные фактически не материализованы в памяти в пригодном для просмотра виде.
Важно понимать: «РезультатЗапроса» нельзя просто «посмотреть глазами» в табло отладчика — в нём не отобразятся строки. Поэтому стандартный приём при отладке — временно выгрузить результат в таблицу значений и изучить её. Таблица значений, в отличие от результата запроса, отлично просматривается в отладчике: видны колонки, типы и каждая строка.
Если запрос содержит итоги (конструкция ИТОГИ ПО), выгрузка по умолчанию даст таблицу с итоговыми строками, а Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкам) — дерево значений. Это принципиально разные структуры, и путать их нельзя: обход дерева и обход плоской таблицы пишутся по-разному.
Быстрая проверка: есть ли данные вообще
Первый и самый дешёвый по производительности способ — метод Пустой(). Он возвращает «Истина», если запрос не вернул ни одной записи. Типовой шаблон выглядит так:
РезультатЗапроса = Запрос.Выполнить();
Если РезультатЗапроса.Пустой() Тогда
// Данных нет: выводим сообщение или пропускаем обработку
Возврат;
КонецЕсли;
Выборка = РезультатЗапроса.Выбрать();
Пока Выборка.Следующий() Цикл
// Обработка строк
КонецЦикла;
Частая ошибка — проверять наличие данных через Выборка.Количество() без предварительной проверки на пустоту или вместо неё. Метод Количество() у выборки работает, но для некоторых типов выборок (например, по группировкам) может требовать полного обхода данных, что медленнее. Проверка Пустой() — канонический вариант.
Обратная ситуация: запрос должен вернуть ровно одну строку (например, поиск элемента по уникальному коду), а вернул несколько или ни одной. Здесь после проверки на пустоту полезно выгрузить результат и посмотреть ТаблицаРезультата.Количество(). Если строк больше одной — значит, условие отбора недостаточно точное, и дальнейшая обработка «первой попавшейся» строки даст непредсказуемый результат.
Проверка содержимого через выгрузку в таблицу значений
Метод Выгрузить() превращает результат в таблицу значений — это основной способ увидеть данные целиком. В отладчике поставьте точку останова после строки с выгрузкой, затем через «Вычислить выражение» (Shift+F9) откройте переменную с таблицей: конфигуратор покажет её в виде привычной таблицы с колонками и строками.
РезультатЗапроса = Запрос.Выполнить();
ТаблицаРезультата = РезультатЗапроса.Выгрузить();
// Точка останова здесь — смотрим ТаблицаРезультата в отладчике
При просмотре обращайте внимание на три вещи. Первая — состав колонок: все ли поля из секции ВЫБРАТЬ присутствуют и совпадают ли имена (псевдонимы через КАК). Вторая — типы значений: например, поле, которое вы ожидаете как ссылку, может оказаться NULL из-за левого соединения без совпадений. Третья — количество строк и наличие дублей: дубли при соединениях — классический признак того, что связь идёт по неуникальному полю.
Как проверить выгруженную таблицу
Совпадает с ожидаемым числом записей по условию отбора
Строк больше (дубли при соединении) или ноль при заведомо существующих данных
Поля заполнены ожидаемыми типами: ссылки, числа, даты
NULL в полях, которые по логике обязаны быть заполнены
Все поля из запроса присутствуют с ожидаемыми именами
Колонка отсутствует или названа иначе — обращение по имени в коде упадёт с ошибкой
Проверка запроса в консоли запросов до вставки в код
Профессиональная практика — отладить текст запроса отдельно от кода, в консоли запросов. Для управляемых форм существуют как встроенные в типовые конфигурации инструменты (например, «Консоль запросов» в составе подсистем разработчика), так и широко распространённые внешние обработки. Консоль позволяет выполнить запрос с реальными параметрами и сразу увидеть таблицу результата.
Порядок работы такой: скопируйте текст запроса из модуля, подставьте реальные значения параметров (те, которые передаются через УстановитьПараметр()), выполните и проанализируйте результат. Если данные в консоли корректны, а в коде — нет, проблема почти наверняка в параметрах: не тот тип значения, неинициализированная переменная, дата без времени или наоборот.
- 1Скопируйте текст запроса из модуля в консоль запросов
- 2Задайте параметры теми же значениями, что передаёт код (проверьте тип каждого параметра)
- 3Выполните запрос и проверьте количество строк и содержимое полей
- 4Если результат пустой — упрощайте запрос: убирайте условия по одному, пока данные не появятся
- 5Перенесите исправленный текст обратно в модуль и проверьте в отладчике
Отдельно проверяйте параметры виртуальных таблиц: период регистра накопления, отбор по измерениям. Частая ситуация — запрос к виртуальной таблице «Остатки» без указания периода возвращает текущие остатки, а разработчик ожидал остатки на конкретную дату. В консоли это видно сразу, в коде — только по косвенным признакам.
Отладка в конфигураторе: что смотреть в точке останова
Если консоли под рукой нет, достаточно отладчика. Установите точку останова на строке после Выполнить(), запустите отладку и используйте «Вычислить выражение» для проверки: РезультатЗапроса.Пустой() покажет наличие данных, РезультатЗапроса.Выгрузить() — откроет таблицу для просмотра прямо в диалоге вычисления.
Для проверки параметров запроса вычислите выражение Запрос.Параметры — откроется структура со всеми установленными параметрами и их значениями. Здесь ловятся типовые ошибки: параметр не установлен (тогда запрос может вернуть пустой результат или ошибку), параметр содержит пустую ссылку, параметр-дата срезана до начала дня, хотя нужен конец дня.
При обходе выборки в цикле полезно проверять значения полей на каждой итерации: вычисляйте Выборка.ИмяПоля и сверяйте с ожиданием. Если обращение к полю вызывает ошибку «Поле не найдено», значит, в тексте запроса поле либо отсутствует, либо имеет другой псевдоним — имена в выборке должны точно совпадать с псевдонимами после КАК.
Типовые ошибки при проверке результата и как их избежать
Первая группа ошибок связана с NULL. Любое левое соединение, поле через точку от ссылки (разыменование), агрегатная функция по пустому набору могут дать NULL. Сравнение Если Выборка.Сумма = 0 не сработает для NULL — условие будет ложным, но и значение не нулевое. Проверяйте явно: Выборка.Сумма = NULL или используйте функцию ЕСТЬNULL() прямо в тексте запроса.
Вторая группа — дубли строк. Если запрос соединяет таблицы по неуникальному ключу (например, документ с табличной частью без соединения по номеру строки), результат размножается. Признак — количество строк кратно больше ожидаемого, а итоговые суммы завышены. Проверка проста: выгрузите результат и сравните число строк с количеством записей в основной таблице без соединений.
Третья группа — обход результата с группировками как плоской таблицы. Если в запросе есть ИТОГИ, а вы используете Выбрать() без указания типа обхода, в выборку попадут и итоговые строки, где детальные поля равны NULL. Либо обходите с ОбходРезультатаЗапроса.ПоГруппировкам, либо проверяйте тип записи выборки.
Когда результата нет: разбор пустого запроса
Если Пустой() возвращает «Истина», хотя данные в базе точно есть, двигайтесь методом исключения. Сначала выполните запрос вообще без условий ГДЕ — если данных нет и тут, проблема в соединениях или в самом источнике (например, регистр действительно пуст за нужный период). Затем возвращайте условия по одному и смотрите, какое из них «убивает» результат.
Чаще всего виноваты: условие по дате (период передан без времени, и граница срезала данные), сравнение ссылок разных типов, условие по строковому полю с учётом регистра или лишних пробелов, отбор по параметру, который оказался пустой ссылкой. Проверка каждого параметра в отладчике через Запрос.Параметры закрывает большинство таких случаев за минуты.
Проверка результата пакетного запроса и временных таблиц
Если запрос использует менеджер временных таблиц и пакетное выполнение, метод Выполнить() вернёт только результат последнего запроса пакета. Чтобы проверить промежуточные результаты, используйте ВыполнитьПакет() — он возвращает массив результатов, по одному на каждый запрос пакета. Каждый элемент массива проверяется теми же методами: Пустой(), Выгрузить().
Результаты = Запрос.ВыполнитьПакет();
Для Каждого Результат Из Результаты Цикл
Если Не Результат.Пустой() Тогда
ТаблицаДанных = Результат.Выгрузить();
// Просмотр в отладчике
КонецЕсли;
КонецЦикла;
Для проверки содержимого временной таблицы после выполнения пакета добавьте в конец пакета выборку из неё (ВЫБРАТЬ * ИЗ ВТ_Имя) — временно, на период отладки. Это самый надёжный способ увидеть, что реально попало во временную таблицу, вместо догадок о промежуточных данных.
Что важно запомнить
Проверка результата запроса строится на трёх методах: Пустой() — есть ли данные, Выгрузить() — что именно вернул запрос, Выбрать() — построчный обход. Отлаживайте текст запроса в консоли, параметры смотрите в отладчике, а NULL и дубли проверяйте всегда — это самые частые источники скрытых дефектов.
Частые вопросы о проверке результата запроса
Чем отличается Выгрузить() от Выбрать()?
Выгрузить() материализует весь результат в таблицу значений в памяти — удобно для просмотра и многократного обращения к данным, но затратно по памяти на больших выборках. Выбрать() возвращает выборку для последовательного построчного обхода — экономнее по памяти, но данные читаются один раз в одном направлении.
Как посмотреть результат запроса без изменения кода?
В отладчике на точке останова после Выполнить() откройте «Вычислить выражение» и введите РезультатЗапроса.Выгрузить() — таблица откроется для просмотра без правки модуля. Для проверки параметров вычислите Запрос.Параметры.
Почему запрос в консоли возвращает данные, а в коде — пустой результат?
Почти всегда причина в параметрах: в коде они имеют другой тип или значение (пустая ссылка, дата без времени, незаполненная переменная). Сравните значения параметров в консоли и в отладчике через Запрос.Параметры — расхождение найдётся сразу.
Как проверить, вернул ли запрос ровно одну строку?
Выгрузите результат методом Выгрузить() и проверьте ТаблицаРезультата.Количество() = 1. Если строк больше — условие отбора недостаточно уникально, и брать первую строку выборки небезопасно.
Что делать, если поле выборки содержит NULL?
Лучшее решение — обработать NULL на уровне запроса функцией ЕСТЬNULL(Поле, ЗначениеПоУмолчанию). Если запрос менять нельзя, проверяйте в коде через сравнение с NULL до использования значения в расчётах или сравнениях.
Как проверить результат запроса с итогами?
Используйте Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкам) — получите дерево значений, где видны уровни группировок и итоговые строки. В отладчике дерево просматривается по узлам, что позволяет сверить итоги на каждом уровне с ожидаемыми значениями.