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