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

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

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

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

Конструктор запроса — встроенный инструмент конфигуратора 1С, который позволяет собрать текст запроса на встроенном языке запросов без ручного написания кода. Он вызывается из модуля объекта, формы или консоли и превращает визуальные настройки — выбор таблиц, полей, условий и итогов — в готовый синтаксически корректный текст запроса.

Инструмент одинаково доступен в толстом и тонком клиенте при работе в конфигураторе, а также через контекстное меню в редакторе модуля. Для новичков конструктор снижает риск синтаксических ошибок, а для опытных разработчиков ускоряет сборку сложных запросов с несколькими соединениями, объединениями и вложенными выборками.

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

Где находится конструктор и как его вызвать

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

Если текст запроса написан с ошибками и платформа не может его разобрать, конструктор предложит вариант «Конструктор запроса с обработкой результата» либо откажется открываться. В таком случае проще временно очистить текст и собрать запрос заново.

Второй сценарий — конструктор встроен в поля настройки запроса в управляемых формах, в динамических списках (при включённом произвольном запросе) и в настройках СКД на вкладке «Наборы данных». Там он открывается кнопкой с «карандашом» рядом с полем текста запроса.

Выбор таблиц и полей: вкладка «Таблицы и поля»

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

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

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

Порядок сборки простого запроса
  1. 1
    Откройте конструктор из модуля и перейдите на вкладку «Таблицы и поля»
  2. 2
    Добавьте нужную таблицу из панели «База данных» в список таблиц
  3. 3
    Для виртуальной таблицы задайте параметры (период, условия) через кнопку настройки
  4. 4
    Перенесите в «Поля» только нужные колонки и задайте им псевдонимы
  5. 5
    На вкладке «Условия» добавьте отборы с параметрами (&Параметр)
  6. 6
    Нажмите «ОК» и проверьте сформированный текст запроса
  7. 7
    Выполните запрос в отладке и проверьте результат через Выгрузить()

Связи таблиц и условия отбора

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

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

На вкладке «Условия» отборы добавляются перетаскиванием поля и выбором оператора: равно, в списке, между, подобно. Значения лучше задавать параметрами (&Номенклатура), а не литералами — параметризованный запрос безопаснее, переиспользуемее и позволяет платформе кэшировать план выполнения.

Типичные ошибки
01
Фильтрация по виртуальной таблице в ГДЕ вместо параметров виртуальной таблицы — запрос читает лишние данные и работает медленнее
02
Условие по правой таблице в ГДЕ при левом соединении — строки с пустыми значениями пропадают из результата
03
Выбор всех полей таблицы «на всякий случай» — лишний сетевой трафик и память при выгрузке в таблицу значений
04
Соединение по неиндексированному полю или по выражению — резкое падение производительности на больших таблицах

Группировки, итоги и порядок

Вкладка «Группировка» отвечает за агрегирование: поля делятся на группировочные и суммируемые, для последних выбирается агрегатная функция — Сумма, Количество, Максимум, Минимум, Среднее. Конструктор сам расставляет функцию ГДЕ по правилам: группировочные поля в ГРУППИРОВКА ПО, агрегатные — в список выборки.

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

Сортировка задаётся на вкладке «Порядок». Здесь же включается опция «Автоупорядочивание»: платформа сама добавит сортировку по ссылке или дате, если явный порядок не задан. Для запросов, где порядок критичен (например, проведение по партиям), полагаться только на автоупорядочивание не стоит — задайте порядок явно.

Объединения и вложенные запросы

Вкладка «Объединения/Псевдонимы» позволяет добавить в запрос несколько выборок, объединённых через ОБЪЕДИНИТЬ или ОБЪЕДИНИТЬ ВСЕ. Каждое объединение редактируется как отдельный подзапрос с собственными таблицами и условиями; конструктор следит за соответствием количества и типов полей. Разница принципиальна: ОБЪЕДИНИТЬ убирает дубликаты и работает медленнее, ОБЪЕДИНИТЬ ВСЕ просто складывает выборки — если дубликаты невозможны по смыслу, используйте второй вариант.

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

Альтернатива вложенным запросам — временные таблицы через пакетные запросы (конструктор тоже поддерживает закладки пакета). На сложных выборках временные таблицы часто читаются и отлаживаются проще: каждый промежуточный результат можно проверить отдельно через менеджер временных таблиц.

Что выбрать для промежуточных данных

Вложенный запрос

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

Временная таблица

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

Прямое соединение без промежутков

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

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

После нажатия «ОК» конструктор вставляет текст в модуль. Минимальный рабочий код для проверки выглядит так: создать объект Запрос, установить текст, задать параметры через УстановитьПараметр, выполнить и выгрузить результат в таблицу значений.

bsl
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| Остатки.Номенклатура КАК Номенклатура,
| Остатки.КоличествоОстаток КАК Остаток
|ИЗ
| РегистрНакопления.ТоварыНаСкладах.Остатки(&Период, Склад = &Склад) КАК Остатки";
Запрос.УстановитьПараметр("Период", ТекущаяДатаСеанса());
Запрос.УстановитьПараметр("Склад", Склад);
Результат = Запрос.Выполнить().Выгрузить();

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

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

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

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

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

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

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

Строк больше (дубли от соединения) или меньше (лишний отбор)

Значения в колонках
Норма

Заполнены, типы соответствуют ожиданию

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

NULL там, где должны быть данные — проблема в соединении

Суммы по числовым полям
Норма

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

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

Расхождения — проверьте параметры виртуальной таблицы и период

Ограничения конструктора и когда писать запрос вручную

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

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

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

Итог

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

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

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

Можно ли открыть конструктор для уже написанного вручную запроса?

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

Почему конструктор не видит мой регистр или документ?

Чаще всего дело в том, что объект добавлен в конфигурацию, но конфигурация базы данных не обновлена. Выполните обновление конфигурации базы данных (F7 в конфигураторе) и откройте конструктор заново. Также проверьте, что вы ищете объект в правильной ветке дерева «База данных».

Чем отличается «Конструктор запроса с обработкой результата»?

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

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

Используйте условие «В» с параметром: в конструкторе на вкладке «Условия» выберите оператор «В (&Список)», а в коде передайте через УстановитьПараметр массив или список значений. Платформа сама развернёт коллекцию в условие. Для отбора по группе справочника используйте «В ИЕРАРХИИ».

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

Типовые причины: отбор задан в ГДЕ вместо параметров виртуальной таблицы, соединение по неиндексированному полю или по выражению, выбираются лишние поля, ОБЪЕДИНИТЬ вместо ОБЪЕДИНИТЬ ВСЕ. Проверьте эти пункты по порядку — в большинстве случаев ускорение достигается без переписывания логики запроса.

Есть ли конструктор запроса в режиме «Предприятие»?

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