Запросы мышкой: собираем выборку в Конфигураторе 1С 8.3 от первой таблицы до пакета

· 10 мин

Содержание

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

Частое заблуждение новичков: «конструктор — для тех, кто не знает язык запросов, профи пишут руками». На деле опытные разработчики работать с ним продолжают. Конструктор не ошибается в именах реквизитов, сам подставляет параметры виртуальных таблиц и за пару секунд показывает, есть ли в тексте синтаксическая ошибка. Руками удобнее только мелкие правки.

Зачем нужен конструктор запросов и чего он не умеет

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

Что он делает хорошо:

  • 📋 показывает дерево всех объектов метаданных — не нужно помнить, как называется табличная часть;
  • 🔗 подсказывает связи между таблицами и тип соединения;
  • 🧮 строит группировки, итоги, объединения и пакеты запросов;
  • ⚙️ даёт форму для параметров виртуальных таблиц (Остатки, Обороты, СрезПоследних);
  • 🧾 вариант «с обработкой результата» сразу пишет код выполнения и цикл по выборке.

Чего ждать не стоит:

  • ❌ комментарии внутри текста запроса после правки в конструкторе пропадают, ручное форматирование тоже;
  • ❌ текст, склеенный в коде из кусков строк (Текст = Текст + ...), он целиком не разберёт — откроется только тот кусок, где стоит курсор;
  • ❌ если в тексте синтаксическая ошибка, конструктор не откроется, а покажет сообщение с номером строки.

Если в запросе есть важные пояснения, держите их в комментариях модуля над присвоением Запрос.Текст, а не внутри строки запроса. Тогда конструктор их не съест.

Три способа открыть конструктор запроса

Меню и кнопки ниже — из Конфигуратора платформы 8.3 (в EDT конструктор тоже есть, но интерфейс другой).

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

Ещё один путь — из меню Текст главного меню Конфигуратора, когда открыт модуль: там та же команда Конструктор запроса....

Правило, которое экономит время: ставьте курсор внутрь существующей строки запроса, а не рядом с ней. Тогда конструктор откроется с уже разобранным запросом, и после ОК заменит старый текст новым. Если курсор на пустом месте, конструктор спросит, создавать ли новый запрос.

В пользовательском режиме конструктор обычно вызывают из обработки «Консоль запросов». Она удобна, чтобы проверить запрос на рабочих данных, не запуская отладку.

Что где лежит: вкладки окна конструктора

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

ВкладкаЧто задаётСлово в тексте запроса
Таблицы и поляИсточники и выбранные поляВЫБРАТЬ ... ИЗ
СвязиСоединения таблиц и их типЛЕВОЕ / ВНУТРЕННЕЕ / ПОЛНОЕ СОЕДИНЕНИЕ
ГруппировкаПоля группировки и агрегатные функцииСГРУППИРОВАТЬ ПО, СУММА, КОЛИЧЕСТВО
УсловияОтбор строкГДЕ, ИМЕЮЩИЕ
ДополнительноПервые N, без повторов, разрешённые, тип запросаПЕРВЫЕ, РАЗЛИЧНЫЕ, РАЗРЕШЕННЫЕ, ПОМЕСТИТЬ
Объединения/ПсевдонимыНесколько запросов в одну таблицу, имена полейОБЪЕДИНИТЬ ВСЕ, КАК
ПорядокСортировкаУПОРЯДОЧИТЬ ПО
ИтогиИтоговые строки по группировкамИТОГИ ... ПО
Пакет запросовСписок запросов пакета и временных таблиц; между запросами

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

Внизу окна есть кнопка Запрос. Она показывает текущий текст. Полезно заглядывать туда, пока учитесь: сразу видно, какое ключевое слово появилось от вашего действия.

Первый запрос: продажи по контрагентам за период

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

Шаг 1. Источник и поля

  1. Откройте конструктор в нужном месте модуля.
  2. В дереве раскройте Документы → РеализацияТоваровУслуг и дважды щёлкните табличную часть Товары.
  3. В колонке полей раскройте Ссылка и перенесите Ссылка.Контрагент.
  4. Перенесите поле Сумма.

Шаг 2. Группировка

  1. Откройте вкладку «Группировка».
  2. Перенесите Контрагент в верхний список — поля группировки.
  3. Сумма перенесите в нижний — суммируемые поля. Функция Сумма подставится сама; её можно сменить на Количество, Максимум, Минимум, Среднее.

Шаг 3. Условия

  1. На вкладке «Условия» перенесите поле Ссылка.Дата. Конструктор создаст условие с параметром &Дата.
  2. Отметьте флажок «Произвольное» и замените текст на Товары.Ссылка.Дата МЕЖДУ &НачалоПериода И &КонецПериода.
  3. Добавьте второе условие: Товары.Ссылка.Проведен. Без него в отчёт попадут непроведённые и помеченные на удаление документы.

Шаг 4. Порядок и результат

На вкладке «Порядок» добавьте Сумма и поставьте направление «Убывание». Нажмите ОК. Если вызывали вариант с обработкой результата, получите примерно такой код:

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

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

Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
	Сообщить(Строка(Выборка.Контрагент) + ": " + Формат(Выборка.Сумма, "ЧДЦ=2"));
КонецЦикла;

Строки УстановитьПараметр дописываются руками: конструктор создаёт параметры в тексте, но значения им не задаёт. КонецДня нужен, чтобы в отбор вошли документы последнего дня целиком, а не только те, что проведены ровно в 00:00:00.

Сложные запросы: соединения, объединения, вложенные запросы и пакеты

Соединение двух таблиц

Добавьте на вкладке «Таблицы и поля» вторую таблицу и перейдите на «Связи». Для каждой пары задайте условие связи и отметьте флажок «Все» у той таблицы, все строки которой нужно сохранить.

  • ✅ флажок «Все» у левой таблицы → ЛЕВОЕ СОЕДИНЕНИЕ;
  • ✅ ни одного флажка → ВНУТРЕННЕЕ СОЕДИНЕНИЕ, останутся только совпавшие строки;
  • ✅ флажки у обеих → ПОЛНОЕ СОЕДИНЕНИЕ.

При левом соединении у строк без пары поля второй таблицы будут NULL. Сумма с NULL даёт NULL, поэтому числовые поля оборачивайте: ЕСТЬNULL(Цены.Цена, 0). В конструкторе это делается через редактор произвольного выражения поля.

Объединение запросов

Нужно вывести в одну таблицу поступления и реализации? Вкладка «Объединения/Псевдонимы» → кнопка добавления запроса. Появится второй запрос со своими вкладками. Справа — таблица псевдонимов: в ней каждое поле второго запроса ставится в колонку первого.

Флажок «Без дубликатов» превращает ОБЪЕДИНИТЬ ВСЕ в ОБЪЕДИНИТЬ. Без него запрос быстрее: платформе не нужно искать одинаковые строки. Снимайте флажок, если дубли невозможны по смыслу.

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

На вкладке «Таблицы и поля» над списком таблиц есть кнопка создания вложенного запроса. Откроется ещё одно окно конструктора; результат встанет как обычная таблица.

Но чаще лучше пакет. Вкладка «Дополнительно» → тип запроса «Создание временной таблицы» → задайте имя, например ВТ_Продажи. На вкладке «Пакет запросов» добавьте следующий запрос, и временная таблица появится в дереве источников под своим именем.

ВЫБРАТЬ
	Товары.Номенклатура КАК Номенклатура,
	СУММА(Товары.Количество) КАК Количество
ПОМЕСТИТЬ ВТ_Продажи
ИЗ
	Документ.РеализацияТоваровУслуг.Товары КАК Товары
ГДЕ
	Товары.Ссылка.Дата МЕЖДУ &НачалоПериода И &КонецПериода
	И Товары.Ссылка.Проведен
СГРУППИРОВАТЬ ПО
	Товары.Номенклатура
ИНДЕКСИРОВАТЬ ПО
	Номенклатура
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
	ВТ_Продажи.Номенклатура,
	ВТ_Продажи.Количество,
	ЕСТЬNULL(Цены.Цена, 0) КАК Цена
ИЗ
	ВТ_Продажи КАК ВТ_Продажи
		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Дата, ТипЦен = &ТипЦен) КАК Цены
		ПО ВТ_Продажи.Номенклатура = Цены.Номенклатура

Пакет выполняется одним вызовом Запрос.Выполнить(), возвращается результат последнего запроса. Нужны результаты всех — вызывайте Запрос.ВыполнитьПакет(), он вернёт массив.

Итоги

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

Где новички ошибаются в конструкторе запросов

Диагностика: выберите симптом

Как не уложить базу: оптимизация запросов на больших объёмах

На демо-базе любой запрос летает. На базе в сотни гигабайт плохой запрос блокирует работу бухгалтерии. Пять приёмов, которые стоит держать в голове с первого дня.

  1. Отбор — в параметры виртуальной таблицы. У Остатки, Обороты, СрезПоследних правой кнопкой по таблице → Параметры виртуальной таблицы. Условие там отбирает данные до расчёта; условие в «Условиях» — после, когда остатки уже посчитаны по всей базе.
  2. Не соединяйтесь с вложенными запросами. Оптимизатор СУБД часто ошибается в оценке их размера. Вынесите подзапрос во временную таблицу с ИНДЕКСИРОВАТЬ ПО по полю связи.
  3. Осторожно с точкой у составных типов. Поле Регистратор или Субконто1 может ссылаться на десятки таблиц. Обращение Регистратор.Дата порождает соединение с каждой. Используйте ВЫРАЗИТЬ(Регистратор КАК Документ.РеализацияТоваровУслуг).Дата, если тип известен.
  4. Никаких функций над полем в условии. ГОД(Дата) = 2025 не использует индекс по дате. Пишите диапазон: Дата МЕЖДУ &Начало И &Конец.
  5. ИЛИ в условии соединения — сигнал тревоги. Его лучше разбить на два запроса и объединить через ОБЪЕДИНИТЬ ВСЕ.

Проверить, где тратится время, можно замером производительности: Отладка → Замер производительности в Конфигураторе при запущенной отладке. Строка с Запрос.Выполнить() покажет реальное время запроса.

Флажок «Блокировать получаемые данные для последующего изменения» на вкладке «Дополнительно» (ДЛЯ ИЗМЕНЕНИЯ) ставьте только в коде проведения, где это нужно для управляемых блокировок. В отчётах он лишний.

Готовые запросы для типовых задач

Остатки по счёту 41 на дату (БП 3.0)

Источник — виртуальная таблица остатков регистра бухгалтерии. Отбор по счёту задан в её параметрах:

ВЫБРАТЬ
	Остатки.Субконто1 КАК Номенклатура,
	Остатки.КоличествоОстатокДт КАК Количество,
	Остатки.СуммаОстатокДт КАК Сумма
ИЗ
	РегистрБухгалтерии.Хозрасчетный.Остатки(&Дата, Счет В ИЕРАРХИИ (&Счет41), , ) КАК Остатки

В параметр &Счет41 передайте ПланыСчетов.Хозрасчетный.ТоварыНаСкладах. Для остатков на конец дня передавайте Новый Граница(КонецДня(Дата), ВидГраницы.Включая), иначе движения в саму дату могут не попасть.

Контрагенты с одинаковым ИНН

ВЫБРАТЬ
	Контрагенты.ИНН КАК ИНН,
	КОЛИЧЕСТВО(Контрагенты.Ссылка) КАК Количество
ИЗ
	Справочник.Контрагенты КАК Контрагенты
ГДЕ
	НЕ Контрагенты.ПометкаУдаления
	И Контрагенты.ИНН <> ""
СГРУППИРОВАТЬ ПО
	Контрагенты.ИНН
ИМЕЮЩИЕ
	КОЛИЧЕСТВО(Контрагенты.Ссылка) > 1

ИМЕЮЩИЕ задаётся на вкладке «Условия»: условие на агрегатную функцию конструктор сам отнесёт к нему, а не к ГДЕ.

Десять последних документов

На вкладке «Дополнительно» отметьте «Первые» и укажите 10, на «Порядке» — Дата по убыванию. Получится ВЫБРАТЬ ПЕРВЫЕ 10 ... УПОРЯДОЧИТЬ ПО Дата УБЫВ.

Если запрос будет выполняться у пользователей с ограниченными правами, отметьте там же «Разрешенные». Без слова РАЗРЕШЕННЫЕ пользователь с ограничением доступа на уровне записей получит ошибку нехватки прав вместо урезанного списка.

Проверьте себя
Какой флажок на вкладке «Связи» даст левое соединение?
Куда лучше поставить отбор по счёту для таблицы Остатки?
Что вернёт Запрос.Выполнить() у пакета из трёх запросов?

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

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