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

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

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

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

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

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

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

Как открыть конструктор запросов

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

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

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

Порядок действий
  1. 1
    Откройте модуль и поставьте курсор в место вставки запроса
  2. 2
    Правый клик → «Конструктор запроса…»
  3. 3
    Выберите таблицы и поля на закладке «Таблицы и поля»
  4. 4
    Настройте связи, условия, группировки и итоги
  5. 5
    Нажмите «ОК» и проверьте сформированный текст запроса

Закладка «Таблицы и поля»: основа запроса

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

Чтобы добавить таблицу, перетащите её мышью в среднюю область или выделите и нажмите кнопку со стрелкой. Затем из выбранной таблицы перенесите нужные поля в правую область. Порядок полей в списке определяет порядок колонок в результате запроса — его можно менять кнопками перемещения.

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

Связи между таблицами

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

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

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

Условия, группировки и итоги

На закладке «Условия» формируется секция ГДЕ. Условия можно строить из полей таблиц, сравнивать их с параметрами запроса (перед именем параметра ставится символ «&»), константами или результатами выражений. Параметры передаются из кода через метод УстановитьПараметр объекта запроса.

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

Закладка «Итоги» управляет итоговыми записями результата: по каким полям строить итоги и нужны ли общие итоги. Итоги удобны при обходе выборки методом ОбходРезультатаЗапроса.ПоГруппировкам — код получает вложенную структуру без ручного накопления сумм.

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

Объединения, порядок и дополнительные возможности

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

На закладке «Порядок» настраивается сортировка результата (секция УПОРЯДОЧИТЬ ПО), а также автоматическое упорядочивание. Для запросов, результат которых выводится пользователю, сортировку лучше задавать явно — порядок строк без неё не гарантирован и может меняться между выполнениями.

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

Сравнение вариантов

Конструктор запросов

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

Ручное написание текста

Нужно для сложных случаев: вложенные запросы с тонкой настройкой, пакетные запросы к временным таблицам, конструкции, не поддерживаемые конструктором. Требует знания синтаксиса.

Консоль запросов (внешняя обработка)

Используется для отладки на реальных данных в режиме предприятия. Позволяет выполнить запрос и увидеть результат без запуска отчёта.

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

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

Самый быстрый способ отладки — консоль запросов: внешняя обработка, которая выполняет текст запроса в режиме предприятия и показывает таблицу результата. Туда же удобно переносить параметры и экспериментировать с условиями, не перезапуская отчёт.

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

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

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

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

Совпадает с ожидаемым числом записей по логике выборки

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

Строк кратно больше — вероятно, ошибка в условии связи

Суммы
Норма

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

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

Суммы завышены — дублирование при соединении

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

Запрос выполняется за секунды на рабочей базе

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

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

Ограничения конструктора и типичные ошибки

Конструктор не поддерживает весь синтаксис языка запросов. Пакетные запросы с временными таблицами (ВЫБРАТЬ … ПОМЕСТИТЬ) он открывает ограниченно или не открывает вовсе, сложные вложенные запросы может отображать некорректно. Если при открытии существующего текста конструктор сообщает о невозможности разбора — редактируйте запрос вручную.

Ещё одно ограничение: конструктор работает только в конфигураторе. В режиме предприятия его нет, поэтому для отладки на живых данных нужны внешние инструменты — консоль запросов или консоль кода.

Типичные ошибки при работе с конструктором повторяются у большинства начинающих разработчиков и легко устраняются, если знать о них заранее.

Типичные ошибки
01
Отбор в секции ГДЕ вместо параметров виртуальной таблицы — запрос читает лишние данные и работает медленнее
02
Левое соединение там, где нужно внутреннее, или наоборот — в результате лишние пустые строки или потерянные записи
03
Не заданы псевдонимы полей — в коде приходится обращаться к колонкам по индексу, что хрупко при изменении запроса
04
Использование ОБЪЕДИНИТЬ вместо ОБЪЕДИНИТЬ ВСЕ без необходимости — лишняя сортировка и потеря производительности
05
Забытый УстановитьПараметр в коде — запрос падает с ошибкой или возвращает пустой результат

FAQ

Как открыть конструктор, если запрос уже написан вручную?

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

Почему конструктор не открывает мой запрос?

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

Чем отличается ОБЪЕДИНИТЬ от ОБЪЕДИНИТЬ ВСЕ?

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

Как передать параметр в запрос из кода?

В тексте запроса параметр обозначается символом «&» перед именем, например &Период. В коде после создания объекта Запрос вызовите метод УстановитьПараметр: Запрос.УстановитьПараметр("Период", НужнаяДата). Все параметры, использованные в тексте, должны быть установлены до вызова Выполнить(), иначе возникнет ошибка.

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

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

Почему запрос с виртуальной таблицей работает медленно?

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

Итог

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

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