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

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

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

Практическое руководство по отладке запросов в 1С: консоль запросов, точки останова, просмотр параметров и временных таблиц, типичные ошибки и способы их устранения.

Запрос в 1С «не работает» в трёх типичных ситуациях: возвращает пустой результат, возвращает не те данные или падает с ошибкой синтаксиса. Во всех трёх случаях причина почти всегда одна из четырёх: неверные параметры, ошибка в соединениях таблиц, неучтённые виртуальные таблицы и их параметры, либо проблема с типами данных в условиях. Найти её быстрее всего не перечитыванием текста запроса, а пошаговой отладкой с реальными данными.

Инструментов для этого несколько: встроенная консоль запросов в конфигураторе, отладчик с точками останова, внешние консоли запросов с диска ИТС и вывод результата в табличный документ. Каждый способ подходит для своей ситуации: консоль удобна для проверки логики на живых данных, отладчик — когда нужно увидеть, какие именно значения попадают в параметры в момент выполнения кода.

Ниже разобраны оба подхода, приёмы разбора сложных запросов с временными таблицами, типичные ошибки и способы проверить результат до того, как запрос попадёт в рабочий код.

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

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

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

Отладчик конфигуратора нужен, когда запрос формируется динамически или параметры вычисляются в коде. Он показывает, какие значения реально попадают в запрос в момент выполнения, — часто оказывается, что в параметр уходит пустая ссылка, Неопределено или значение не того типа.

Сравнение инструментов

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

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

Отладчик конфигуратора

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

Внешние консоли с ИТС

Подходят для сложных запросов с временными таблицами и пакетами. Ограничение: требуют установки и прав на запуск внешних обработок.

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

Это основной и самый быстрый способ. Порядок действий одинаков для большинства ситуаций.

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

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

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

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

Как отладить запрос через отладчик конфигуратора

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

Поставьте точку останова на строке Запрос.Выполнить() или сразу после неё. Запустите отладку (F5) и воспроизведите действие пользователя. Когда выполнение остановится, откройте табло (Shift+F9) и проверьте:

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

Отдельно полезен приём с выводом результата в табличный документ: временно добавьте в код выгрузку результата и вывод через ТабличныйДокумент. Это позволяет увидеть данные глазами, не вычисляя выражения в табло, и удобно при отладке в файловой базе, где нельзя долго держать точку останова в многопользовательском режиме.

bsl
// Временный код для просмотра результата запроса
Результат = Запрос.Выполнить().Выгрузить();
ТабДок = Новый ТабличныйДокумент;
// выводим первые строки для проверки
Для Каждого СтрокаРезультата Из Результат Цикл
    Сообщить(СтрокаРезультата.Номенклатура);
КонецЦикла;

Как разбирать сложные запросы с временными таблицами

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

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

Обратите внимание на менеджер временных таблиц: в коде он создаётся отдельно (Новый МенеджерВременныхТаблиц), и все запросы пакета должны использовать один и тот же менеджер. Если в консоли вы выполняете запросы по отдельности без общего менеджера, временные таблицы «потеряются» между выполнениями — это особенность инструмента, а не ошибка запроса.

Типичные ошибки в запросах и как их найти

Большинство проблем с запросами сводится к ограниченному набору причин. Знание этого списка сокращает отладку с часов до минут.

Первая группа — ошибки параметров. В параметр передаётся Неопределено, пустая ссылка или значение другого типа, чем поле, с которым идёт сравнение. Сравнение с NULL через обычное равенство всегда даёт ложь — для проверки на NULL используйте ЕСТЬ NULL. Вторая частая ситуация — сравнение даты без учёта времени: условие Дата = &Дата не найдёт документы, если в параметре начало дня, а в данных есть время.

Вторая группа — ошибки соединений. Внутреннее соединение (ВНУТРЕННЕЕ СОЕДИНЕНИЕ) отсекает строки, которым нет пары, — если исчезли данные, проверьте, не нужно ли левое соединение. Обратная проблема — дублирование строк при соединении с таблицей, где на одну запись приходится несколько совпадений. Признак — суммы в итоге завышены ровно в целое число раз.

Третья группа — ошибки виртуальных таблиц. У регистров остатков и сведений параметры виртуальной таблицы (период, условия) задаются в скобках после имени таблицы, а не в секции ГДЕ. Условие в ГДЕ по виртуальной таблице сначала выбирает все данные, а потом фильтрует — это и медленнее, и иногда даёт другой результат, особенно с остатками на дату.

Типичные ошибки
01
Сравнение поля с NULL через равенство — условие никогда не срабатывает, нужно ЕСТЬ NULL
02
Внутреннее соединение вместо левого — строки без пары пропадают из результата
03
Условие на виртуальную таблицу в секции ГДЕ вместо параметров — лишние данные и потеря производительности
04
Параметр-дата без учёта времени — документы за день не попадают в выборку
05
Дубли строк при соединении один-ко-многим — завышенные суммы в итогах
06
Отладка не того текста запроса — при динамической сборке копируется исходник, а выполняется другая строка

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

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

Для проверки корректности сопоставьте результат запроса с эталоном: стандартным отчётом по тому же регистру, данными формы документа или ручным подсчётом на маленьком контрольном примере. Если в запросе есть итоги и группировки, проверьте суммы на граничных случаях: пустой период, один документ, документ с нулевым количеством.

Производительность проверяйте на объёме данных, близком к рабочему. Запрос, летящий на тестовой базе с сотней документов, может выполняться минутами на реальных данных. Основные признаки проблем: соединение по неиндексированным полям, выборка всех данных виртуальной таблицы с последующей фильтрацией, функции в условиях соединения. На клиент-серверной базе для глубокого анализа используется план запроса СУБД, но для большинства задач достаточно устранить перечисленные приёмы.

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

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

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

Совпадает с эталонным отчётом или ручным подсчётом

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

Строк больше (дубли при соединении) или меньше (лишнее условие, внутреннее соединение)

Суммы и итоги
Норма

Сходятся с данными стандартного отчёта по тому же регистру

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

Суммы кратно завышены — дублирование при соединении один-ко-многим

Граничные случаи
Норма

Пустой период и единичный документ обрабатываются корректно

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

На пустых данных ошибка или лишние строки

Скорость выполнения
Норма

Запрос выполняется за приемлемое время на объёме, близком к рабочему

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

На рабочих объёмах запрос выполняется неприемлемо долго

Когда отладкой запроса проблему не решить

Иногда запрос синтаксически и логически верен, но данные всё равно «не те». В этом случае причина лежит вне текста запроса, и дальнейшая правка запроса только запутает ситуацию.

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

Маршрут решения

Как выбрать действие

Запрос возвращает пустой результатПроверьте значения параметров в отладчике и условия соединений, замените внутренние соединения на левые для диагностики
Результат есть, но данные неверныеВыполните запрос по частям в консоли и сверьте каждую временную таблицу с исходными данными
Под администратором работает, под пользователем — нетПроверьте RLS и права на объекты, отлаживайте под проблемным пользователем
Запрос работает, но медленноПеренесите условия виртуальных таблиц из ГДЕ в параметры и проверьте индексацию полей соединений

Часто задаваемые вопросы

Можно ли отладить запрос, не запуская всю операцию проведения документа?

Да. Скопируйте текст запроса в консоль запросов, подставьте параметры вручную и выполните его отдельно. Если запрос формируется динамически, поставьте точку останова после сборки текста и возьмите итоговую строку из табло — тогда в консоли будет именно тот запрос, который выполняется в коде.

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

Почти всегда причина в параметрах: в коде передаётся другое значение, другой тип или Неопределено. Проверьте в отладчике Запрос.Параметры перед выполнением. Вторая возможная причина — RLS: консоль запускается под администратором, а код выполняется под пользователем с ограничениями доступа.

Как посмотреть содержимое временной таблицы при отладке?

Во внешних консолях запросов с диска ИТС есть просмотр временных таблиц пакета. Без такой консоли добавьте в пакет отдельный запрос вида ВЫБРАТЬ * ИЗ ИмяВременнойТаблицы и выполните его последним, либо в отладчике создайте отдельный объект Запрос с тем же менеджером временных таблиц и выгрузите результат.

Чем отличается условие в параметрах виртуальной таблицы от условия в секции ГДЕ?

Параметры виртуальной таблицы применяются на этапе выборки данных из регистра — выбирается только нужное. Условие в ГДЕ фильтрует уже выбранный набор. Для остатков на дату разница принципиальна: неправильное размещение условия может изменить результат, а не только скорость.

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

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

Нужно ли отлаживать запрос в клиент-серверной базе иначе, чем в файловой?

Логика отладки та же, но есть нюансы: в клиент-серверном варианте отладку на сервере нужно включить в свойствах кластера, а для анализа производительности доступен план запроса СУБД. Держать длительную точку останова на рабочем сервере не стоит — это блокирует сеанс и может мешать пользователям.

Итог

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

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