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

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

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

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

Конструктор запросов встроен в платформу 1С:Предприятие 8 и доступен в нескольких режимах. Основные способы его вызова:

  • 🔧 В конфигураторе: откройте любой модуль (например, модуль объекта или модуль формы), напишите ключевое слово Запрос, поставьте точку — система предложит вариант НовыйЗапрос(). После создания объекта запроса появится контекстное меню с пунктом Конструктор запроса.
  • 📊 В режиме предприятия: через отладчик (Ctrl+Alt+F12) или внешнюю обработку, если она поддерживает работу с запросами. Например, в отчётах часто есть кнопка «Настроить запрос», которая открывает конструктор.
  • 🖥️ В внешних обработках: если обработка содержит код с объектом Запрос, можно вызвать конструктор прямо из неё, кликнув правой кнопкой на переменной запроса и выбрав соответствующий пункт.

Важно: в некоторых конфигурациях (например, 1С:Бухгалтерия 3.0 или 1С:УТ 11) доступ к конструктору может быть ограничен правами пользователя. Если пункта нет в меню, проверьте настройки ролей или обратитесь к администратору.

📊 Как часто вы используете конструктор запросов в 1С?
Постоянно, это мой основной инструмент
Иногда, для сложных запросов
Рядом, но предпочитаю писать код вручную
Никогда не пользовался

Интерфейс конструктора: основные панели и их назначение

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

  1. Панель «Таблицы и поля» (слева): здесь отображаются все доступные таблицы базы данных (справочники, документы, регистры и т.д.). Можно добавлять их в запрос перетаскиванием или двойным кликом. При добавлении таблицы автоматически подгружаются её поля.
  2. Панель «Связи» (центр): визуальное отображение соединений между таблицами. Конструктор сам предлагает связи по ключевым полям (например, Ссылка в документах), но их можно редактировать вручную.
  3. Панель «Поля» (справа): список полей, которые будут включены в результат запроса. Здесь же настраиваются псевдонимы, агрегатные функции (СУММА, КОЛИЧЕСТВО) и порядок сортировки.
  4. Панель «Условия» (внизу): фильтры для данных. Например, можно ограничить выборку по дате или статусу документа.
  5. Панель «Текст запроса» (внизу): отображает сгенерированный код на встроенном языке. Его можно копировать и вставлять в модули.

Обратите внимание на кнопку Показать план запроса — она позволяет оценить, как будет выполнять запрос, и оптимизировать его. Например, если в плане видно полное сканирование таблицы (TABLE SCAN), стоит добавить индексируемые поля в условия.

💡

Если в панели «Таблицы и поля» не отображаются нужные объекты, проверьте, что в настройках конструктора включена опция «Показывать все таблицы». Это особенно актуально для виртуальных таблиц регистров накопления или бухгалтерских итогов.

Создание простого запроса: пошаговая инструкция

Рассмотрим процесс создания запроса на примере выборки документов РеализацияТоваровУслуг за текущий месяц. Следуйте инструкции:

Добавить таблицу документов в конструктор|

Выбрать нужные поля (дату, номер, сумму)|

Задать условие по периоду (текущий месяц)|

Указать сортировку по дате (по убыванию)|

Проверить текст запроса на ошибки-->

1. Добавление таблицы: в панели «Таблицы и поля» найдите Документ.РеализацияТоваровУслуг и перенесите её в центральную область. Конструктор автоматически создаст псевдоним (например, РеализацияТоваровУслуг).

2. Выбор полей: в панели «Поля» отметьте галочками:

- РеализацияТоваровУслуг.Дата

- РеализацияТоваровУслуг.Номер

- РеализацияТоваровУслуг.СуммаДокумента

Для удобства переименуйте поля через свойство «Псевдоним» (например, СуммаДокументаСумма).

3. Условия фильтрации: в панели «Условия» добавьте строку:

- Поле: РеализацияТоваровУслуг.Дата

- Условие: Больше или равно

- Значение: &НачалоМесяца(ТекущаяДата())

Затем добавьте вторую строку с условием Меньше или равно и значением &КонецМесяца(ТекущаяДата()).

4. Сортировка: в панели «Поля» для поля Дата установите сортировку По убыванию.

5. Проверка и выполнение: нажмите ОК, чтобы сгенерировать текст запроса. Его можно выполнить сразу в конструкторе (кнопка Выполнить) или скопировать в код:

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

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

"ВЫБРАТЬ

| РеализацияТоваровУслуг.Дата КАК Дата,

| РеализацияТоваровУслуг.Номер КАК Номер,

| РеализацияТоваровУслуг.СуммаДокумента КАК Сумма

|ИЗ

| Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг

|ГДЕ

| РеализацияТоваровУслуг.Дата МЕЖДУ &НачалоМесяца(ТекущаяДата()) И &КонецМесяца(ТекущаяДата())

|УПОРЯДОЧИТЬ ПО

| Дата УБЫВ";

💡

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

Работа с соединениями таблиц: INNER JOIN, LEFT JOIN и их аналоги в 1С

Одной из самых мощных функций конструктора является возможность визуально строить соединения между таблицами. В используются следующие типы соединений:

  • 🔗 Внутреннее соединение (INNER JOIN): возвращает только те записи, для которых есть соответствия в обеих таблицах. В конструкторе устанавливается по умолчанию при добавлении второй таблицы.
  • 🔗 Левое соединение (LEFT JOIN): возвращает все записи из левой таблицы и соответствующие им записи из правой. В конструкторе выбирается в свойствах связи.
  • 🔗 Правое соединение (RIGHT JOIN): аналогично левому, но возвращает все записи из правой таблицы. В используется редко, так как можно поменять таблицы местами.
  • 🔗 Полное соединение (FULL JOIN): возвращает все записи из обеих таблиц. В конструкторе не поддерживается напрямую, но можно эмулировать через объединение запросов (ОБЪЕДИНИТЬ).

Пример: выберем реализации товаров с указанием контрагента. Для этого нужно соединить таблицу документов РеализацияТоваровУслуг со справочником Контрагенты:

  1. Добавьте в конструктор обе таблицы.
  2. В панели «Связи» установите соединение по полю РеализацияТоваровУслуг.КонтрагентКонтрагенты.Ссылка.
  3. Выберите тип соединения Левое, чтобы в результат попали все реализации, даже если контрагент не найден (например, удалён).
  4. Добавьте в поля выборки Контрагенты.Наименование.

В результате текст запроса будет содержать конструкцию ЛЕВОЕ СОЕДИНЕНИЕ:

ВЫБРАТЬ

РеализацияТоваровУслуг.Дата КАК Дата,

РеализацияТоваровУслуг.Номер КАК Номер,

Контрагенты.Наименование КАК Контрагент

ИЗ

Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг

ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Контрагенты КАК Контрагенты

ПО РеализацияТоваровУслуг.Контрагент = Контрагенты.Ссылка

Что делать, если конструктор не предлагает связь между таблицами?

Если автоматические связи не строятся, проверьте:

1. Совпадают ли типы полей (например, обе стороны связи должны быть типа «Ссылка»).

2. Нет ли в конфигурации кастомных реквизитов, которые используются для связи вместо стандартных.

3. Не заблокированы ли таблицы в настройках конструктора (панель «Таблицы и поля» → «Настройки»).

Если связь всё равно не появляется, добавьте её вручную, указав поля в свойствах соединения.

Агрегатные функции и группировка данных

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

Рассмотрим пример: нужно получить сумму продаж по каждому контрагенту за год. Алгоритм:

  1. Добавьте таблицы РеализацияТоваровУслуг и Контрагенты, связав их по полю Контрагент.
  2. В панели «Поля» добавьте:

    - Контрагенты.Наименование (группировка)

    - СУММА(РеализацияТоваровУслуг.СуммаДокумента) (агрегатная функция)

  3. В панели «Условия» добавьте фильтр по дате: РеализацияТоваровУслуг.Дата МЕЖДУ &НачалоГода(ТекущаяДата()) И &КонецГода(ТекущаяДата()).
  4. Включите опцию «Группировка» в свойствах запроса (или конструктор сделает это автоматически при добавлении агрегатной функции).

Результирующий запрос:

ВЫБРАТЬ

Контрагенты.Наименование КАК Контрагент,

СУММА(РеализацияТоваровУслуг.СуммаДокумента) КАК СуммаПродаж

ИЗ

Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг

ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Контрагенты КАК Контрагенты

ПО РеализацияТоваровУслуг.Контрагент = Контрагенты.Ссылка

ГДЕ

РеализацияТоваровУслуг.Дата МЕЖДУ &НачалоГода(ТекущаяДата()) И &КонецГода(ТекущаяДата())

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

Контрагенты.Наименование

Важно: если в результате группировки появляются дублирующиеся строки, проверьте, все ли неагрегируемые поля включены в СГРУППИРОВАТЬ ПО. Например, если в выборке есть поле РеализацияТоваровУслуг.Валюта, его тоже нужно добавить в группировку.

💡

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

Использование параметров и динамических значений

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

Примеры применения:

  • 📅 Даты: &НачалоПериода и &КонецПериода для гибкого фильтра по временному интервалу.
  • 🔍 Ссылки на объекты: &Контрагент для выборки данных по конкретному партнёру.
  • 📊 Списки значений: &СписокНоменклатуры для фильтрации по массиву товаров.

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

  1. В панели «Условия» или «Поля» введите имя параметра с префиксом & (например, &ДатаНачала).
  2. Конструктор автоматически добавит его в список параметров (панель «Параметры» внизу).
  3. При выполнении запроса из кода передайте значение через метод УстановитьПараметр():
Запрос = Новый Запрос;

Запрос.Текст = "ВЫБРАТЬ ... ГДЕ Дата >= &ДатаНачала";

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

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

Для передачи сложных типов (например, массива ссылок) используйте метод УстановитьПараметр с соответствующим типом:

СписокКонтрагентов = Новый Массив;

СписокКонтрагентов.Добавить(Справочники.Контрагенты.НайтиПоНаименованию("ООО Ромашка"));

Запрос.УстановитьПараметр("СписокКонтрагентов", СписокКонтрагентов);

💡

Параметры не только делают запросы гибкими, но и защищают от SQL-инъекций. Всегда используйте их вместо конкатенации строк в условиях.

Оптимизация запросов: план выполнения и типичные ошибки

Даже правильно составленный запрос может работать медленно из-за неоптимального плана выполнения. В конструкторе есть инструмент для анализа плана — кнопка Показать план запроса. Он отображает, как будет извлекать данные: через сканирование таблиц (TABLE SCAN) или использование индексов (INDEX SEEK).

Распространённые ошибки и способы их исправления:

Проблема Причина Решение
Долгое выполнение Отсутствие индексов по полям в условиях Добавьте индексируемые поля (например, Дата, Ссылка) в условия или создайте индексы в конфигураторе
Избыточные данные Выборка всех полей (РеализацияТоваровУслуг.*) Укажите только необходимые поля в конструкторе
Дублирующиеся строки Отсутствует группировка по неагрегируемым полям Добавьте все неагрегируемые поля в СГРУППИРОВАТЬ ПО
Ошибка "Поле не найдено" Опечатка в имени поля или таблицы Проверьте названия в метаданных или используйте псевдонимы

Пример оптимизации: если запрос с условием по строковому полю (например, Наименование) выполняется медленно, замените его на фильтрацию по ссылке или коду:

// Медленно (полнотекстовый поиск)

ГДЕ Контрагенты.Наименование ПОДОБНО "%Ромашка%"

// Быстро (поиск по ссылке)

ГДЕ Контрагенты.Ссылка В (&СписокСсылок)

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

В режиме отладки (Ctrl+Alt+F12) после выполнения запроса откройте вкладку «Статистика». Там отображается время выполнения, количество прочитанных строк и используемые индексы. Это помогает выявить «узкие места».

Продвинутые возможности: временные таблицы, объединения и подзапросы

Конструктор запросов поддерживает и более сложные операции, которые обычно требуют ручного кодирования:

  • 📝 Временные таблицы: позволяют сохранять промежуточные результаты. В конструкторе добавляются через панель «Таблицы» → «Временные таблицы». Пример использования — кэширование часто используемых данных.
  • 🔄 Объединения (UNION): комбинирование результатов нескольких запросов. В конструкторе реализуется через добавление нескольких блоков ВЫБРАТЬ с опцией ОБЪЕДИНИТЬ.
  • 🔍 Подзапросы: запросы внутри запросов. В конструкторе создаются через панель «Поля» → «Добавить подзапрос». Например, можно выбрать товары, которые продавались больше среднего количества.

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

ВЫБРАТЬ

АктивныеКонтрагенты.Ссылка КАК Контрагент,

СУММА(РеализацияТоваровУслуг.СуммаДокумента) КАК Сумма

ИЗ

Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг

ВНУТРЕННЕЕ СОЕДИНЕНИЕ &АктивныеКонтрагенты КАК АктивныеКонтрагенты

ПО РеализацияТоваровУслуг.Контрагент = АктивныеКонтрагенты.Ссылка

ГДЕ

РеализацияТоваровУслуг.Дата МЕЖДУ &НачалоГода И &КонецГода

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

АктивныеКонтрагенты.Ссылка

Для создания временной таблицы АктивныеКонтрагенты в конструкторе:

  1. Добавьте новую временную таблицу в панели «Таблицы».
  2. Задайте ей имя (например, АктивныеКонтрагенты).
  3. В свойствах таблицы укажите запрос для её заполнения (например, выборка контрагентов с флагом ПометкаУдаления = Ложь).
💡

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

FAQ: ответы на частые вопросы о конструкторе запросов

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

Да, но с ограничениями. Конструктор не поддерживает синтаксис ПОЛНЫЙТЕКСТОВЫЙПОИСК напрямую, но можно:

  1. Создать запрос вручную с оператором ПОДОБНО или СОДЕРЖИТ.
  2. Использовать временную таблицу, заполненную результатами полнотекстового поиска, а затем присоединить её в конструкторе.

Пример условия для простого поиска: Контрагенты.Наименование ПОДОБНО "%ИП%".

Как экспортировать запрос из конструктора в внешний файл?

Конструктор не имеет функции прямого экспорта, но можно:

  1. Скопировать текст запроса из панели «Текст запроса» и сохранить в текстовый файл.
  2. Использовать внешнюю обработку, которая сохраняет запросы в .txt или .qs (формат запросов 1С).
  3. Для регулярного использования создайте обработку с коллекцией часто используемых запросов.
Почему конструктор не показывает некоторые таблицы (например, регистры бухгалтерии)?

Это может быть связано с:

  • Ограничениями прав текущего пользователя (проверьте роль в конфигураторе).
  • Настройками конструктора: включите опцию «Показывать все таблицы» в меню «Настройки».
  • Особенностями конфигурации: некоторые виртуальные таблицы (например, РегистрБухгалтерии.ХозРасчеты) требуют указания периода в параметрах.

Если таблица всё равно не отображается, попробуйте добавить её вручную через панель «Таблицы» → «Добавить таблицу» и введите имя вручную.

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

Для этого:

  1. Добавьте в запрос поле для группировки (например, ВЫРАЗИТЬ(РеализацияТоваровУслуг.Дата КАК ДАТА) КАК Месяц).
  2. Добавьте агрегатные функции (например, СУММА(СуммаДокумента)).
  3. Включите группировку по полю Месяц.

Пример:

ВЫБРАТЬ

ВЫРАЗИТЬ(РеализацияТоваровУслуг.Дата КАК ДАТА) КАК Месяц,

СУММА(РеализацияТоваровУслуг.СуммаДокумента) КАК Сумма

ИЗ

Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг

ГДЕ

РеализацияТоваровУслуг.Дата МЕЖДУ &НачалоГода И &КонецГода

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

Месяц

Можно ли в конструкторе создать запрос с рекурсией?

Нет, конструктор не поддерживает рекурсивные запросы (например, для обхода иерархических справочников). Для этого придётся писать код вручную с использованием оператора ОБЪЕДИНИТЬ или временных таблиц. Пример рекурсивного обхода справочника Номенклатура:

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

"ВЫБРАТЬ РАЗЛИЧНЫЕ Номенклатура.Ссылка КАК Ссылка

ИЗ Справочник.Номенклатура КАК Номенклатура

ГДЕ Номенклатура.Ссылка В (&СписокСсылок)

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ РАЗЛИЧНЫЕ Номенклатура.Родитель КАК Ссылка

ИЗ Справочник.Номенклатура КАК Номенклатура

ГДЕ Номенклатура.Ссылка В (&СписокСсылок)";