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

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

Как сделать запрос в 1С с помощью конструктора

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

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

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

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

Где находится конструктор запроса и как его открыть

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

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

Выбор таблиц и полей — основа запроса

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

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

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

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

На закладке «Условия» задаются ограничения выборки. Перенесите поле в список условий и настройте сравнение: равно, в списке, между, подобно. Для значений, которые будут передаваться из кода, используйте параметры — они обозначаются символом «&» (например, &НачалоПериода). Конструктор сам подставит амперсанд, если вы выберете в условии тип значения «Параметр».

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

Для сравнения дат помните о границах периода: условие «меньше или равно концу дня» корректнее, чем простое равенство дате без времени. Для отбора по списку значений используйте оператор «В (&Список)» и передавайте в параметр массив или список значений.

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

Соединения таблиц, группировки и итоги

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

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

Закладка «Итоги» позволяет добавить подитоги по иерархии полей — например, общие итоги и итоги по каждой организации. Учтите, что итоги увеличивают объём выборки; если итоговые строки в коде не обрабатываются, закладку лучше оставить пустой. Сортировка результата задаётся на закладке «Порядок» — там же можно включить автоупорядочивание, но явная сортировка предсказуемее.

Конструктор или ручной текст запроса

Конструктор запроса

Подходит новичкам и для сложных запросов с соединениями и итогами: исключает синтаксические ошибки. Ограничение — медленнее при мелких правках существующего текста.

Ручное редактирование текста

Быстрее для опытных разработчиков и мелких исправлений. Ограничение — выше риск опечаток в именах полей, которые проявятся только при выполнении.

Конструктор с обработкой результата

Вариант «Конструктор запроса с обработкой результата» создаёт не только текст, но и заготовку кода обхода выборки. Удобно для быстрого старта, но шаблонный код обычно требует доработки.

Вставка запроса в код и выполнение

После нажатия «ОК» конструктор вставляет текст запроса в модуль. Дальше его нужно выполнить программно. Стандартная последовательность: создать объект «Запрос», присвоить текст, установить параметры, выполнить и обойти результат.

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ

| ПродажиОбороты.Номенклатура КАК Номенклатура,

| СУММА(ПродажиОбороты.СуммаОборот) КАК Сумма

|ИЗ

| РегистрНакопления.Продажи.Обороты(&Начало, &Конец, , ) КАК ПродажиОбороты

|СГРУППИРОВАТЬ ПО

| ПродажиОбороты.Номенклатура";

Запрос.УстановитьПараметр("Начало", НачалоМесяца(ТекущаяДатаСеанса()));

Запрос.УстановитьПараметр("Конец", КонецМесяца(ТекущаяДатаСеанса()));

Результат = Запрос.Выполнить();

Выборка = Результат.Выбрать();

Пока Выборка.Следующий() Цикл

Сообщить(Выборка.Номенклатура.Наименование + ": " + Выборка.Сумма);

КонецЦикла;

Обратите внимание: имена параметров в «УстановитьПараметр» указываются без символа «&». Если параметр не установлен, при выполнении возникнет ошибка — это одна из самых частых причин сбоев у новичков.

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

Проверка результата и типичные ошибки

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

Типичные ошибки
01
Не установлен параметр запроса — при выполнении возникает ошибка «Переменная не определена» или неверный отбор
02
Отбор накладывается в секции ГДЕ вместо параметров виртуальной таблицы — запрос сканирует больше данных и работает медленнее
03
Выбираются все поля таблицы вместо нужных — лишняя нагрузка на сервер и сеть
04
Левое соединение заменено внутренним (или наоборот) без понимания разницы — из результата пропадают или появляются лишние строки
05
Обращение к полям выборки до проверки, что выборка не пустая — ошибка при пустом результате
06
Сравнение дат без учёта времени — документы на границе периода теряются из выборки

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

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

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

Количество строк результата
Норма

Совпадает с ожиданием по данным тестового периода

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

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

Суммы в группировке
Норма

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

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

Расхождения — вероятно, задвоение из-за соединения или неверный период

Скорость выполнения
Норма

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

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

Запрос «висит» — добавьте отборы и параметры виртуальных таблиц

Пустой результат
Норма

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

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

Ошибка при отсутствии данных — добавьте проверку перед обращением к полям

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

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

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

Итог

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

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

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

Как открыть конструктор запроса, если пункт меню неактивен?

Убедитесь, что курсор стоит внутри модуля в месте, где допустим текст запроса — обычно между кавычками строкового литерала или в пустой строке, где платформа предложит создать конструкцию. Если курсор находится вне редактора кода (например, в дереве конфигурации), пункт меню будет недоступен.

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

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

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

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

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

Да, конструктор доступен в модулях управляемых форм так же, как и в обычных. Но сам запрос следует выполнять в серверной процедуре (с директивой «&НаСервере»), потому что прямое обращение к базе данных с клиента в управляемом приложении не поддерживается.

Как отладить запрос, не меняя код конфигурации?

Используйте консоль запросов — внешнюю обработку, которая позволяет вставить текст запроса, задать параметры и выполнить его интерактивно с просмотром результата. Это самый быстрый способ проверить логику выборки до встраивания запроса в прикладной код.

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

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