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

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

Конструктор запросов 1С: как пользоваться

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

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

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

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

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

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

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

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

Выбор таблиц и полей

После открытия конструктор показывает три колонки: доступные объекты базы данных (таблицы), выбранные таблицы и список полей. В левой колонке раскройте нужный раздел — «Справочники», «Документы», «РегистрыНакопления», «РегистрыСведений» — и перетащите таблицу в среднюю колонку или выделите и нажмите кнопку переноса.

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

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

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

Параметры виртуальных таблиц и отборы

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

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

Для отбора по списку значений используйте оператор «В» с параметром, содержащим массив или список значений. Для проверки иерархии (элемент и все его подчинённые) — оператор «В ИЕРАРХИИ». Для текстового поиска по шаблону — оператор «ПОДОБНО» с символами подстановки.

Связи между таблицами

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

Условие связи обычно строится по ссылочному полю: например, Товары.Ссылка = Обороты.Номенклатура. Конструктор часто предлагает связь автоматически, но её нужно проверить: автоматическая связь по совпадению имён полей бывает неверной, особенно когда в таблицах несколько полей с одинаковыми типами.

Группировки, итоги и упорядочивание

Закладка «Группировка» отвечает за агрегацию. Поля, по которым группируются данные, переносятся в верхний список, а для остальных полей выбирается агрегатная функция: СУММА, КОЛИЧЕСТВО, МАКСИМУМ, МИНИМУМ, СРЕДНЕЕ. Частая ошибка — оставить поле в выборке без группировки и без функции: конструктор это пропустит, но платформа при выполнении выдаст ошибку либо результат будет не тем, что ожидался.

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

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

bsl
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| Остатки.Номенклатура КАК Номенклатура,
| СУММА(Остатки.КоличествоОстаток) КАК Количество
|ИЗ
| РегистрНакопления.ТоварыНаСкладах.Остатки(&Период, Склад = &Склад) КАК Остатки
|СГРУППИРОВАТЬ ПО
| Остатки.Номенклатура";
Запрос.УстановитьПараметр("Период", КонецДня(ТекущаяДатаСеанса()));
Запрос.УстановитьПараметр("Склад", Склад);
Результат = Запрос.Выполнить().Выгрузить();

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

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

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

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

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

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

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

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

Строки дублируются или пропадают после добавления связи

Суммы по группам
Норма

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

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

Суммы завышены кратно — признак декартова умножения

Поля из соединённой таблицы
Норма

Заполнены либо явно обработаны через ЕСТЬNULL

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

Встречаются NULL там, где ожидались значения

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

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

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

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

Типичные ошибки и ограничения конструктора

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

Ещё одно ограничение: сложные произвольные выражения, вложенные запросы и объединения конструктор поддерживает, но редактировать их в нём менее удобно, чем вручную. Нередко рабочий процесс выглядит так: основу собирают в конструкторе, а тонкие места — вычисляемые поля, ВЫБОР КОГДА, вложенные запросы — дописывают в тексте вручную. После ручной правки конструктор всё ещё может открыть запрос, если синтаксис остался корректным.

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

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

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

На закладке «Условия» или в параметрах виртуальной таблицы в поле значения введите имя с амперсандом, например &Склад. Конструктор распознает его как параметр. Перед выполнением запроса в коде обязательно вызовите Запрос.УстановитьПараметр("Склад", Значение), иначе получите ошибку о незаданном параметре.

Почему конструктор не открывает мой запрос?

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

Чем отличается таблица «Остатки» от «ОстаткиИОбороты»?

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

Можно ли построить запрос к нескольким одинаковым регистрам?

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

Как сделать итоги по группам в одном запросе?

Используйте закладку «Итоги»: укажите группировочные поля в секции «ИТОГИ ПО» и суммируемые поля. При обходе результата в коде используйте ВыборкаПоГруппировкам, чтобы получить строки подытогов, а внутри них — детальные записи.

Конструктор в толстом и тонком клиенте одинаковый?

Функционально да — это инструмент конфигуратора и поле построения запроса работает одинаково. Различия касаются только внешнего вида диалогов. Консоль запросов для отладки в режиме предприятия может быть реализована по-разному в зависимости от используемой обработки.

Итог

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

Конструктор запросов собирает синтаксически корректный текст, но логику проверяет разработчик. Отборы по измерениям задавайте в параметрах виртуальных таблиц, связи проверяйте на дубли, NULL обрабатывайте через ЕСТЬNULL, а готовый запрос всегда выполняйте на тестовых данных до использования в рабочем коде.