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