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