К статье
Практический материал

Разработка и Конфигурация · 9 мин

Конструктор запросов в 1С: практическое руководство

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

Конструктор запросов в 1С — встроенный инструмент конфигуратора, который позволяет составлять запросы к базе данных без ручного набора текста. Синтаксис языка запросов 1С намеренно напоминает SQL: здесь есть SELECT, WHERE, JOIN, GROUP BY и ORDER BY, но с русскими ключевыми словами (ВЫБРАТЬ, ГДЕ, СГРУППИРОВАТЬ ПО) и с рядом специфических возможностей, которых нет в классическом SQL.

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

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

Как открыть конструктор и создать первый запрос

Конструктор доступен только внутри модуля: откройте модуль объекта, формы или общий модуль, поставьте курсор в нужное место и вызовите контекстное меню правой кнопкой мыши — пункт «Конструктор запроса». Если текст запроса уже существует, конструктор загрузит его для редактирования; если место пустое, будет предложено создать запрос с обработкой результата или без неё.

После создания платформа вставляет в модуль заготовку кода: объявление объекта Запрос, присвоение текста и, при выборе обработки, цикл обхода выборки. Этот код — стартовая точка, параметры и логику обхода нужно дописать под конкретную задачу.

Порядок создания запроса
  1. 1
    Откройте модуль и вызовите «Конструктор запроса» из контекстного меню
  2. 2
    На вкладке «Таблицы и поля» перенесите нужную таблицу из дерева базы данных
  3. 3
    Отметьте необходимые поля двойным щелчком или перетаскиванием
  4. 4
    Задайте отборы на вкладке «Условия» и сортировку на вкладке «Порядок»
  5. 5
    Нажмите «ОК» и проверьте сгенерированный текст запроса
  6. 6
    Установите параметры через Запрос.УстановитьПараметр() и выполните запрос

Структура конструктора: назначение вкладок

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

Вкладки «Условия» и «Объединения/Псевдонимы» отвечают за отборы и переименование полей. «Порядок» задаёт сортировку, «Группировка» — агрегатные функции, «Итоги» — секцию ИТОГИ ПО для иерархических выборок. Вкладка «Пакет запросов» управляет временными таблицами, а «Индексы» — их индексированием.

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

Большинство практических запросов в учётных системах обращается не к физическим таблицам регистров, а к виртуальным: Остатки, Обороты, ОстаткиИОбороты, СрезПервых, СрезПоследних. В конструкторе они отображаются в дереве вложенными в соответствующий регистр. При выборе виртуальной таблицы открывается диалог «Параметры виртуальной таблицы», где задаются период и условия.

Ключевое правило: отборы по измерениям нужно передавать именно в параметры виртуальной таблицы, а не в секцию ГДЕ. Условие в параметрах применяется до вычисления остатков или оборотов, что резко сокращает объём обрабатываемых данных. Условие в ГДЕ фильтрует уже готовый результат и работает медленнее на больших регистрах.

Срез последних регистра сведений

Частая задача — получить актуальное значение периодического реквизита, например цену номенклатуры на дату документа. Для этого используется виртуальная таблица СрезПоследних с параметром Период. В параметре передаётся либо конкретная дата, либо таблица значений с датами для каждой строки — второй вариант нужен, когда цена требуется на разные даты для разных позиций.

Соединения таблиц и типичные ловушки

На вкладке «Связи» конструктор предлагает четыре типа соединения: внутреннее, левое, правое и полное. По умолчанию ставится внутреннее — оно вернёт только строки, где есть совпадение в обеих таблицах. Если нужно получить все строки левой таблицы независимо от наличия пары (например, все товары, включая те, по которым не было продаж), тип связи нужно переключить на левое соединение.

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

Типичные ошибки
01
Отбор по измерениям в секции ГДЕ вместо параметров виртуальной таблицы — запрос работает в разы медленнее
02
Внутреннее соединение там, где нужно левое — из результата пропадают строки без пары
03
Соединение с не сгруппированной таблицей оборотов — суммы задваиваются или умножаются
04
Использование звёздочки (ВЫБРАТЬ *) в рабочем коде — лишняя нагрузка и риск падения при изменении структуры конфигурации
05
Получение данных через точку от ссылки (Документ.Контрагент.ИНН) в цикле — множество скрытых обращений к базе

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

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

Вкладка «Итоги» добавляет секцию ИТОГИ ПО, после которой запрос возвращает иерархическую выборку: строки итогов по группам плюс детальные строки. В коде такую выборку обходят методом Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам). Если итоги не нужны, секцию лучше не добавлять — плоская выборка обходится проще и быстрее.

bsl
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| Продажи.Номенклатура КАК Номенклатура,
| СУММА(Продажи.СуммаОборот) КАК Сумма
|ИЗ
| РегистрНакопления.Продажи.Обороты(&Начало, &Конец, , ) КАК Продажи
|СГРУППИРОВАТЬ ПО
| Продажи.Номенклатура";
Запрос.УстановитьПараметр("Начало", НачалоМесяца(ТекущаяДатаСеанса()));
Запрос.УстановитьПараметр("Конец", КонецМесяца(ТекущаяДатаСеанса()));
Результат = Запрос.Выполнить().Выбрать();

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

Когда итоговый запрос требует нескольких этапов — сначала отобрать данные, потом обогатить их из других источников — применяются пакетные запросы. На вкладке «Пакет запросов» создаются промежуточные запросы с помещением результата во временную таблицу (секция ПОМЕСТИТЬ В). Финальный запрос пакета читает эти таблицы как обычные.

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

Контрольные точки

Как проверить результат

Количество строк в выборке
Норма

Совпадает с ожидаемым числом по контрольному отчёту

Тревожный признак

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

Суммы по группам
Норма

Сходятся со стандартным отчётом конфигурации

Тревожный признак

Суммы кратно завышены — соединение без группировки

Время выполнения
Норма

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

Тревожный признак

Многоминутное выполнение — проверьте параметры виртуальных таблиц и индексы

Ограничения конструктора и когда писать текст вручную

Конструктор не покрывает весь синтаксис языка запросов. Сложные вложенные подзапросы в условиях, хитрые выражения с ВЫБОР КОГДА...ТОГДА, оператор В ИЕРАРХИИ и некоторые комбинации объединений проще и надёжнее написать вручную. При загрузке такого текста конструктор может выдать предупреждение и открыться в режиме редактирования текста.

Также стоит помнить, что язык запросов 1С — это не полноценный SQL: в нём нет UPDATE и DELETE (данные изменяются только объектными методами), нет хранимых процедур и оконных функций. Запросы предназначены исключительно для чтения данных, и это важно учитывать при проектировании обработок.

Итог

Что важно запомнить

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

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

Чем язык запросов 1С отличается от обычного SQL?

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

Можно ли использовать конструктор без знания языка запросов?

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

Как передать список значений в параметр запроса?

Передайте массив или список значений через УстановитьПараметр, а в тексте запроса используйте оператор В: «ГДЕ Номенклатура В (&Список)». Платформа сама развернёт коллекцию в набор значений.

Почему запрос в консоли работает быстро, а в отчёте медленно?

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

Что делать, если конструктор не открывает мой запрос?

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