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