Разработка и Конфигурация · 11 мин
Как работать с конструктором запросов в 1С
Как работать с конструктором запросов в 1С: выбор таблиц, связи, условия, группировки, итоги и временные таблицы. Пошаговая инструкция с примерами и типичными ошибками.
Конструктор запросов в 1С — это визуальный инструмент, который позволяет собрать текст запроса на встроенном языке запросов без ручного написания синтаксиса. Он доступен в конфигураторе и вызывается из модуля, схемы компоновки данных или консоли запросов. Инструмент одинаково полезен и новичку, который ещё не помнит ключевые слова языка запросов, и опытному разработчику, которому нужно быстро собрать сложную выборку из нескольких таблиц.
Главная ценность конструктора в том, что он показывает реальную структуру метаданных конфигурации: доступные таблицы документов, регистров, справочников, их поля и виртуальные таблицы с параметрами. Это снижает количество ошибок в именах полей и помогает сразу увидеть, какие связи между данными возможны.
Ниже разобран практический порядок работы: от открытия конструктора до проверки готового запроса, с разбором типичных ошибок, ограничений и ситуаций, когда конструктор лучше не использовать.
Как открыть конструктор запросов
Основной способ — в модуле конфигуратора. Установите курсор в то место кода, где должен находиться текст запроса, щёлкните правой кнопкой мыши и выберите пункт «Конструктор запроса…». Если текст запроса ещё не создан, среда предложит создать его автоматически вместе с обрамлением в виде строки. Если запрос уже написан, конструктор откроет его для редактирования — это удобно для доработки существующего кода.
Второй путь — через консоль запросов (внешнюю обработку или встроенный инструмент в некоторых конфигурациях). Там конструктор вызывается кнопкой на панели и позволяет сразу выполнить запрос и посмотреть результат. Третий вариант — закладка «Запрос» в схеме компоновки данных, где конструктор открывается кнопкой «Конструктор запроса» рядом с полем текста запроса.
Выбор таблиц и полей: с чего начинается запрос
После открытия конструктора на закладке «Таблицы и поля» слева отображается дерево всех объектов конфигурации: справочники, документы, регистры сведений и накопления, перечисления. Раскройте нужный узел и перенесите таблицу в список «Таблицы» двойным щелчком или кнопкой со стрелкой. Затем из выбранной таблицы перенесите нужные поля в список «Поля».
Обратите внимание на виртуальные таблицы регистров: у регистра накопления доступны «Обороты», «Остатки», «ОстаткиИОбороты», у регистра сведений — «СрезПоследних» и «СрезПервых». Именно они используются чаще всего, потому что содержат уже рассчитанные итоги. При выборе виртуальной таблицы конструктор предлагает задать её параметры — период, условие отбора. Параметры лучше задавать через символ «&» (например, &НачалоПериода), чтобы потом передавать значения из кода.
Практическое правило: выбирайте только те поля, которые реально нужны в результате. Запрос вида «выбрать всё» увеличивает объём выборки и замедляет выполнение, особенно на больших таблицах документов.
- 1Откройте конструктор из модуля: правый клик → «Конструктор запроса…»
- 2На закладке «Таблицы и поля» перенесите нужную таблицу (например, РегистрНакопления.Продажи.Обороты)
- 3Задайте параметры виртуальной таблицы через &Параметр
- 4Перенесите нужные поля в список «Поля»
- 5Нажмите «ОК» и проверьте сгенерированный текст запроса
- 6В коде задайте значения параметров через Запрос.УстановитьПараметр() и выполните запрос
Связи таблиц и объединения
Когда в запросе несколько таблиц, на закладке «Связи» конструктор обычно сам предлагает условие связи — по ссылке, измерению или реквизиту. Проверьте тип соединения: по умолчанию ставится внутреннее соединение, которое отбрасывает строки без пары. Если нужно получить все строки левой таблицы независимо от наличия данных в правой (типичный случай — справочник номенклатуры и остатки), переключите тип на «Левое соединение».
Флажок «Все» у таблицы в списке связей — это альтернативный способ задать левое или правое соединение. Убедитесь, что условие связи включает все ключевые измерения: неполное условие даст декартово произведение и раздует результат в разы.
Закладка «Объединения/Псевдонимы» нужна, когда требуется склеить строки из разных источников (например, продажи и возвраты) через ОБЪЕДИНИТЬ или ОБЪЕДИНИТЬ ВСЕ. Там же задаются псевдонимы полей — короткие понятные имена, под которыми поля попадут в выборку.
Условия, параметры и отборы
На закладке «Условия» формируется секция ГДЕ. Перенесите поле, задайте оператор сравнения и значение. Для значений, которые будут подставляться из кода, всегда используйте параметры вида &Организация, а не жёстко прописанные константы — это делает запрос универсальным и позволяет СУБД переиспользовать план выполнения.
Для отбора по списку значений используйте оператор «В» с параметром-списком: Номенклатура В (&СписокНоменклатуры). Для отбора по иерархии справочника — «В ИЕРАРХИИ». Условие на виртуальную таблицу по возможности задавайте в её параметрах, а не в секции ГДЕ: отбор на уровне виртуальной таблицы выполняется раньше и уменьшает объём обрабатываемых данных.
Частая ситуация: запрос с отбором по периоду работает медленно, хотя параметры заданы. Проверьте, где стоит условие. Если период передан в секцию ГДЕ, а не в параметры виртуальной таблицы «Обороты», платформа сначала рассчитает обороты за всё время хранения данных и только потом отфильтрует — на больших базах разница по времени измеряется минутами.
Группировки, итоги и порядок
Закладка «Группировка» отвечает за свёртывание данных: поля-измерения переносятся в «Группировочные поля», а числовые показатели — в «Суммируемые поля» с функцией (Сумма, Количество, Максимум, Среднее). Конструктор сам сформирует СГРУППИРОВАТЬ ПО и агрегатные функции. Помните ограничение: поле, не входящее в группировку, нельзя выбрать без агрегатной функции.
Закладка «Итоги» формирует секцию ИТОГИ ПО — она нужна для иерархических выборок с промежуточными суммами (например, итоги по контрагенту внутри организации). Закладка «Порядок» задаёт УПОРЯДОЧИТЬ ПО; для иерархических выборок доступна опция «Автоупорядочивание», которая корректно сортирует ссылки.
Если запрос строится для схемы компоновки данных, итоги и порядок в тексте запроса часто не нужны вовсе — СКД выполнит группировку сама на уровне настроек отчёта. Лишние секции в этом случае только замедляют выполнение.
Временные таблицы и пакетные запросы
Конструктор умеет работать с пакетными запросами: на закладке «Объединения/Псевдонимы» и через кнопку управления запросами пакета можно добавить несколько запросов, где первый помещает результат во временную таблицу (конструктор предложит вариант «Поместить» при настройке полей), а последующие читают её как обычную таблицу.
Типовой сценарий: сначала отобрать нужные документы во временную таблицу «ВТ_Документы», затем соединить её с движениями регистров. Это сужает объём данных на раннем этапе и заметно ускоряет выполнение. В коде для пакетного запроса потребуется менеджер временных таблиц: Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;.
Проверка результата и отладка
После генерации текста запроса вставьте его в код, задайте параметры и выполните в отладчике, либо скопируйте текст в консоль запросов и выполните там — так быстрее увидеть выборку. Сверьте количество строк и контрольные суммы с данными, которые видны в стандартных отчётах: расхождение почти всегда означает ошибку в связях или условиях.
Если результат пустой, проверяйте по шагам: сначала запрос без условий, затем добавляйте отборы по одному. Если строк наоборот слишком много — ищите неполное условие связи. Для оценки производительности на больших таблицах полезно посмотреть план запроса в технологическом журнале или через консоль с замером времени.
Как проверить результат запроса
Совпадает с ожидаемым числом документов или позиций по отбору
Строк в разы больше — признак неполной связи; ноль строк при наличии данных — лишнее условие
Сходятся с типовым отчётом по тем же отборам
Суммы задвоены или часть данных потеряна
Запрос с отборами выполняется за секунды на рабочем объёме данных
Выполнение занимает минуты — проверьте параметры виртуальных таблиц и индексы
Когда конструктор не подходит
Конструктор не умеет редактировать некоторые конструкции: сложные выражения с ВЫБОР…КОГДА в полях он показывает, но создавать их приходится вручную через кнопку добавления произвольного поля. Запросы к табличным частям с нестандартной логикой, обращения к внешним источникам данных и тонкая оптимизация (например, явное указание индексов через подсказки СУБД) также делаются ручной правкой текста.
Поэтому рабочий подход такой: собрать каркас запроса конструктором, а затем доработать текст вручную. После ручной правки конструктор всё ещё откроет запрос, если синтаксис остался корректным, но при несовместимых конструкциях предупредит, что часть настроек может быть потеряна, — перед таким открытием сохраните копию текста.
Что важно запомнить
Конструктор запросов собирает текст запроса по шагам: таблицы → поля → связи → условия → группировки → итоги. Ключевые правила: отборы задавать в параметрах виртуальных таблиц, значения передавать через параметры, тип соединения выбирать осознанно, а результат проверять сверкой с типовым отчётом на копии базы.
Частые вопросы
Чем конструктор запросов отличается от конструктора запроса с обработкой результата?
Конструктор с обработкой результата дополнительно генерирует код на встроенном языке: объявление объекта «Запрос», установку параметров, выполнение и обход выборки в цикле. Обычный конструктор создаёт только текст запроса. Для быстрого прототипа удобнее вариант с обработкой, для аккуратного кода — обычный, с ручным написанием обхода.
Можно ли редактировать конструктором запрос, написанный вручную?
Да, если синтаксис корректен. Поставьте курсор внутрь строки с текстом запроса и вызовите конструктор — он распарсит текст и откроет его в визуальном виде. Исключение: некоторые редкие конструкции конструктор не отображает и может отбросить при сохранении, поэтому перед редактированием сохраните копию исходного текста.
Почему конструктор не видит нужную таблицу или поле?
Чаще всего объект добавлен в конфигурацию, но конфигурация базы данных не обновлена — выполните обновление (F7 в конфигураторе). Также проверьте, что ищете таблицу в правильном разделе дерева: движения документа по регистру находятся внутри самого регистра, а не документа.
Как в конструкторе задать отбор по списку значений?
На закладке «Условия» перенесите поле, выберите оператор «В» и укажите параметр, например &Список. В коде передайте в этот параметр массив или список значений через Запрос.УстановитьПараметр("Список", МассивЗначений). Для иерархических справочников используйте оператор «В ИЕРАРХИИ».
Почему запрос, собранный конструктором, работает медленно?
Типовые причины: отбор задан в секции ГДЕ вместо параметров виртуальной таблицы, выбраны лишние поля, связь идёт по неиндексированному реквизиту, отсутствует ограничение периода. Проверьте эти пункты по порядку — в большинстве случаев достаточно перенести условия в параметры виртуальной таблицы.
Подходит ли конструктор для запросов в схеме компоновки данных?
Да, на закладке «Наборы данных» СКД есть кнопка вызова того же конструктора. Учтите особенность: в запросе для СКД не нужны секции ИТОГИ и УПОРЯДОЧИТЬ ПО — группировку и сортировку выполняет сама компоновка на уровне настроек отчёта.