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