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

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

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

Особенности объекта РезультатЗапроса в отладчике

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

Именно по этой причине при попытке просмотреть переменную с результатом запроса в окне Вычислить выражение (комбинация клавиш Shift+F9) или в табло отладчика кнопка детального просмотра значения (клавиша F2) будет неактивна. Платформа просто не может визуализировать курсор в виде строк и колонок.

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

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

Проанализируем два основных варианта просмотра данных через таблицу значений:

  1. Просмотр промежуточной переменной в коде: Если в тексте модуля результат запроса уже выгружается в переменную, например ТЗ = Результат.Выгрузить();, достаточно установить точку останова на следующей строке, открыть окно вычисления выражений, ввести имя переменной ТЗ и нажать клавишу F2. Откроется окно со строками и колонками выгруженных данных.
  2. Вычисление «на лету» без изменения кода: Если в коде программы результат сразу направляется в выборку (Результат.Выбрать()), нам нет необходимости специально дописывать лишние переменные в рабочий код. Прямо в окне отладчика Вычислить выражение напишем следующее выражение:Запрос.Выполнить().Выгрузить()

    или, если переменная с результатом уже получена:

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

    После нажатия клавиши Enter и последующего нажатия F2 откроется полноценный табличный документ со всеми данными запроса.

Способ 2. Просмотр данных временных таблиц в отладчике

Когда запрос использует МенеджерВременныхТаблиц, данные часто помещаются во временные таблицы (конструкция ПОМЕСТИТЬ). Чтобы проверить корректность их заполнения без вывода в отдельный финальный запрос, воспользуемся штатным свойством менеджера.

У объекта МенеджерВременныхТаблиц есть коллекция Таблицы. Мы можем получить содержимое любой временной таблицы прямо в окне отладки:

МенеджерВТ.Таблицы.Найти("НоменклатураДокумента").ПолучитьДанные().Выгрузить()

Метод ПолучитьДанные() возвращает РезультатЗапроса временной таблицы, к которому мы применяем метод Выгрузить() для открытия через клавишу F2.

Если же мы переводим работу на пакетные запросы (когда несколько запросов объединены в одном тексте через точку с запятой «;»), для анализа промежуточных таблиц рекомендуется использовать специальный метод платформы ВыполнитьПакетСПромежуточнымиДанными():

Запрос.ВыполнитьПакетСПромежуточнымиДанными()[0].Выгрузить()

В отличие от базового метода ВыполнитьПакет(), данный вызов возвращает массив с полноценными результатами запросов для каждого подзапроса пакета, включая те, которые содержат инструкцию ПОМЕСТИТЬ.

Анализ причин: почему выгруженная таблица значений пустая?

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

  1. Ошибки в условиях соединения таблиц (ПО / ON): Это частая логическая ошибка при ручном написании кода. Проанализируем фрагмент ошибочного кода:
    
    ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.СтоимостьМатериалов.Остатки(...) КАК СтоимостьМатериаловОстатки 
    ПО НоменклатураДокумента.Номенклатура = СтоимостьМатериаловОстатки.СтоимостьОстаток
    

    В этом примере поле ссылки Номенклатура сопоставляется с числовым ресурсом СтоимостьОстаток. Ссылка никогда не будет равна числу, условие соединения не выполняется. Если следом используется ВНУТРЕННЕЕ СОЕДИНЕНИЕ, любая нестыковка условий полностью исключает все строки из итогового результата.

  2. Необоснованное использование внутреннего соединения: Использование ВНУТРЕННЕЕ СОЕДИНЕНИЕ вместо ЛЕВОЕ СОЕДИНЕНИЕ приводит к тому, что если по номенклатуре нет записей хотя бы в одном регистре (например, по материалу еще нет остатков на складе), вся строка номенклатуры документа полностью отсекается из выборки. Для получения остатков всегда следует использовать левое соединение от таблицы документа.
  3. Отсутствие параметра периода в виртуальных таблицах: Если при вызове виртуальной таблицы остатков Остатки() первым параметром не передан момент времени, расчет остатков выполняется на текущую дату и время работы системы. При проведении документа «задним числом» остатки на текущую секунду могут уже отсутствовать, из-за чего запрос вернет пустые значения. Всегда передавайте параметр границы:РегистрНакопления.ОстаткиМатериалов.Остатки(&МоментВремени, Материал В (...))
  4. Отсутствие движений в базе данных: Запрос не сможет вернуть остатки, если по выбранным материалам ранее не было оформлено документов поступления или оприходования. Перед отладкой проведения документов расхода необходимо убедиться, что начальные остатки фактически присутствуют в регистрах накопления.
← На главную