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