Конструктор запросов 1С: как открыть и собрать запрос

Дата: 06.10.2026 16:54:16
Запросы
Конструктор запросов
Язык запросов
Пакетный запрос
Конфигуратор
УТ 11
Комментарий:
0
Платформа:
8.3
Конфигурация:
Любая
Формы:
Любые

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

Работа с конструктором запросов 1С 8.3 одинакова в любой конфигурации; имена объектов в примерах — из УТ 11.4 (в КА 2.5 такие же), подписи — по платформе 8.3.27.

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

Где находится конструктор запросов в 1С, зависит от того, где лежит текст запроса:

  • Модуль в Конфигураторе. Курсор — в любое место текста запроса (внутрь строки "ВЫБРАТЬ …"), затем контекстное меню → «Конструктор запроса...» или главное меню «Текст» → «Конструктор запроса...». По «ОК» новый текст заменит старый.
  • Новый запрос. Если курсор вне текста, платформа спросит «Не найден текст запроса. Создать новый запрос?». После «Да» откроется пустой конструктор, а результат вставится в позицию курсора.
  • С кодом выполнения. «Конструктор запроса с обработкой результата...» добавит и код выполнения с обходом результата (см. ниже).
  • СКД. У набора данных-запроса конструктор вызывается кнопкой над текстом запроса и работает в режиме компоновки — с закладками «Компоновка данных» и «Характеристики».
  • 1С:Предприятие. Через консоль: в консоли запросов 1C-Only это кнопка «Конструктор», а F5 или Ctrl+Enter выполняют запрос.

Конструктор запросов 1С: все закладки на одном примере

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

«Таблицы и поля»

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

«Условия»

Условия в конструкторе запросов 1С задаются перетаскиванием поля в список условий: для поля выбирают вид сравнения и имя параметра, а параметр с & конструктор заведёт сам. Для МЕЖДУ и выражений удобнее флажок «Произвольное» — условие пишется текстом. Нам нужны: …Ссылка.Проведен и …Ссылка.Дата МЕЖДУ &НачалоПериода И &КонецПериода. Значения параметров задаются в коде, подробнее — в статье про параметры запроса.

«Дополнительно» и «Индекс»

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

«Объединения/Псевдонимы»

Добавьте в список запросов объединения второй запрос — для возвратов — и настройте его так же, как первый, но с таблицей Документ.ВозвратТоваровОтКлиента.Товары. У полей Количество и СуммаСНДС через «Изменить» поставьте минус: при суммировании возвраты вычтутся. В таблице псевдонимов строка — поле результата, колонка — часть объединения; имя поля и соответствие меняются клавишей Enter. Назовите третье поле Сумма. Флажок «Без дубл.» не ставьте: он превращает ОБЪЕДИНИТЬ ВСЕ в ОБЪЕДИНИТЬ, и одинаковые строки разных документов схлопнутся в одну.

«Пакет запросов»

Добавьте в пакет второй запрос; между запросами пакета переключают закладки у правого края окна. В дереве «База данных» появится ветка временных таблиц с ВТ_Продажи. Перенесите её и РегистрНакопления.ТоварыНаСкладах.Остатки, выделите остатки и через «Параметры виртуальной таблицы...» ограничьте их товарами из продаж. Как работают ПОМЕСТИТЬ и УНИЧТОЖИТЬ, разобрано в статье о временных таблицах.

«Связи»

Закладка появляется, когда таблиц больше одной. Строка связи: «Таблица 1» — ВТ_Продажи с флажком «Все», «Таблица 2» — остатки без флажка, «Условие связи» — равенство полей Номенклатура. Флажок «Все» у первой таблицы даёт ЛЕВОЕ СОЕДИНЕНИЕ, у второй — ПРАВОЕ, у обеих — ПОЛНОЕ, без флажков — ВНУТРЕННЕЕ. Сложное условие пишут с флажком «Произвольное». Подробнее — в статье про соединения в запросе.

«Группировка», «Порядок» и «Итоги»

В «Поле группировки» перетащите ВТ_Продажи.Номенклатура, в «Суммируемое поле» — Количество и Сумма с функцией «Сумма» и остаток, обёрнутый в ЕСТЬNULL(…, 0), с функцией «Максимум». На «Объединения/Псевдонимы» второго запроса назовите поля Продано, Выручка, Остаток, на «Порядке» добавьте Выручка по убыванию. «Итоги» добавили бы ИТОГИ … ПО — здесь они не нужны.

«ОК» вставит текст в модуль, а посмотреть его заранее можно кнопкой «Запрос». Функция с результатом:

// Продажи за период по номенклатуре (реализации минус возвраты)
// и текущий остаток на складах. Текст собран конструктором запросов:
// пакет из двух запросов, первый — объединение во временную таблицу.
Функция ПродажиИОстатки(НачалоПериода, КонецПериода) Экспорт

	Запрос = Новый Запрос;
	Запрос.Текст =
	"ВЫБРАТЬ
	|	РеализацияТоваровУслугТовары.Номенклатура КАК Номенклатура,
	|	РеализацияТоваровУслугТовары.Количество КАК Количество,
	|	РеализацияТоваровУслугТовары.СуммаСНДС КАК Сумма
	|ПОМЕСТИТЬ ВТ_Продажи
	|ИЗ
	|	Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
	|ГДЕ
	|	РеализацияТоваровУслугТовары.Ссылка.Проведен
	|	И РеализацияТоваровУслугТовары.Ссылка.Дата МЕЖДУ &НачалоПериода И &КонецПериода
	|
	|ОБЪЕДИНИТЬ ВСЕ
	|
	|ВЫБРАТЬ
	|	ВозвратТоваровОтКлиентаТовары.Номенклатура,
	|	-ВозвратТоваровОтКлиентаТовары.Количество,
	|	-ВозвратТоваровОтКлиентаТовары.СуммаСНДС
	|ИЗ
	|	Документ.ВозвратТоваровОтКлиента.Товары КАК ВозвратТоваровОтКлиентаТовары
	|ГДЕ
	|	ВозвратТоваровОтКлиентаТовары.Ссылка.Проведен
	|	И ВозвратТоваровОтКлиентаТовары.Ссылка.Дата МЕЖДУ &НачалоПериода И &КонецПериода
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ
	|	ВТ_Продажи.Номенклатура КАК Номенклатура,
	|	СУММА(ВТ_Продажи.Количество) КАК Продано,
	|	СУММА(ВТ_Продажи.Сумма) КАК Выручка,
	|	МАКСИМУМ(ЕСТЬNULL(ТоварыНаСкладахОстатки.ВНаличииОстаток, 0)) КАК Остаток
	|ИЗ
	|	ВТ_Продажи КАК ВТ_Продажи
	|		ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки(
	|				,
	|				Номенклатура В
	|					(ВЫБРАТЬ
	|						Продажи.Номенклатура КАК Номенклатура
	|					ИЗ
	|						ВТ_Продажи КАК Продажи)) КАК ТоварыНаСкладахОстатки
	|		ПО ВТ_Продажи.Номенклатура = ТоварыНаСкладахОстатки.Номенклатура
	|
	|СГРУППИРОВАТЬ ПО
	|	ВТ_Продажи.Номенклатура
	|
	|УПОРЯДОЧИТЬ ПО
	|	Выручка УБЫВ";

	// Параметры, которые конструктор завёл на закладке «Условия»
	Запрос.УстановитьПараметр("НачалоПериода", НачалоДня(НачалоПериода));
	Запрос.УстановитьПараметр("КонецПериода", КонецДня(КонецПериода));

	Возврат Запрос.Выполнить().Выгрузить();

КонецФункции

Разбор ключевых строк

  • ПОМЕСТИТЬ стоит в первой части объединения, но в ВТ_Продажи попадает весь результат ОБЪЕДИНИТЬ ВСЕ.
  • Запросы пакета разделяет точка с запятой, а строку косых черт конструктор добавляет для наглядности — для языка запросов это комментарий.
  • Условие в параметрах Остатки(, Номенклатура В (…)) отбирает товары до расчёта остатков — это быстрее, чем то же условие в ГДЕ.
  • Из виртуальной таблицы взято только измерение Номенклатура, поэтому остатки приходят одной строкой на товар (сумма по складам) и продажи не размножаются.
  • Распроданного в ноль товара в остатках нет — ЕСТЬNULL заменит NULL нулём. МАКСИМУМ нужен, потому что поле не в группировке, а в строках товара значение одно.
  • КонецДня() — дата документа хранится со временем, без этого выпадет последний день периода.

Проверка пакета по шагам

Если итог не сходится, посмотрите, сколько строк дал каждый запрос пакета. ВыполнитьПакет() для запроса с ПОМЕСТИТЬ возвращает одну строку с числом записей, а ВыполнитьПакетСПромежуточнымиДанными() (8.3.8+) — содержимое временной таблицы:

// Отладка пакета: сколько строк вернул каждый запрос.
// Для запроса с ПОМЕСТИТЬ ВыполнитьПакетСПромежуточнымиДанными (8.3.8+)
// возвращает содержимое временной таблицы, а не одну строку с количеством.
Функция СтрокПоЗапросамПакета(ТекстЗапроса, ПараметрыЗапроса) Экспорт

	Запрос = Новый Запрос(ТекстЗапроса);
	Для Каждого Параметр Из ПараметрыЗапроса Цикл
		Запрос.УстановитьПараметр(Параметр.Ключ, Параметр.Значение);
	КонецЦикла;

	Результаты = Запрос.ВыполнитьПакетСПромежуточнымиДанными();

	Строки = Новый Массив;
	Для Индекс = 0 По Результаты.ВГраница() Цикл
		Результат = Результаты[Индекс];
		Если Результат = Неопределено Тогда
			Описание = "уничтожение временной таблицы";
		Иначе
			Описание = Формат(Результат.Выбрать().Количество(), "ЧН=0") + " стр.";
		КонецЕсли;
		Строки.Добавить(СтрШаблон("Запрос %1: %2", Индекс + 1, Описание));
	КонецЦикла;

	Возврат СтрСоединить(Строки, Символы.ПС);

КонецФункции

Параметры передаются структурой: Новый Структура("НачалоПериода, КонецПериода", Дата1, Дата2).

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

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

// Так выглядит вставка «Конструктора запроса с обработкой результата»
// (тип обработки «Обход результата») внутри серверной процедуры.
Процедура ВывестиТоварыВида(ВидНоменклатуры) Экспорт

	//{{КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА
	// Данный фрагмент построен конструктором.
	// При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!

	Запрос = Новый Запрос;
	Запрос.Текст =
		"ВЫБРАТЬ
		|	Номенклатура.Ссылка КАК Ссылка,
		|	Номенклатура.Артикул КАК Артикул
		|ИЗ
		|	Справочник.Номенклатура КАК Номенклатура
		|ГДЕ
		|	Номенклатура.ВидНоменклатуры = &ВидНоменклатуры
		|	И НЕ Номенклатура.ПометкаУдаления";

	Запрос.УстановитьПараметр("ВидНоменклатуры", ВидНоменклатуры);

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

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

	Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
		// Вставить обработку выборки ВыборкаДетальныеЗаписи
		// Строку ниже дописали руками: повторный вызов конструктора её сотрёт
		Сообщить(СтрШаблон("%1, артикул %2", ВыборкаДетальныеЗаписи.Ссылка, ВыборкаДетальныеЗаписи.Артикул));
	КонецЦикла;

	//}}КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА

КонецПроцедуры

Всё между маркерами конструктор перезапишет при следующем вызове. Дописываете логику — удалите маркеры и правьте запрос обычным конструктором.

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

В режиме 1С:Предприятие конструктор — это объект КонструкторЗапроса, доступный и в тонком, и в веб-клиенте. Немодально его открывает Показать() (8.3.5+), в 8.3.18+ есть ОткрытьАсинх(); ОткрытьМодально() работает только в толстом клиенте. Кнопка «Конструктор» для своей обработки:

// Модуль формы своей консоли или обработки: команда «Конструктор».
// Объект.ТекстЗапроса — строковый реквизит обработки с текстом запроса.
&НаКлиенте
Процедура ОткрытьКонструкторЗапроса(Команда)

	Оповещение = Новый ОписаниеОповещения("ПослеЗакрытияКонструктора", ЭтотОбъект);
	Попытка
		// Конструктор разбирает текст: с синтаксической ошибкой он не откроется
		Конструктор = Новый КонструкторЗапроса(Объект.ТекстЗапроса);
		Конструктор.Показать(Оповещение); // немодально, с 8.3.5
	Исключение
		ПоказатьПредупреждение(, "Конструктор не разобрал текст запроса:" + Символы.ПС
			+ КраткоеПредставлениеОшибки(ИнформацияОбОшибке()));
	КонецПопытки;

КонецПроцедуры

&НаКлиенте
Процедура ПослеЗакрытияКонструктора(Текст, ДополнительныеПараметры) Экспорт

	// Неопределено — окно закрыли без «ОК», текст не трогаем
	Если Текст = Неопределено Тогда
		Возврат;
	КонецЕсли;

	Объект.ТекстЗапроса = Текст;
	Модифицированность = Истина;

КонецПроцедуры

Если до вызова Показать() установить РежимКомпоновкиДанных = Истина, конструктор откроется в режиме СКД.

Горячие клавиши

Что пригодится при работе с конструктором:

ДействиеКлавиши
Открыть конструктор запросав официальном списке сочетаний его нет: контекстное меню или «Текст» → «Конструктор запроса...»
Справка по конструкторуF1 в его окне
Переименовать поле на «Объединения/Псевдонимы»Enter
Найти / заменить в тексте пакетаCtrl+F / Ctrl+H
Форматировать вставленный блокShift+Alt+F
Закомментировать / раскомментироватьCtrl+Num/ / Ctrl+Shift+Num/
Проверка модуляCtrl+F7 — текст запроса внутри строки она не проверяет

Ограничения: когда руками писать быстрее

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

  • Точечная правка большого пакета. Конструктор сгенерирует текст заново, и если запрос писали руками, при сравнении версий изменится почти каждая строка.
  • Комментарии в тексте запроса после «ОК» не сохраняются.
  • Текст собирается кодом — склейку через + и подстановки СтрЗаменить конструктор целиком не откроет.
  • Массовое переименование временной таблицы или поля — быстрее через Ctrl+H.
  • Запрос на три-пять строк проще набрать.

Дописать условие в готовый текст из кода можно через СхемаЗапроса — программный аналог конструктора (сервер, толстый клиент, внешнее соединение):

// Дописывает условие в ГДЕ каждой части объединения запроса пакета —
// то же, что закладка «Условия», только из кода. В шаблоне условия
// #Т заменяется псевдонимом первой таблицы каждой части.
Функция ДобавитьУсловиеВЗапросПакета(ТекстЗапроса, НомерЗапроса, ШаблонУсловия) Экспорт

	Схема = Новый СхемаЗапроса;
	Схема.УстановитьТекстЗапроса(ТекстЗапроса);

	ЗапросПакета = Схема.ПакетЗапросов[НомерЗапроса - 1];
	Если ТипЗнч(ЗапросПакета) <> Тип("ЗапросВыбораСхемыЗапроса") Тогда
		ВызватьИсключение СтрШаблон("Запрос %1 пакета — не запрос ВЫБРАТЬ", НомерЗапроса);
	КонецЕсли;

	Для Каждого Оператор Из ЗапросПакета.Операторы Цикл
		Псевдоним = Оператор.Источники[0].Источник.Псевдоним;
		Оператор.Отбор.Добавить(СтрЗаменить(ШаблонУсловия, "#Т", Псевдоним));
	КонецЦикла;

	// Текст пересобирается целиком — в том же виде, что выдаёт конструктор
	Возврат Схема.ПолучитьТекстЗапроса();

КонецФункции

Вызов ДобавитьУсловиеВЗапросПакета(ТекстЗапроса, 1, "#Т.Номенклатура.ВидНоменклатуры В (&ВидыНоменклатуры)") добавит отбор в обе части объединения из примера.

Типичные ошибки

  • «Не найден текст запроса. Создать новый запрос?» — курсор вне строки запроса, и «Да» вставит новый запрос прямо в код. Поставьте курсор внутрь литерала и повторите.
  • Конструктор не открывает запрос — в тексте синтаксическая ошибка или он склеен через +. Ошибку ищут руками, склейку собирают в один литерал или меняют через СхемаЗапроса.
  • «Не задано значение параметра "КонецПериода"» — параметр с «Условий» не установлен в коде или в имени опечатка; список параметров текста вернёт Запрос.НайтиПараметры().
  • «Тип не определен (Запрос)» — конструктор с обработкой результата вызван в процедуре &НаКлиенте модуля формы. Код с Новый Запрос должен стоять в серверной процедуре.
  • Строки размножились или пропали. Не задана связь на «Связях» — таблицы соединяются каждая с каждой. Или условие на правую таблицу левого соединения стоит на «Условиях»: в ГДЕ оно отсекает NULL, и соединение становится внутренним — переносите его в параметры виртуальной таблицы или в условие связи.
  • «Поле не входит в группу» — после ручной правки поле не попало ни в группировку, ни в агрегатную функцию. В конструкторе его кладут в «Поле группировки» или в суммируемые.

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

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

Да, через объект КонструкторЗапроса — так работают консоли запросов (листинг выше). По справке платформы, в поле текстового документа с расширением «Язык запросов» конструктор доступен пользователям с административными правами.

Почему после конструктора запрос выглядит иначе?

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

Почему в списке «База данных» нет нужной таблицы?

В модуле расширения видны только объекты расширения и заимствованные — остальные включает кнопка «Отображать таблицы и поля расширяемой конфигурации». Таблицы изменений показывает кнопка «Отображать таблицы изменений», а длинный список сортирует «Упорядочить список».

Когда проще заказать

Если запрос — часть отчёта или обработки, которая считает неверно или работает минутами, задачу проще отдать программисту. На 1c-only.ru этим занимается направление доработки отчётов и обработок 1С: опишите задачу через «Разместить задачу» — оценка бесплатная, ответ в течение рабочего дня.

По теме

Не хотите разбираться сами?

Адаптируем это решение под вашу базу. Оценка бесплатно.

Оставить задачу

Станьте частью сообщества!
Войдите или зарегистрируйтесь, и вы сможете участвовать в обсуждениях.


1С, 1С:Предприятие — товарные знаки ООО «1С». Сайт не является официальным представительством фирмы «1С» и не аффилирован с ней.