Собираем запрос мышкой: вкладки конструктора, соединения, параметры и пакеты
Содержание
Конструктор запросов в 1С 8.3 открывается в Конфигураторе из модуля: правой кнопкой мыши по тексту — команда Конструктор запроса.... Дальше запрос собирается на вкладках: выбираете таблицы и поля, задаёте связи, условия, группировку и порядок, а конструктор сам пишет текст на языке запросов.
Проблема обычно не в том, где кнопка, а в том, что запрос возвращает дубли, NULL вместо нулей или работает минуту вместо секунды. Рабочий запрос от «собранного наугад» отличают три вещи: правильный вид соединения, отбор в параметрах виртуальной таблицы и ЕСТЬNULL там, где данных может не быть. Инструмент общий для платформы: он одинаков в любой конфигурации — БП 3.0, ЗУП 3.1, УТ 11 и самописных.
Как запустить конструктор запросов и что на экране
Конструктор вызывается в нескольких местах, и от места зависит результат.
Где вызвать
- 🧩 Из модуля в Конфигураторе. Поставьте курсор в пустое место или внутрь строки с текстом запроса и выберите в контекстном меню
Конструктор запроса.... Если курсор стоит вне текста запроса, платформа предложит создать новый запрос. - 🧾 С обработкой результата. Команда
Конструктор запроса с обработкой результата...в том же меню. Кроме текста она вставит в модуль готовый код: создание объектаЗапрос, установку параметров, выполнение и цикл обхода выборки. - 📊 Из схемы компоновки данных. В наборе данных «Запрос» есть кнопка вызова конструктора. Здесь появляется дополнительная вкладка «Компоновка данных» — для настройки полей отчёта.
- 🖥️ В режиме 1С:Предприятие. Через внешнюю обработку «Консоль запросов»: многие версии таких консолей открывают тот же конструктор. Удобно, когда доступа к Конфигуратору нет.
Что внутри
Окно — набор вкладок. Часть из них появляется только по ходу работы: например, «Связи» становится полезной, когда таблиц две и больше.
| Вкладка | Что задаёт | Кусок текста запроса |
|---|---|---|
| Таблицы и поля | Источники и выбираемые поля | ВЫБРАТЬ ... ИЗ |
| Связи | Соединения таблиц | ЛЕВОЕ / ВНУТРЕННЕЕ / ПОЛНОЕ СОЕДИНЕНИЕ |
| Группировка | Поля группировки и агрегаты | СГРУППИРОВАТЬ ПО, СУММА() |
| Условия | Отбор строк | ГДЕ |
| Дополнительно | Первые N, различные, тип запроса | ПЕРВЫЕ, РАЗЛИЧНЫЕ, ПОМЕСТИТЬ |
| Объединения/Псевдонимы | Несколько запросов в один, имена полей | ОБЪЕДИНИТЬ ВСЕ, КАК |
| Порядок | Сортировка | УПОРЯДОЧИТЬ ПО |
| Итоги | Итоговые строки | ИТОГИ ПО |
| Пакет запросов | Список запросов пакета | разделитель ; |
Кнопка «Запрос» внизу окна показывает текст, который получается прямо сейчас. Сверяйтесь с ним после каждой вкладки — так быстрее понимаешь, что именно сделал конструктор.
Выбор таблиц и полей в конструкторе запросов
Вкладка «Таблицы и поля» разделена на три колонки: «База данных» (дерево метаданных), «Таблицы» (выбранные источники) и «Поля».
Источники
- В дереве найдите объект: справочник, документ, регистр. Строка поиска над деревом ищет по имени.
- Перетащите его в колонку «Таблицы» или нажмите стрелку
>. - Двойным щелчком по таблице в колонке «Таблицы» её можно переименовать — это псевдоним, он попадёт в текст после
КАК.
У документов есть табличные части: в дереве они раскрываются под документом и выбираются как отдельная таблица, например Документ.РеализацияТоваровУслуг.Товары.
Виртуальные таблицы регистров
Под регистром накопления в дереве лежат не только основная таблица, но и виртуальные: Остатки, Обороты, ОстаткиИОбороты. У регистра сведений — СрезПоследних и СрезПервых.
После добавления виртуальной таблицы нажмите кнопку «Параметры виртуальной таблицы» над списком таблиц. Там задаются период (&Дата, &НачалоПериода) и условие.
Отбор по складу или организации ставьте в условие виртуальной таблицы, а не на вкладку «Условия». Тогда платформа считает остатки только по нужным измерениям. Отбор через ГДЕ сначала посчитает всё, а потом отбросит лишнее — на больших базах разница в разы.
Поля и выражения
- ➡️ Перетащите нужные поля из таблицы в колонку «Поля».
- 🔍 Раскройте ссылочное поле плюсиком, чтобы взять реквизит «через точку»:
Номенклатура.Артикул. Конструктор допишет это сам, но каждая такая точка — неявное соединение. Берите только то, что нужно. - ✏️ Кнопка с карандашом над полями открывает редактор произвольного выражения:
ЕСТЬNULL(...),ВЫБОР КОГДА ... ТОГДА ... КОНЕЦ,ВЫРАЗИТЬ(... КАК Строка(100)).
Связи между таблицами и объединение запросов
Когда в запросе две таблицы и больше, их нужно связать. Без связи получится декартово произведение: 1 000 товаров × 5 складов = 5 000 строк вместо ожидаемых 1 000.
Вкладка «Связи»
Каждая строка — одна пара таблиц: «Таблица 1», флажок «Все», «Таблица 2», флажок «Все», «Условие связи». Флажки «Все» определяют вид соединения.
| Флажок «Все» | Вид соединения | Что вернёт |
|---|---|---|
| Только у таблицы 1 | ЛЕВОЕ СОЕДИНЕНИЕ | Все строки первой таблицы, из второй — совпавшие, остальное NULL |
| Только у таблицы 2 | ПРАВОЕ СОЕДИНЕНИЕ | То же, но в другую сторону |
| Ни у одной | ВНУТРЕННЕЕ СОЕДИНЕНИЕ | Только строки, нашедшие пару |
| У обеих | ПОЛНОЕ СОЕДИНЕНИЕ | Всё из обеих таблиц |
Условие связи выбирается из списков полей: Номенклатура.Ссылка = ТоварыОстатки.Номенклатура. Если нужно сложнее — включите флажок «Произвольное» и напишите условие руками.
Пример: все товары с остатками, включая нулевые
Типичная задача — вывести весь справочник и рядом остаток. Справочник берётся первой таблицей с флажком «Все», остатки — второй. Имя регистра ниже условное, подставьте своё:
ВЫБРАТЬ
Номенклатура.Ссылка КАК Номенклатура,
ЕСТЬNULL(Остатки.КоличествоОстаток, 0) КАК Остаток
ИЗ
Справочник.Номенклатура КАК Номенклатура
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки(&Дата, Склад = &Склад) КАК Остатки
ПО Номенклатура.Ссылка = Остатки.Номенклатура
Без ЕСТЬNULL у товаров без движения остаток будет NULL, а не 0 — сравнения и суммы в коде на этом ломаются.
Объединения и псевдонимы
Вкладка «Объединения/Псевдонимы» склеивает несколько запросов «стопкой» — например, приходы и расходы в одну таблицу.
- В левом списке нажмите «Добавить»: появится второй запрос, для него снова заполняются «Таблицы и поля».
- В правой таблице сопоставьте поля: каждая строка — одна колонка результата, по столбцу на каждый запрос.
- Флажок «Без дубликатов» превращает
ОБЪЕДИНИТЬ ВСЕвОБЪЕДИНИТЬ.
ОБЪЕДИНИТЬ без «ВСЕ» схлопывает одинаковые строки. Две одинаковые продажи по 500 рублей превратятся в одну — итог занизится. Для сумм почти всегда нужен ОБЪЕДИНИТЬ ВСЕ.
Условия отбора и параметры запроса
На вкладке «Условия» перетащите поле из левой колонки в правую. Конструктор сразу создаст условие вида Поле = &Поле — с параметром, имя которого совпадает с полем.
Простые и произвольные условия
- ✅ Простое. Выбираете поле, вид сравнения (
=,<>,В,Подобнои др.) и параметр. Для списка значений беритеВ (&Список)— в параметр передаётся массив или список значений. - 🛠️ Произвольное. Флажок «Произвольное» в строке условия открывает поле для текста:
Остатки.КоличествоОстаток > 0 ИЛИ Номенклатура.ЭтоГруппа. - 🌳 Иерархия. Для отбора по группе справочника используйте
В ИЕРАРХИИ (&Группа)— попадут и вложенные элементы.
Несколько строк на вкладке соединяются через И. Для ИЛИ пишите одно произвольное условие.
Как передать параметры из кода
Конструктор только объявляет параметр — значение задаётся в модуле перед выполнением:
Запрос = Новый Запрос;
Запрос.Текст = ТекстЗапроса;
Запрос.УстановитьПараметр("Дата", Новый Граница(КонецДня(ДатаОтчета), ВидГраницы.Включая));
Запрос.УстановитьПараметр("Склад", Склад);
Результат = Запрос.Выполнить();
Новый Граница с ВидГраницы.Включая нужна, чтобы виртуальная таблица остатков учла движения в последнюю секунду дня. Если параметр забыть, выполнение упадёт с ошибкой о незаданном значении параметра — по ней сразу видно имя.
Условие в ГДЕ или в соединении
При левом соединении это принципиально:
- 🔗 условие по второй таблице в
ПО ...— строки первой таблицы сохраняются; - 🚫 то же условие в
ГДЕотбросит строки, где вторая таблица далаNULL. Левое соединение фактически станет внутренним.
Группировка, агрегатные функции и итоги
Вкладка «Группировка»
Слева — поля запроса. Перенесите в верхнюю правую часть поля, по которым группируете, а в нижнюю — суммируемые поля (ресурсы). У каждого ресурса выберите функцию: СУММА, КОЛИЧЕСТВО, КОЛИЧЕСТВО РАЗЛИЧНЫЕ, МАКСИМУМ, МИНИМУМ, СРЕДНЕЕ.
Каждое поле из «Таблицы и поля» должно оказаться либо в группировке, либо в агрегате. Если поле осталось без места, текст запроса получится с ошибкой.
Пример: продажи по контрагентам за период — группировка по Контрагент, ресурс СУММА(Сумма). Для фильтра по агрегату («контрагенты с продажами больше 100 000») на вкладке «Условия» есть отдельная часть для условий после группировки — это ИМЕЮЩИЕ.
Вкладка «Итоги»
Итоги добавляют в результат строки с промежуточными суммами — удобно для вывода «группа → элементы».
- Перенесите в «Поля группировок» поля, по которым нужны итоги, например
Контрагент. - У поля выберите тип: «Элементы», «Иерархия» или «Только иерархия» — последние два работают для иерархических справочников.
- В «Итоговые поля» перенесите суммы с функцией
СУММА. - Флажок «Общие» добавит строку общего итога.
Чтобы обойти результат с итогами по уровням, выборку получают так: Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам).
Если запрос пойдёт в схему компоновки данных, вкладку «Итоги» не заполняйте. Итоги отчёта СКД считает сама по своим настройкам.
Порядок и «Дополнительно»
- 📑 «Порядок» — поля сортировки и направление. Флажок «Автоупорядочивание» сортирует по полям-ссылкам в порядке, заданном для объекта.
- ⚙️ «Дополнительно»: «Первые» (
ПЕРВЫЕ 10), «Без повторяющихся» (РАЗЛИЧНЫЕ), «Разрешенные» (РАЗРЕШЕННЫЕ— ограничение доступа без ошибки, а с пропуском запрещённых строк), блокировка данных для изменения и тип запроса.
Пакет запросов и временные таблицы
Сложную задачу проще решить в несколько шагов: сначала отобрать данные во временную таблицу, затем соединить её с другими. Это быстрее и читаемее, чем один запрос на пять соединений.
Как создать временную таблицу
- Соберите первый запрос как обычно.
- На вкладке «Дополнительно» выберите тип запроса «Создание временной таблицы» и задайте имя, например
ВТ_Продажи. - Откройте вкладку «Пакет запросов» и добавьте следующий запрос.
- В дереве «База данных» второго запроса появится узел временных таблиц с
ВТ_Продажи— берите её как обычную таблицу.
В тексте первый запрос получит строку ПОМЕСТИТЬ ВТ_Продажи, а запросы пакета разделятся точкой с запятой. Для временной таблицы, которую потом соединяют по полю, задайте индекс по этому полю — в текст добавится ИНДЕКСИРОВАТЬ ПО.
Выполнение пакета в коде
Запрос = Новый Запрос;
Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
Запрос.Текст = ТекстЗапроса;
Запрос.УстановитьПараметр("НачалоПериода", НачалоПериода);
Запрос.УстановитьПараметр("КонецПериода", КонецПериода);
Результаты = Запрос.ВыполнитьПакет();
Выборка = Результаты[Результаты.ВГраница()].Выбрать();
ВыполнитьПакет() возвращает массив результатов по каждому запросу пакета. Обычно нужен последний — его индекс ВГраница(). Метод Выполнить() вернёт результат только последнего запроса.
Менеджер временных таблиц нужен, если временные таблицы должны жить между разными запросами. Внутри одного пакета они видны и без него.
Когда временная таблица больше не нужна, добавьте в пакет запрос с типом «Уничтожение временной таблицы» — текст получит УНИЧТОЖИТЬ ВТ_Продажи. На долгих обработках это освобождает память сервера.
Как получить текст запроса и отладить его
Перенос текста в модуль
После нажатия «ОК» конструктор вставляет текст в модуль строкой с вертикальными чертами в начале каждой строки — так в 1С записывается многострочный литерал. Повторный вызов конструктора с курсором внутри этой строки открывает запрос на редактирование.
Ограничения, о которых стоит знать заранее:
- 💬 конструктор не сохраняет комментарии внутри текста запроса и переформатирует его по-своему;
- 🧱 текст, склеенный из частей через
+или собранный по условиям в коде, конструктор целиком не разберёт — открывайте только законченный кусок; - ❌ при синтаксической ошибке в тексте конструктор не откроется и покажет место ошибки.
Отладка
- Консоль запросов. Скопируйте текст во внешнюю обработку «Консоль запросов», задайте параметры и выполните. Сразу видно число строк и время.
- Отладчик. Поставьте точку останова после
Выполнить()и вычислите в окне выраженийРезультат.Выгрузить()— увидите таблицу значений. - Временные таблицы под отладкой. Содержимое временной таблицы смотрят через менеджер:
Запрос.МенеджерВременныхТаблиц.Таблицы[0].ПолучитьДанные().Выгрузить(). - По частям. Если результат неверный, временно уберите условия и соединения по одному и смотрите, на каком шаге меняется число строк.
Частые вопросы о конструкторе запросов
Можно ли пользоваться конструктором запросов без Конфигуратора?
Чем «Конструктор запроса» отличается от «Конструктора запроса с обработкой результата»?
Почему после конструктора пропали мои комментарии в запросе?
Что даёт флажок «Разрешенные»?
РАЗРЕШЕННЫЕ пропускает записи, к которым у пользователя нет доступа по ограничениям RLS, вместо того чтобы падать с ошибкой прав.