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