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

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

Как работать с конструктором запросов в 1С

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

Конструктор запросов в 1С — это визуальный инструмент, который позволяет собрать текст запроса на встроенном языке запросов без ручного написания синтаксиса. Он доступен в конфигураторе и вызывается из модуля, схемы компоновки данных или консоли запросов. Инструмент одинаково полезен и новичку, который ещё не помнит ключевые слова языка запросов, и опытному разработчику, которому нужно быстро собрать сложную выборку из нескольких таблиц.

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

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

Как открыть конструктор запросов

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

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

Выбор таблиц и полей: с чего начинается запрос

После открытия конструктора на закладке «Таблицы и поля» слева отображается дерево всех объектов конфигурации: справочники, документы, регистры сведений и накопления, перечисления. Раскройте нужный узел и перенесите таблицу в список «Таблицы» двойным щелчком или кнопкой со стрелкой. Затем из выбранной таблицы перенесите нужные поля в список «Поля».

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

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

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

Связи таблиц и объединения

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

Флажок «Все» у таблицы в списке связей — это альтернативный способ задать левое или правое соединение. Убедитесь, что условие связи включает все ключевые измерения: неполное условие даст декартово произведение и раздует результат в разы.

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

Типичные ошибки при работе со связями
01
Внутреннее соединение вместо левого: строки без данных в правой таблице пропадают из результата, и отчёт «недосчитывает» позиции
02
Связь только по части измерений: результат размножается, суммы задваиваются
03
Связь по неиндексированному реквизиту: запрос работает на тестовой базе, но «виснет» на рабочей
04
ОБЪЕДИНИТЬ вместо ОБЪЕДИНИТЬ ВСЕ там, где дубли допустимы: лишняя операция устранения дублей замедляет запрос

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

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

Для отбора по списку значений используйте оператор «В» с параметром-списком: Номенклатура В (&СписокНоменклатуры). Для отбора по иерархии справочника — «В ИЕРАРХИИ». Условие на виртуальную таблицу по возможности задавайте в её параметрах, а не в секции ГДЕ: отбор на уровне виртуальной таблицы выполняется раньше и уменьшает объём обрабатываемых данных.

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

Группировки, итоги и порядок

Закладка «Группировка» отвечает за свёртывание данных: поля-измерения переносятся в «Группировочные поля», а числовые показатели — в «Суммируемые поля» с функцией (Сумма, Количество, Максимум, Среднее). Конструктор сам сформирует СГРУППИРОВАТЬ ПО и агрегатные функции. Помните ограничение: поле, не входящее в группировку, нельзя выбрать без агрегатной функции.

Закладка «Итоги» формирует секцию ИТОГИ ПО — она нужна для иерархических выборок с промежуточными суммами (например, итоги по контрагенту внутри организации). Закладка «Порядок» задаёт УПОРЯДОЧИТЬ ПО; для иерархических выборок доступна опция «Автоупорядочивание», которая корректно сортирует ссылки.

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

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

Конструктор умеет работать с пакетными запросами: на закладке «Объединения/Псевдонимы» и через кнопку управления запросами пакета можно добавить несколько запросов, где первый помещает результат во временную таблицу (конструктор предложит вариант «Поместить» при настройке полей), а последующие читают её как обычную таблицу.

Типовой сценарий: сначала отобрать нужные документы во временную таблицу «ВТ_Документы», затем соединить её с движениями регистров. Это сужает объём данных на раннем этапе и заметно ускоряет выполнение. В коде для пакетного запроса потребуется менеджер временных таблиц: Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;.

Проверка результата и отладка

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

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

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

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

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

Совпадает с ожидаемым числом документов или позиций по отбору

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

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

Суммы по числовым полям
Норма

Сходятся с типовым отчётом по тем же отборам

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

Суммы задвоены или часть данных потеряна

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

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

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

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

Когда конструктор не подходит

Конструктор не умеет редактировать некоторые конструкции: сложные выражения с ВЫБОР…КОГДА в полях он показывает, но создавать их приходится вручную через кнопку добавления произвольного поля. Запросы к табличным частям с нестандартной логикой, обращения к внешним источникам данных и тонкая оптимизация (например, явное указание индексов через подсказки СУБД) также делаются ручной правкой текста.

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

Итог

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

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

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

Чем конструктор запросов отличается от конструктора запроса с обработкой результата?

Конструктор с обработкой результата дополнительно генерирует код на встроенном языке: объявление объекта «Запрос», установку параметров, выполнение и обход выборки в цикле. Обычный конструктор создаёт только текст запроса. Для быстрого прототипа удобнее вариант с обработкой, для аккуратного кода — обычный, с ручным написанием обхода.

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

Да, если синтаксис корректен. Поставьте курсор внутрь строки с текстом запроса и вызовите конструктор — он распарсит текст и откроет его в визуальном виде. Исключение: некоторые редкие конструкции конструктор не отображает и может отбросить при сохранении, поэтому перед редактированием сохраните копию исходного текста.

Почему конструктор не видит нужную таблицу или поле?

Чаще всего объект добавлен в конфигурацию, но конфигурация базы данных не обновлена — выполните обновление (F7 в конфигураторе). Также проверьте, что ищете таблицу в правильном разделе дерева: движения документа по регистру находятся внутри самого регистра, а не документа.

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

На закладке «Условия» перенесите поле, выберите оператор «В» и укажите параметр, например &Список. В коде передайте в этот параметр массив или список значений через Запрос.УстановитьПараметр("Список", МассивЗначений). Для иерархических справочников используйте оператор «В ИЕРАРХИИ».

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

Типовые причины: отбор задан в секции ГДЕ вместо параметров виртуальной таблицы, выбраны лишние поля, связь идёт по неиндексированному реквизиту, отсутствует ограничение периода. Проверьте эти пункты по порядку — в большинстве случаев достаточно перенести условия в параметры виртуальной таблицы.

Подходит ли конструктор для запросов в схеме компоновки данных?

Да, на закладке «Наборы данных» СКД есть кнопка вызова того же конструктора. Учтите особенность: в запросе для СКД не нужны секции ИТОГИ и УПОРЯДОЧИТЬ ПО — группировку и сортировку выполняет сама компоновка на уровне настроек отчёта.