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

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

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

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

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

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

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

Что именно нужно проверить в запросе

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

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

Проверка синтаксиса в конфигураторе

Если запрос находится в модуле — в коде обработки, отчёта или общего модуля, — первый уровень контроля даёт сам конфигуратор. Откройте модуль и выполните проверку: меню «Конфигурация» → «Проверка конфигурации» либо контекстная проверка модуля (Ctrl+F7 в окне модуля). Платформа найдёт незакрытые кавычки, ошибки в структуре текста запроса и обращения к несуществующим объектам метаданных, если текст запроса задан литералом.

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

Удобный приём — вынести текст запроса в конструктор. В модуле поставьте курсор внутрь строки с запросом, вызовите контекстное меню и откройте «Конструктор запроса». Если конструктор открыл текст без ошибок и показывает список полей и таблиц, базовый синтаксис корректен. Если конструктор не смог разобрать текст — в нём есть ошибка, и платформа покажет её место.

Проверка запроса в консоли запросов

Консоль запросов — основной инструмент интерактивной проверки. В типовых конфигурациях на БСП она доступна в разделе «Инструменты разработчика» (при включённом режиме технического специалиста), также существуют внешние консоли, которые запускаются через «Файл → Открыть». Порядок работы одинаковый.

Порядок проверки в консоли запросов
  1. 1
    Скопируйте текст запроса из модуля в консоль
  2. 2
    Заполните таблицу параметров: каждому параметру (&Период, &Склад) задайте значение реального типа
  3. 3
    Выполните запрос и убедитесь, что нет сообщения об ошибке
  4. 4
    Проверьте количество строк и содержимое ключевых колонок
  5. 5
    Сравните итоги с эталонным отчётом или записью в базе

Чаще всего при переносе запроса в консоль забывают параметры. Параметр должен получить значение того же типа, что и в коде: дата — датой, ссылка — ссылкой на конкретный элемент, список — массивом или списком значений. Если передать в параметр «СписокСкладов» одну ссылку вместо списка, условие «В (&СписокСкладов)» отработает иначе, и вы будете проверять не тот запрос, который выполняется в программе.

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

Отладка запроса в реальном коде

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

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

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

bsl
// Быстрая проверка результата в отладке или коде
РезультатЗапроса = Запрос.Выполнить();
Если РезультатЗапроса.Пустой() Тогда
    Сообщить("Запрос не вернул данных. Проверьте параметры.");
КонецЕсли;
Выборка = РезультатЗапроса.Выбрать();
Пока Выборка.Следующий() Цикл
    Сообщить(Строка(Выборка.Номенклатура) + " : " + Выборка.Количество);
КонецЦикла;

Проверка корректности данных результата

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

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

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

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

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

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

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

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

Строк больше из-за дублей или меньше из-за внутреннего соединения

Итоговые суммы
Норма

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

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

Суммы завышены (дубли) или занижены (потеряны строки)

Пустой результат
Норма

Данных за период действительно нет — проверено отчётом

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

Параметр пуст или не того типа, условие отсекает всё

Время выполнения
Норма

Выполняется за приемлемое время на копии рабочей базы

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

Зависает на больших данных — нет отбора по индексированным полям

Производительность и временные таблицы

Медленный запрос — тоже неправильный запрос, если из-за него отчёт открывается минутами. Главные причины медленной работы: обращение к виртуальной таблице регистра без параметров отбора (платформа читает весь регистр), соединения по неиндексированным полям, условия с функциями над полем вместо прямого сравнения, выборка «лишних» полей и соединений.

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

Параметры виртуальных таблиц задавайте всегда, когда они есть: период, условия по измерениям. Запись вида РегистрНакопления.ТоварыНаСкладах.Остатки(&Период, Склад = &Склад) принципиально быстрее, чем выборка из всех остатков с фильтрацией в условии ГДЕ.

Типичные ошибки при проверке запросов
01
Проверка на пустой тестовой базе — запрос «летает», а на рабочей базе зависает из-за объёма данных
02
Параметр в консоли задан другого типа, чем в коде — проверяется не тот запрос
03
Соединение без учёта дублей — суммы в результате завышены, и это замечают только пользователи
04
Внутреннее соединение вместо левого — строки без связанных данных молча теряются
05
Виртуальная таблица без параметров отбора — читается весь регистр, запрос работает минутами
06
Проверка только факта выполнения без сверки итогов с типовым отчётом

Безопасная проверка на рабочей базе

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

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

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

Как выбрать способ проверки

Нужно быстро проверить синтаксис и посмотреть данныеИспользуйте консоль запросов с заполненными параметрами
Запрос в консоли работает, а в программе нетОтладчик: проверьте фактические значения параметров в точке останова
Запрос работает, но медленноВыполняйте по частям в консоли, добавьте параметры виртуальных таблиц и временные таблицы
Нужно проверить на реальном объёме данныхСнимите копию рабочей базы и выполняйте проверку на ней
Запрос меняет данные или входит в транзакцию записиТолько копия базы, никаких экспериментов в продакшене

Когда стоит привлечь специалиста

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

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

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

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

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

Как проверить запрос, если нет консоли запросов?

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

Можно ли проверять запросы прямо на рабочей базе?

Читающие запросы (ВЫБРАТЬ) — можно, но осторожно: тяжёлый запрос способен замедлить работу пользователей. Объёмные и долгие проверки, а также всё, что связано с записью данных, выполняйте только на копии базы.

Почему суммы в результате запроса больше, чем в типовом отчёте?

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

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

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

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

Это признак синтаксической ошибки в тексте: платформа сообщит место проблемы. Частые варианты — незакрытая скобка, лишняя запятая перед ИЗ, поле, которого нет в источнике. Исправьте текст и откройте конструктор повторно.

Итог

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

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