Пошагово собираем запрос через конструктор в 1С

· 9 мин

Содержание

Конструктор запросов открывается из модуля: ставите курсор в текст, правый клик → Конструктор запроса. Откроется окно с вкладками, где таблицы, поля, условия и группировка настраиваются мышью, а готовый текст на языке запросов 1С программа соберёт сама. Руками писать ВЫБРАТЬ … ИЗ … ГДЕ не нужно.

Инструмент один и тот же для отчётов, обработок, динамических списков и схемы компоновки данных. Ниже — как устроено окно конструктора в 1С 8.3, что делает каждая вкладка и как из таблиц, полей и условий получить рабочий запрос. Примеры даю на платформе 8.3 с интерфейсом «Такси».

Что делает конструктор и откуда его вызвать

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

Вызвать его можно из нескольких мест:

  • 📝 Из модуля. Правый клик в тексте → Конструктор запроса. Если выделения нет, конструктор создаёт запрос с нуля; если курсор стоит внутри уже написанного текста запроса — откроет его на редактирование.
  • ⚙️ С обработкой результата. В том же меню — Конструктор запроса с обработкой результата. Кроме текста он сгенерирует и обвязку: создание объекта Запрос, выполнение и цикл обхода выборки.
  • 📊 В схеме компоновки данных (СКД). На вкладке Наборы данных кнопка Конструктор запроса открывает тот же инструмент для набора данных отчёта.
  • 📋 В динамическом списке формы. В свойствах списка у Текста запроса тоже есть кнопка вызова конструктора.

Если пункт Конструктор запроса в контекстном меню неактивен, значит курсор стоит вне строкового литерала или вне модуля, где запросы не используются. Поставьте курсор внутрь строки с текстом запроса.

Из каких вкладок состоит окно конструктора

Сверху окна — ряд вкладок. Их число меняется: пока таблица одна, вкладки Связи может не быть, а Группировка появляется, когда вы добавите агрегатную функцию. Разберём по порядку работы.

ВкладкаЗа что отвечает
Таблицы и поляИсточники данных и какие поля попадут в результат
СвязиСоединение нескольких таблиц между собой
ГруппировкаСвёртка строк и агрегатные функции (сумма, количество)
УсловияОтбор строк — аналог ГДЕ
ДополнительноРАЗЛИЧНЫЕ, ПЕРВЫЕ N, разрешённые для отбора
Объединения/ПсевдонимыОбъединение запросов и имена колонок результата
ПорядокСортировка строк — аналог УПОРЯДОЧИТЬ ПО
ИтогиОбщие и промежуточные итоги — ИТОГИ … ПО

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

Добавление таблиц и псевдонимы

Основная вкладка — Таблицы и поля. Она разбита на три колонки.

  1. Слева — база данных. Дерево всех доступных таблиц: справочники, документы, регистры, перечисления, а также их виртуальные таблицы (Остатки, Обороты, СрезПоследних).
  2. В центре — выбранные таблицы. Перетащите нужную таблицу из левой колонки сюда двойным кликом или мышью.
  3. Справа — поля. Поля выбранных таблиц, которые попадут в результат.

Чтобы задать псевдоним таблицы, выделите её в центральной колонке и впишите короткое имя в поле Псевдоним (или нажмите клавишу, вызывающую свойства). Псевдоним — это сокращённое имя, по которому к таблице обращаются дальше в запросе. Вместо длинного РегистрНакопления.ТоварыНаСкладах.Остатки пишете, например, Остатки.

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

Псевдонимы обязательны, когда в запросе две таблицы с одинаковыми именами полей: без них платформа не поймёт, из какой таблицы брать Наименование.

Выбор полей, выражения и агрегаты

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

Каждому полю результата тоже назначается псевдоним колонки — это имя, под которым значение будет доступно в выборке и в ячейке отчёта. Задаётся в столбце Имя поля области полей. В тексте запроса это превращается в конструкцию КАК:

ВЫБРАТЬ
    Номенклатура.Наименование КАК Наименование,
    Номенклатура.Артикул КАК Артикул
ИЗ
    Справочник.Номенклатура КАК Номенклатура

Вычисляемое поле добавляют так: в области полей создаёте строку и в столбце Поле пишете выражение. Например, Цена * Количество для суммы строки или ВЫБОР КОГДА Остаток > 0 ТОГДА "Есть" ИНАЧЕ "Нет КОНЕЦ" для текстового признака. Для вставки функций удобно открыть вкладку конструктора с деревом доступных функций языка запросов.

Агрегатные функции превращают набор строк в одно значение. Доступны:

  • СУММА — сумма по колонке;
  • КОЛИЧЕСТВО — число строк (КОЛИЧЕСТВО(РАЗЛИЧНЫЕ …) — число уникальных значений);
  • МИНИМУМ и МАКСИМУМ;
  • СРЕДНЕЕ.

Как только вы оборачиваете поле в агрегатную функцию, появляется вкладка Группировка.

Рядом есть вкладка Дополнительно — там включают выборку без повторов (РАЗЛИЧНЫЕ, флажок Без повторяющихся) и ограничение числа строк (ПЕРВЫЕ N). ПЕРВЫЕ 10 в паре с сортировкой по убыванию — это готовый топ-10 товаров или контрагентов без лишнего кода.

Соединения таблиц: внутреннее, левое, полное

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

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

Флажки «Все»Тип соединенияЧто попадёт в результат
Оба снятыВнутреннееТолько строки, у которых есть пара в обеих таблицах
Слева стоитЛевоеВсе строки левой таблицы + подходящие из правой
Справа стоитПравоеВсе строки правой + подходящие из левой
Оба стоятПолноеВсе строки обеих таблиц

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

У полей из «правой» таблицы левого соединения, где пары не нашлось, будет значение NULL. Оборачивайте такие поля в ЕСТЬNULL(Поле, 0), иначе арифметика с ними даст пустой результат.

Отбор данных: условия и параметры запроса

Вкладка Условия отвечает за то, какие строки останутся в результате, — это аналог секции ГДЕ.

Условие собирают так: перетаскиваете поле в область условий и задаёте сравнение. Есть два режима:

  • Простое условие — поле сравнивается с параметром. Галочка Простые условия сама подставит параметр с именем поля.
  • Произвольное условие — пишете выражение целиком: Номенклатура.ВидНоменклатуры = &ВидТовар И НЕ Номенклатура.ПометкаУдаления.

Параметр — это значение, которое подставляется в запрос извне. В тексте он помечается амперсандом: &ДатаОстатков, &Организация. Значение передают в коде до выполнения:

Запрос.УстановитьПараметр("ДатаОстатков", КонецДня(ПараметрДата));
Запрос.УстановитьПараметр("Организация", ВыбраннаяОрганизация);

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

Для отбора по списку используют В (&СписокОрганизаций), передавая массив или таблицу значений. Для диапазона дат — два условия Дата >= &НачалоПериода И Дата <= &КонецПериода.

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

Группировка, итоги и сортировка результата

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

ВЫБРАТЬ
    Продажи.Контрагент КАК Контрагент,
    СУММА(Продажи.Сумма) КАК СуммаПродаж
ИЗ
    ...
СГРУППИРОВАТЬ ПО
    Продажи.Контрагент

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

Сортировка задаётся на вкладке Порядок: перетаскиваете поля и для каждого выбираете направление — по возрастанию (ВОЗР) или по убыванию (УБЫВ). Это секция УПОРЯДОЧИТЬ ПО:

УПОРЯДОЧИТЬ ПО
    СуммаПродаж УБЫВ

Флажок Автоупорядочивание на вкладке Порядок досортирует ссылочные поля по представлению (наименованию справочника), а не по внутренней ссылке. Без него список контрагентов отсортируется в случайном для глаза порядке.

Проверьте себя
Куда добавляется поле, по которому делаем группировку сумм?
Какой тип соединения оставит в результате все документы, даже без оплаты?
Как в запрос попадает значение `&Организация`?

Генерация текста запроса и оптимизация

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

Запрос = Новый Запрос;
Запрос.Текст =
    "ВЫБРАТЬ
    |    Номенклатура.Наименование КАК Наименование
    |ИЗ
    |    Справочник.Номенклатура КАК Номенклатура";

РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();

Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
    // обработка выборки
КонецЦикла;

Открыть уже написанный текст обратно в конструкторе можно тем же правым кликом по строке запроса — правки, сделанные руками, подхватятся, если синтаксис корректен.

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

  • 🚀 Берите остатки из виртуальных таблиц. Не считайте остаток суммированием всех движений регистра вручную — для этого есть виртуальная таблица Остатки с параметрами.
  • 🎯 Фильтруйте в параметрах виртуальной таблицы, а не в ГДЕ. Условие по организации, заданное в параметрах Остатки(&Дата, Организация = &Орг), отсекает лишние данные раньше и работает быстрее, чем то же условие в секции Условия.
  • 🧹 Не тащите лишние поля. Каждое поле через точку (Контрагент.ОсновнойДоговор.Наименование) — это скрытое соединение. Берите только то, что реально выводите.
  • 🔗 Проверяйте тип соединений. Лишнее полное соединение раздувает выборку в разы.

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

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

Чем конструктор запроса отличается от конструктора запроса с обработкой результата?
Первый вставляет только текст запроса (строку). Второй добавляет готовый код: создание объекта Запрос, вызов Выполнить() и цикл обхода выборки. Для быстрой вставки в модуль удобнее второй.
Можно ли открыть в конструкторе запрос, написанный вручную?
Да. Поставьте курсор внутрь текста запроса и вызовите конструктор правым кликом. Если синтаксис без ошибок, он разберёт текст по вкладкам. Нестандартное форматирование при этом может немного измениться.
Почему из отчёта пропадают строки без движений или без пар?
Это внутреннее соединение. Чтобы сохранить все строки основной таблицы, на вкладке Связи поставьте флажок Все у неё — получится левое соединение. Пустые поля второй таблицы оберните в ЕСТЬNULL.
Зачем нужны псевдонимы, если без них запрос тоже работает?
Псевдоним таблицы обязателен, когда в запросе есть одинаковые имена полей из разных таблиц. Псевдоним колонки задаёт заголовок результата — по нему поле доступно в выборке и в ячейке отчёта. Без внятных имён запрос тяжело читать и сопровождать.
Где взять конструктор в схеме компоновки данных?
В макете СКД на вкладке Наборы данных выделите набор типа «Запрос» и нажмите Конструктор запроса над полем текста. Откроется тот же инструмент, но результат вернётся в поля компоновки данных отчёта.