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

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

Как посмотреть выборку в 1С в отладчике

Как посмотреть содержимое выборки запроса в отладчике 1С: табло, вычисление выражений, обход выборки, типичные ошибки и способы проверить данные.

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

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

Ниже разобраны все основные способы просмотра выборки в конфигураторе 1С, ограничения каждого подхода и типичные ошибки, из-за которых данные «не видно» в отладчике.

Как устроена выборка и почему её не видно в табло

Когда выполняется код вида Выборка = Запрос.Выполнить().Выбрать();, в переменной оказывается объект «ВыборкаИзРезультатаЗапроса». Это не коллекция данных, а механизм последовательного чтения: строки подтягиваются по мере вызова метода Следующий(). Пока обход не начат, выборка «не знает» ни одной строки, и в табло отображается только тип объекта без содержимого.

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

Способ 1. Выгрузка результата запроса в таблицу значений

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

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

Отладчик покажет таблицу значений, которую можно раскрыть двойным щелчком и пролистать все строки и колонки в отдельном окне. Это позволяет сразу оценить объём данных, увидеть значения всех полей и проверить соответствие ожиданиям.

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

Порядок действий
  1. 1
    Поставьте точку останова на строке после выполнения запроса и запустите отладку
  2. 2
    Откройте окно «Вычислить выражение» сочетанием Shift+F9
  3. 3
    Введите выражение РезультатЗапроса.Выгрузить() и нажмите «Вычислить»
  4. 4
    Дважды щёлкните по полученной таблице значений, чтобы открыть её содержимое
  5. 5
    Проверьте количество строк и значения нужных колонок

Способ 2. Просмотр полей текущей строки в цикле обхода

Если нужно наблюдать данные по мере обхода, поставьте точку останова внутри цикла Пока Выборка.Следующий() Цикл. На каждой итерации в переменной Выборка доступны поля текущей строки — их можно смотреть через табло (Ctrl+Alt+W) или вычисление выражений: Выборка.Номенклатура, Выборка.Сумма и так далее.

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

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

Обход с группировками и итогами

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

Способ 3. Временный код для отладки

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

// Временно для отладки

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

Поставьте точку останова на следующей строке — переменная ТЗ появится в списке локальных переменных, и таблицу можно открыть из окна «Локальные переменные» без ручного ввода выражений. После завершения отладки строку нужно удалить.

Что делать, если выборка пустая

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

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

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

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

РезультатЗапроса.Пустой
Норма

Ложь — строки есть, можно обходить

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

Истина — запрос ничего не вернул, проверяйте параметры

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

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

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

Строк меньше или больше — проверяйте отборы и соединения

Значения параметров запроса в табло
Норма

Параметры заполнены ожидаемыми значениями

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

Параметр не установлен или содержит пустое значение

Типичные ошибки при просмотре выборки

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

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

Альтернативы отладчику: консоль запросов и сообщения

Если цель — просто проверить, что вернул запрос, отладчик не всегда нужен. Консоль запросов (внешняя обработка) позволяет выполнить тот же текст запроса с теми же параметрами и сразу увидеть таблицу результата без остановки кода. Это быстрее, когда проблема в самом запросе, а не в логике обхода.

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

Сравнение вариантов

Выгрузка результата в таблицу значений

Лучший обзор всех данных сразу; на больших результатах расходует память

Просмотр полей текущей строки в цикле

Подходит для пошагового анализа логики обхода; не показывает картину целиком

Консоль запросов

Быстрая проверка самого запроса без отладки; не показывает контекст исполнения кода

Сообщить() или журнал регистрации

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

Итог

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

Выборка — потоковый объект, её содержимое в табло не видно. Смотрите данные через РезультатЗапроса.Выгрузить(), поля текущей строки в цикле или консоль запросов. Временный отладочный код после проверки удаляйте.

Частые вопросы

Почему в табло выборка показывает только тип объекта без строк?

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

Как посмотреть выборку, если результат запроса не сохранён в переменную?

Составьте выражение заново в окне «Вычислить выражение»: Запрос.Выполнить().Выгрузить(). Учтите, что запрос выполнится повторно, поэтому для тяжёлых запросов лучше заранее изменить код и сохранить результат в отдельную переменную.

Можно ли вернуться к предыдущей строке выборки?

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

Как отладить выборку в фоновом задании, где отладчик не подключается?

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

Почему при обращении к полю выборки возникает ошибка «Поле не найдено»?

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

Чем консоль запросов лучше отладчика для проверки данных?

Консоль запросов показывает результат сразу в виде таблицы, позволяет менять параметры и текст запроса без перезапуска сеанса. Она удобнее, когда нужно проверить сам запрос, а не логику обработки его результатов в коде.