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