Собираем запрос мышкой: вкладки конструктора, соединения, параметры и пакеты

· 10 мин

Содержание

Конструктор запросов в 1С 8.3 открывается в Конфигураторе из модуля: правой кнопкой мыши по тексту — команда Конструктор запроса.... Дальше запрос собирается на вкладках: выбираете таблицы и поля, задаёте связи, условия, группировку и порядок, а конструктор сам пишет текст на языке запросов.

Проблема обычно не в том, где кнопка, а в том, что запрос возвращает дубли, NULL вместо нулей или работает минуту вместо секунды. Рабочий запрос от «собранного наугад» отличают три вещи: правильный вид соединения, отбор в параметрах виртуальной таблицы и ЕСТЬNULL там, где данных может не быть. Инструмент общий для платформы: он одинаков в любой конфигурации — БП 3.0, ЗУП 3.1, УТ 11 и самописных.

Как запустить конструктор запросов и что на экране

Конструктор вызывается в нескольких местах, и от места зависит результат.

Где вызвать

  • 🧩 Из модуля в Конфигураторе. Поставьте курсор в пустое место или внутрь строки с текстом запроса и выберите в контекстном меню Конструктор запроса.... Если курсор стоит вне текста запроса, платформа предложит создать новый запрос.
  • 🧾 С обработкой результата. Команда Конструктор запроса с обработкой результата... в том же меню. Кроме текста она вставит в модуль готовый код: создание объекта Запрос, установку параметров, выполнение и цикл обхода выборки.
  • 📊 Из схемы компоновки данных. В наборе данных «Запрос» есть кнопка вызова конструктора. Здесь появляется дополнительная вкладка «Компоновка данных» — для настройки полей отчёта.
  • 🖥️ В режиме 1С:Предприятие. Через внешнюю обработку «Консоль запросов»: многие версии таких консолей открывают тот же конструктор. Удобно, когда доступа к Конфигуратору нет.

Что внутри

Окно — набор вкладок. Часть из них появляется только по ходу работы: например, «Связи» становится полезной, когда таблиц две и больше.

ВкладкаЧто задаётКусок текста запроса
Таблицы и поляИсточники и выбираемые поляВЫБРАТЬ ... ИЗ
СвязиСоединения таблицЛЕВОЕ / ВНУТРЕННЕЕ / ПОЛНОЕ СОЕДИНЕНИЕ
ГруппировкаПоля группировки и агрегатыСГРУППИРОВАТЬ ПО, СУММА()
УсловияОтбор строкГДЕ
ДополнительноПервые N, различные, тип запросаПЕРВЫЕ, РАЗЛИЧНЫЕ, ПОМЕСТИТЬ
Объединения/ПсевдонимыНесколько запросов в один, имена полейОБЪЕДИНИТЬ ВСЕ, КАК
ПорядокСортировкаУПОРЯДОЧИТЬ ПО
ИтогиИтоговые строкиИТОГИ ПО
Пакет запросовСписок запросов пакетаразделитель ;

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

Выбор таблиц и полей в конструкторе запросов

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

Источники

  1. В дереве найдите объект: справочник, документ, регистр. Строка поиска над деревом ищет по имени.
  2. Перетащите его в колонку «Таблицы» или нажмите стрелку >.
  3. Двойным щелчком по таблице в колонке «Таблицы» её можно переименовать — это псевдоним, он попадёт в текст после КАК.

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

Виртуальные таблицы регистров

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

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

Отбор по складу или организации ставьте в условие виртуальной таблицы, а не на вкладку «Условия». Тогда платформа считает остатки только по нужным измерениям. Отбор через ГДЕ сначала посчитает всё, а потом отбросит лишнее — на больших базах разница в разы.

Поля и выражения

  • ➡️ Перетащите нужные поля из таблицы в колонку «Поля».
  • 🔍 Раскройте ссылочное поле плюсиком, чтобы взять реквизит «через точку»: Номенклатура.Артикул. Конструктор допишет это сам, но каждая такая точка — неявное соединение. Берите только то, что нужно.
  • ✏️ Кнопка с карандашом над полями открывает редактор произвольного выражения: ЕСТЬNULL(...), ВЫБОР КОГДА ... ТОГДА ... КОНЕЦ, ВЫРАЗИТЬ(... КАК Строка(100)).

Связи между таблицами и объединение запросов

Когда в запросе две таблицы и больше, их нужно связать. Без связи получится декартово произведение: 1 000 товаров × 5 складов = 5 000 строк вместо ожидаемых 1 000.

Вкладка «Связи»

Каждая строка — одна пара таблиц: «Таблица 1», флажок «Все», «Таблица 2», флажок «Все», «Условие связи». Флажки «Все» определяют вид соединения.

Флажок «Все»Вид соединенияЧто вернёт
Только у таблицы 1ЛЕВОЕ СОЕДИНЕНИЕВсе строки первой таблицы, из второй — совпавшие, остальное NULL
Только у таблицы 2ПРАВОЕ СОЕДИНЕНИЕТо же, но в другую сторону
Ни у однойВНУТРЕННЕЕ СОЕДИНЕНИЕТолько строки, нашедшие пару
У обеихПОЛНОЕ СОЕДИНЕНИЕВсё из обеих таблиц

Условие связи выбирается из списков полей: Номенклатура.Ссылка = ТоварыОстатки.Номенклатура. Если нужно сложнее — включите флажок «Произвольное» и напишите условие руками.

Пример: все товары с остатками, включая нулевые

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

ВЫБРАТЬ
	Номенклатура.Ссылка КАК Номенклатура,
	ЕСТЬNULL(Остатки.КоличествоОстаток, 0) КАК Остаток
ИЗ
	Справочник.Номенклатура КАК Номенклатура
		ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки(&Дата, Склад = &Склад) КАК Остатки
		ПО Номенклатура.Ссылка = Остатки.Номенклатура

Без ЕСТЬNULL у товаров без движения остаток будет NULL, а не 0 — сравнения и суммы в коде на этом ломаются.

Объединения и псевдонимы

Вкладка «Объединения/Псевдонимы» склеивает несколько запросов «стопкой» — например, приходы и расходы в одну таблицу.

  1. В левом списке нажмите «Добавить»: появится второй запрос, для него снова заполняются «Таблицы и поля».
  2. В правой таблице сопоставьте поля: каждая строка — одна колонка результата, по столбцу на каждый запрос.
  3. Флажок «Без дубликатов» превращает ОБЪЕДИНИТЬ ВСЕ в ОБЪЕДИНИТЬ.

ОБЪЕДИНИТЬ без «ВСЕ» схлопывает одинаковые строки. Две одинаковые продажи по 500 рублей превратятся в одну — итог занизится. Для сумм почти всегда нужен ОБЪЕДИНИТЬ ВСЕ.

Условия отбора и параметры запроса

На вкладке «Условия» перетащите поле из левой колонки в правую. Конструктор сразу создаст условие вида Поле = &Поле — с параметром, имя которого совпадает с полем.

Простые и произвольные условия

  • ✅ Простое. Выбираете поле, вид сравнения (=, <>, В, Подобно и др.) и параметр. Для списка значений берите В (&Список) — в параметр передаётся массив или список значений.
  • 🛠️ Произвольное. Флажок «Произвольное» в строке условия открывает поле для текста: Остатки.КоличествоОстаток > 0 ИЛИ Номенклатура.ЭтоГруппа.
  • 🌳 Иерархия. Для отбора по группе справочника используйте В ИЕРАРХИИ (&Группа) — попадут и вложенные элементы.

Несколько строк на вкладке соединяются через И. Для ИЛИ пишите одно произвольное условие.

Как передать параметры из кода

Конструктор только объявляет параметр — значение задаётся в модуле перед выполнением:

Запрос = Новый Запрос;
Запрос.Текст = ТекстЗапроса;
Запрос.УстановитьПараметр("Дата", Новый Граница(КонецДня(ДатаОтчета), ВидГраницы.Включая));
Запрос.УстановитьПараметр("Склад", Склад);
Результат = Запрос.Выполнить();

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

Условие в ГДЕ или в соединении

При левом соединении это принципиально:

  • 🔗 условие по второй таблице в ПО ... — строки первой таблицы сохраняются;
  • 🚫 то же условие в ГДЕ отбросит строки, где вторая таблица дала NULL. Левое соединение фактически станет внутренним.

Группировка, агрегатные функции и итоги

Вкладка «Группировка»

Слева — поля запроса. Перенесите в верхнюю правую часть поля, по которым группируете, а в нижнюю — суммируемые поля (ресурсы). У каждого ресурса выберите функцию: СУММА, КОЛИЧЕСТВО, КОЛИЧЕСТВО РАЗЛИЧНЫЕ, МАКСИМУМ, МИНИМУМ, СРЕДНЕЕ.

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

Пример: продажи по контрагентам за период — группировка по Контрагент, ресурс СУММА(Сумма). Для фильтра по агрегату («контрагенты с продажами больше 100 000») на вкладке «Условия» есть отдельная часть для условий после группировки — это ИМЕЮЩИЕ.

Вкладка «Итоги»

Итоги добавляют в результат строки с промежуточными суммами — удобно для вывода «группа → элементы».

  1. Перенесите в «Поля группировок» поля, по которым нужны итоги, например Контрагент.
  2. У поля выберите тип: «Элементы», «Иерархия» или «Только иерархия» — последние два работают для иерархических справочников.
  3. В «Итоговые поля» перенесите суммы с функцией СУММА.
  4. Флажок «Общие» добавит строку общего итога.

Чтобы обойти результат с итогами по уровням, выборку получают так: Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам).

Если запрос пойдёт в схему компоновки данных, вкладку «Итоги» не заполняйте. Итоги отчёта СКД считает сама по своим настройкам.

Порядок и «Дополнительно»

  • 📑 «Порядок» — поля сортировки и направление. Флажок «Автоупорядочивание» сортирует по полям-ссылкам в порядке, заданном для объекта.
  • ⚙️ «Дополнительно»: «Первые» (ПЕРВЫЕ 10), «Без повторяющихся» (РАЗЛИЧНЫЕ), «Разрешенные» (РАЗРЕШЕННЫЕ — ограничение доступа без ошибки, а с пропуском запрещённых строк), блокировка данных для изменения и тип запроса.

Пакет запросов и временные таблицы

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

Как создать временную таблицу

  1. Соберите первый запрос как обычно.
  2. На вкладке «Дополнительно» выберите тип запроса «Создание временной таблицы» и задайте имя, например ВТ_Продажи.
  3. Откройте вкладку «Пакет запросов» и добавьте следующий запрос.
  4. В дереве «База данных» второго запроса появится узел временных таблиц с ВТ_Продажи — берите её как обычную таблицу.

В тексте первый запрос получит строку ПОМЕСТИТЬ ВТ_Продажи, а запросы пакета разделятся точкой с запятой. Для временной таблицы, которую потом соединяют по полю, задайте индекс по этому полю — в текст добавится ИНДЕКСИРОВАТЬ ПО.

Выполнение пакета в коде

Запрос = Новый Запрос;
Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
Запрос.Текст = ТекстЗапроса;
Запрос.УстановитьПараметр("НачалоПериода", НачалоПериода);
Запрос.УстановитьПараметр("КонецПериода", КонецПериода);
Результаты = Запрос.ВыполнитьПакет();
Выборка = Результаты[Результаты.ВГраница()].Выбрать();

ВыполнитьПакет() возвращает массив результатов по каждому запросу пакета. Обычно нужен последний — его индекс ВГраница(). Метод Выполнить() вернёт результат только последнего запроса.

Менеджер временных таблиц нужен, если временные таблицы должны жить между разными запросами. Внутри одного пакета они видны и без него.

Когда временная таблица больше не нужна, добавьте в пакет запрос с типом «Уничтожение временной таблицы» — текст получит УНИЧТОЖИТЬ ВТ_Продажи. На долгих обработках это освобождает память сервера.

Как получить текст запроса и отладить его

Перенос текста в модуль

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

Ограничения, о которых стоит знать заранее:

  • 💬 конструктор не сохраняет комментарии внутри текста запроса и переформатирует его по-своему;
  • 🧱 текст, склеенный из частей через + или собранный по условиям в коде, конструктор целиком не разберёт — открывайте только законченный кусок;
  • ❌ при синтаксической ошибке в тексте конструктор не откроется и покажет место ошибки.

Отладка

  1. Консоль запросов. Скопируйте текст во внешнюю обработку «Консоль запросов», задайте параметры и выполните. Сразу видно число строк и время.
  2. Отладчик. Поставьте точку останова после Выполнить() и вычислите в окне выражений Результат.Выгрузить() — увидите таблицу значений.
  3. Временные таблицы под отладкой. Содержимое временной таблицы смотрят через менеджер: Запрос.МенеджерВременныхТаблиц.Таблицы[0].ПолучитьДанные().Выгрузить().
  4. По частям. Если результат неверный, временно уберите условия и соединения по одному и смотрите, на каком шаге меняется число строк.
Диагностика: выберите симптом

Частые вопросы о конструкторе запросов

Можно ли пользоваться конструктором запросов без Конфигуратора?
Да, через внешнюю обработку «Консоль запросов» в режиме 1С:Предприятие. Нужны права на открытие внешних обработок.
Чем «Конструктор запроса» отличается от «Конструктора запроса с обработкой результата»?
Первый вставляет только текст запроса. Второй дописывает код вокруг: создание запроса, параметры, выполнение и цикл обхода результата.
Почему после конструктора пропали мои комментарии в запросе?
Конструктор разбирает текст и собирает его заново, комментарии при этом не сохраняются. Храните пояснения в коде модуля рядом с запросом.
Что даёт флажок «Разрешенные»?
Запрос с РАЗРЕШЕННЫЕ пропускает записи, к которым у пользователя нет доступа по ограничениям RLS, вместо того чтобы падать с ошибкой прав.
Есть ли конструктор запросов в 1С:EDT?
Да, в EDT есть свой конструктор запросов с похожим набором вкладок; он вызывается из контекстного меню редактора модуля.