Пошагово собираем запрос через конструктор в 1С
Содержание
Конструктор запросов открывается из модуля: ставите курсор в текст, правый клик → Конструктор запроса. Откроется окно с вкладками, где таблицы, поля, условия и группировка настраиваются мышью, а готовый текст на языке запросов 1С программа соберёт сама. Руками писать ВЫБРАТЬ … ИЗ … ГДЕ не нужно.
Инструмент один и тот же для отчётов, обработок, динамических списков и схемы компоновки данных. Ниже — как устроено окно конструктора в 1С 8.3, что делает каждая вкладка и как из таблиц, полей и условий получить рабочий запрос. Примеры даю на платформе 8.3 с интерфейсом «Такси».
Что делает конструктор и откуда его вызвать
Конструктор запросов — это визуальный сборщик текста запроса. Вы выбираете таблицы и поля в окне, а на выходе получаете готовый код, который читает данные из базы: остатки по складу, список контрагентов, суммы продаж за период.
Вызвать его можно из нескольких мест:
- 📝 Из модуля. Правый клик в тексте →
Конструктор запроса. Если выделения нет, конструктор создаёт запрос с нуля; если курсор стоит внутри уже написанного текста запроса — откроет его на редактирование. - ⚙️ С обработкой результата. В том же меню —
Конструктор запроса с обработкой результата. Кроме текста он сгенерирует и обвязку: создание объектаЗапрос, выполнение и цикл обхода выборки. - 📊 В схеме компоновки данных (СКД). На вкладке
Наборы данныхкнопкаКонструктор запросаоткрывает тот же инструмент для набора данных отчёта. - 📋 В динамическом списке формы. В свойствах списка у
Текста запросатоже есть кнопка вызова конструктора.
Если пункт Конструктор запроса в контекстном меню неактивен, значит курсор стоит вне строкового литерала или вне модуля, где запросы не используются. Поставьте курсор внутрь строки с текстом запроса.
Из каких вкладок состоит окно конструктора
Сверху окна — ряд вкладок. Их число меняется: пока таблица одна, вкладки Связи может не быть, а Группировка появляется, когда вы добавите агрегатную функцию. Разберём по порядку работы.
| Вкладка | За что отвечает |
|---|---|
| Таблицы и поля | Источники данных и какие поля попадут в результат |
| Связи | Соединение нескольких таблиц между собой |
| Группировка | Свёртка строк и агрегатные функции (сумма, количество) |
| Условия | Отбор строк — аналог ГДЕ |
| Дополнительно | РАЗЛИЧНЫЕ, ПЕРВЫЕ N, разрешённые для отбора |
| Объединения/Псевдонимы | Объединение запросов и имена колонок результата |
| Порядок | Сортировка строк — аналог УПОРЯДОЧИТЬ ПО |
| Итоги | Общие и промежуточные итоги — ИТОГИ … ПО |
Работают с конструктором обычно слева направо: сначала таблицы и поля, затем связи и условия, в конце — группировка и порядок. Но строгой очереди нет: вернуться на любую вкладку и поправить настройку можно в любой момент.
Добавление таблиц и псевдонимы
Основная вкладка — Таблицы и поля. Она разбита на три колонки.
- Слева — база данных. Дерево всех доступных таблиц: справочники, документы, регистры, перечисления, а также их виртуальные таблицы (
Остатки,Обороты,СрезПоследних). - В центре — выбранные таблицы. Перетащите нужную таблицу из левой колонки сюда двойным кликом или мышью.
- Справа — поля. Поля выбранных таблиц, которые попадут в результат.
Чтобы задать псевдоним таблицы, выделите её в центральной колонке и впишите короткое имя в поле Псевдоним (или нажмите клавишу, вызывающую свойства). Псевдоним — это сокращённое имя, по которому к таблице обращаются дальше в запросе. Вместо длинного РегистрНакопления.ТоварыНаСкладах.Остатки пишете, например, Остатки.
У виртуальных таблиц (остатки регистра, срез последних) есть собственные параметры: период, условия отбора. Выделите такую таблицу в центре и нажмите Параметры виртуальной таблицы — иначе остатки посчитаются на текущий момент, а не на нужную дату.
Псевдонимы обязательны, когда в запросе две таблицы с одинаковыми именами полей: без них платформа не поймёт, из какой таблицы брать Наименование.
Выбор полей, выражения и агрегаты
Поля в результат добавляют из правой колонки вкладки Таблицы и поля: перетаскиваете поле в область Поля. Можно тащить не только реквизиты верхнего уровня, но и поля через точку — Номенклатура.ЕдиницаИзмерения.Наименование.
Каждому полю результата тоже назначается псевдоним колонки — это имя, под которым значение будет доступно в выборке и в ячейке отчёта. Задаётся в столбце Имя поля области полей. В тексте запроса это превращается в конструкцию КАК:
ВЫБРАТЬ
Номенклатура.Наименование КАК Наименование,
Номенклатура.Артикул КАК Артикул
ИЗ
Справочник.Номенклатура КАК Номенклатура
Вычисляемое поле добавляют так: в области полей создаёте строку и в столбце Поле пишете выражение. Например, Цена * Количество для суммы строки или ВЫБОР КОГДА Остаток > 0 ТОГДА "Есть" ИНАЧЕ "Нет КОНЕЦ" для текстового признака. Для вставки функций удобно открыть вкладку конструктора с деревом доступных функций языка запросов.
Агрегатные функции превращают набор строк в одно значение. Доступны:
СУММА— сумма по колонке;КОЛИЧЕСТВО— число строк (КОЛИЧЕСТВО(РАЗЛИЧНЫЕ …)— число уникальных значений);МИНИМУМиМАКСИМУМ;СРЕДНЕЕ.
Как только вы оборачиваете поле в агрегатную функцию, появляется вкладка Группировка.
Рядом есть вкладка Дополнительно — там включают выборку без повторов (РАЗЛИЧНЫЕ, флажок Без повторяющихся) и ограничение числа строк (ПЕРВЫЕ N). ПЕРВЫЕ 10 в паре с сортировкой по убыванию — это готовый топ-10 товаров или контрагентов без лишнего кода.
Соединения таблиц: внутреннее, левое, полное
Когда в центральной колонке больше одной таблицы, включается вкладка Связи. Здесь задаётся, по какому полю таблицы соединяются и какого типа соединение.
Строку связи создают, выбирая поле из первой и второй таблицы — обычно это ссылка. Например, строки документа связывают с номенклатурой по полю Номенклатура. Тип соединения задаётся флажками Все слева и справа от условия:
| Флажки «Все» | Тип соединения | Что попадёт в результат |
|---|---|---|
| Оба сняты | Внутреннее | Только строки, у которых есть пара в обеих таблицах |
| Слева стоит | Левое | Все строки левой таблицы + подходящие из правой |
| Справа стоит | Правое | Все строки правой + подходящие из левой |
| Оба стоят | Полное | Все строки обеих таблиц |
Самая частая ошибка новичка — внутреннее соединение вместо левого. Если связать документы
с таблицей оплат внутренним соединением, неоплаченные документы молча исчезнут из отчёта. Нужны все документы с остатком долга — ставьте флажок Все у таблицы документов (левое соединение).
У полей из «правой» таблицы левого соединения, где пары не нашлось, будет значение NULL. Оборачивайте такие поля в ЕСТЬNULL(Поле, 0), иначе арифметика с ними даст пустой результат.
Отбор данных: условия и параметры запроса
Вкладка Условия отвечает за то, какие строки останутся в результате, — это аналог секции ГДЕ.
Условие собирают так: перетаскиваете поле в область условий и задаёте сравнение. Есть два режима:
- Простое условие — поле сравнивается с параметром. Галочка
Простые условиясама подставит параметр с именем поля. - Произвольное условие — пишете выражение целиком:
Номенклатура.ВидНоменклатуры = &ВидТовар И НЕ Номенклатура.ПометкаУдаления.
Параметр — это значение, которое подставляется в запрос извне. В тексте он помечается амперсандом: &ДатаОстатков, &Организация. Значение передают в коде до выполнения:
Запрос.УстановитьПараметр("ДатаОстатков", КонецДня(ПараметрДата));
Запрос.УстановитьПараметр("Организация", ВыбраннаяОрганизация);
Параметры дают сразу два плюса: один текст запроса работает с любыми значениями, и платформа защищает от подстановки лишних данных. Подставлять значения прямо в текст запроса склейкой строк нельзя — это и небезопасно, и ломает кэш запросов.
Для отбора по списку используют В (&СписокОрганизаций), передавая массив или таблицу значений. Для диапазона дат — два условия Дата >= &НачалоПериода И Дата <= &КонецПериода.
Когда нужно собрать данные из разнородных источников в одну выборку — например, приходы и расходы в единый список операций, — помогает вкладка Объединения/Псевдонимы. Она добавляет второй (третий, четвёртый) запрос, результаты которых склеиваются друг под другом секцией ОБЪЕДИНИТЬ ВСЕ. Главное правило: число и порядок полей в объединяемых запросах должны совпадать, а имена колонок берутся из первого запроса — там же, на этой вкладке, их псевдонимы и выравнивают.
Группировка, итоги и сортировка результата
Группировка нужна, когда есть агрегатные функции. На вкладке Группировка слева — поля группировки (по чему сворачиваем), справа — суммируемые поля (агрегаты). Правило простое: каждое поле результата должно быть либо в группировке, либо под агрегатной функцией.
ВЫБРАТЬ
Продажи.Контрагент КАК Контрагент,
СУММА(Продажи.Сумма) КАК СуммаПродаж
ИЗ
...
СГРУППИРОВАТЬ ПО
Продажи.Контрагент
Итоги (вкладка Итоги) — это дополнительные строки с промежуточными и общим результатом поверх группировки. В тексте превращаются в секцию ИТОГИ … ПО. Итоги удобны для отчётов: общая сумма внизу, подытоги по складам или месяцам.
Сортировка задаётся на вкладке Порядок: перетаскиваете поля и для каждого выбираете направление — по возрастанию (ВОЗР) или по убыванию (УБЫВ). Это секция УПОРЯДОЧИТЬ ПО:
УПОРЯДОЧИТЬ ПО
СуммаПродаж УБЫВ
Флажок Автоупорядочивание на вкладке Порядок досортирует ссылочные поля по представлению (наименованию справочника), а не по внутренней ссылке. Без него список контрагентов отсортируется в случайном для глаза порядке.
Генерация текста запроса и оптимизация
Когда настройки готовы, нажимаете ОК — конструктор вставляет собранный текст в модуль. Если вызывали Конструктор запроса с обработкой результата, получите и обвязку целиком:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура.Наименование КАК Наименование
|ИЗ
| Справочник.Номенклатура КАК Номенклатура";
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
// обработка выборки
КонецЦикла;
Открыть уже написанный текст обратно в конструкторе можно тем же правым кликом по строке запроса — правки, сделанные руками, подхватятся, если синтаксис корректен.
Несколько приёмов, которые отличают рабочий запрос от медленного:
- 🚀 Берите остатки из виртуальных таблиц. Не считайте остаток суммированием всех движений регистра вручную — для этого есть виртуальная таблица
Остаткис параметрами. - 🎯 Фильтруйте в параметрах виртуальной таблицы, а не в
ГДЕ. Условие по организации, заданное в параметрахОстатки(&Дата, Организация = &Орг), отсекает лишние данные раньше и работает быстрее, чем то же условие в секцииУсловия. - 🧹 Не тащите лишние поля. Каждое поле через точку (
Контрагент.ОсновнойДоговор.Наименование) — это скрытое соединение. Берите только то, что реально выводите. - 🔗 Проверяйте тип соединений. Лишнее полное соединение раздувает выборку в разы.
Запрос с большим числом соединений и условий по неиндексированным полям может заметно нагрузить базу. Если отчёт строится долго, посмотрите план через технологический журнал или замер производительности в конфигураторе, прежде чем переписывать текст наугад.
Частые вопросы
Чем конструктор запроса отличается от конструктора запроса с обработкой результата?
Запрос, вызов Выполнить() и цикл обхода выборки. Для быстрой вставки в модуль удобнее второй.Можно ли открыть в конструкторе запрос, написанный вручную?
Почему из отчёта пропадают строки без движений или без пар?
Связи поставьте флажок Все у неё — получится левое соединение. Пустые поля второй таблицы оберните в ЕСТЬNULL.Зачем нужны псевдонимы, если без них запрос тоже работает?
Где взять конструктор в схеме компоновки данных?
Наборы данных выделите набор типа «Запрос» и нажмите Конструктор запроса над полем текста. Откроется тот же инструмент, но результат вернётся в поля компоновки данных отчёта.