Запросы мышкой: собираем выборку в Конфигураторе 1С 8.3 от первой таблицы до пакета
Содержание
Конструктор запроса в 1С 8.3 открывается в Конфигураторе из модуля: поставьте курсор в строку, где будет текст запроса, щёлкните правой кнопкой мыши и выберите Конструктор запроса.... Дальше вы мышкой выбираете таблицы и поля, задаёте связи, условия и сортировку, жмёте ОК — и готовый текст на языке запросов вставляется в код.
Частое заблуждение новичков: «конструктор — для тех, кто не знает язык запросов, профи пишут руками». На деле опытные разработчики работать с ним продолжают. Конструктор не ошибается в именах реквизитов, сам подставляет параметры виртуальных таблиц и за пару секунд показывает, есть ли в тексте синтаксическая ошибка. Руками удобнее только мелкие правки.
Зачем нужен конструктор запросов и чего он не умеет
Запрос в 1С — это текст на языке, похожем на SQL, но с русскими ключевыми словами и обращением к объектам конфигурации: Справочник.Контрагенты, Документ.РеализацияТоваровУслуг, РегистрБухгалтерии.Хозрасчетный.Остатки. Конструктор строит этот текст по вашим щелчкам и умеет разбирать уже написанный запрос обратно на вкладки.
Что он делает хорошо:
- 📋 показывает дерево всех объектов метаданных — не нужно помнить, как называется табличная часть;
- 🔗 подсказывает связи между таблицами и тип соединения;
- 🧮 строит группировки, итоги, объединения и пакеты запросов;
- ⚙️ даёт форму для параметров виртуальных таблиц (
Остатки,Обороты,СрезПоследних); - 🧾 вариант «с обработкой результата» сразу пишет код выполнения и цикл по выборке.
Чего ждать не стоит:
- ❌ комментарии внутри текста запроса после правки в конструкторе пропадают, ручное форматирование тоже;
- ❌ текст, склеенный в коде из кусков строк (
Текст = Текст + ...), он целиком не разберёт — откроется только тот кусок, где стоит курсор; - ❌ если в тексте синтаксическая ошибка, конструктор не откроется, а покажет сообщение с номером строки.
Если в запросе есть важные пояснения, держите их в комментариях модуля над присвоением Запрос.Текст, а не внутри строки запроса. Тогда конструктор их не съест.
Три способа открыть конструктор запроса
Меню и кнопки ниже — из Конфигуратора платформы 8.3 (в EDT конструктор тоже есть, но интерфейс другой).
| Способ | Где | Когда удобен |
|---|---|---|
| Контекстное меню модуля | Правый щелчок в модуле → Конструктор запроса... | Обычный случай: пишете код в модуле формы, объекта, общем модуле |
| Контекстное меню, вариант с кодом | Правый щелчок → Конструктор запроса с обработкой результата... | Нужен и запрос, и цикл обработки выборки |
| Схема компоновки данных | Редактор СКД → набор данных «Запрос» → кнопка Конструктор запроса... | Отчёт на СКД; появится дополнительная вкладка «Компоновка данных» |
Ещё один путь — из меню Текст главного меню Конфигуратора, когда открыт модуль: там та же команда Конструктор запроса....
Правило, которое экономит время: ставьте курсор внутрь существующей строки запроса, а не рядом с ней. Тогда конструктор откроется с уже разобранным запросом, и после ОК заменит старый текст новым. Если курсор на пустом месте, конструктор спросит, создавать ли новый запрос.
В пользовательском режиме конструктор обычно вызывают из обработки «Консоль запросов». Она удобна, чтобы проверить запрос на рабочих данных, не запуская отладку.
Что где лежит: вкладки окна конструктора
Окно состоит из вкладок. На первой работаете всегда, остальные — по задаче.
| Вкладка | Что задаёт | Слово в тексте запроса |
|---|---|---|
| Таблицы и поля | Источники и выбранные поля | ВЫБРАТЬ ... ИЗ |
| Связи | Соединения таблиц и их тип | ЛЕВОЕ / ВНУТРЕННЕЕ / ПОЛНОЕ СОЕДИНЕНИЕ |
| Группировка | Поля группировки и агрегатные функции | СГРУППИРОВАТЬ ПО, СУММА, КОЛИЧЕСТВО |
| Условия | Отбор строк | ГДЕ, ИМЕЮЩИЕ |
| Дополнительно | Первые N, без повторов, разрешённые, тип запроса | ПЕРВЫЕ, РАЗЛИЧНЫЕ, РАЗРЕШЕННЫЕ, ПОМЕСТИТЬ |
| Объединения/Псевдонимы | Несколько запросов в одну таблицу, имена полей | ОБЪЕДИНИТЬ ВСЕ, КАК |
| Порядок | Сортировка | УПОРЯДОЧИТЬ ПО |
| Итоги | Итоговые строки по группировкам | ИТОГИ ... ПО |
| Пакет запросов | Список запросов пакета и временных таблиц | ; между запросами |
На вкладке «Таблицы и поля» три колонки. Слева — дерево базы данных: константы, справочники, документы, регистры. В середине — выбранные таблицы. Справа — поля, которые попадут в результат. Перенос делается двойным щелчком или перетаскиванием.
Внизу окна есть кнопка Запрос. Она показывает текущий текст. Полезно заглядывать туда, пока учитесь: сразу видно, какое ключевое слово появилось от вашего действия.
Первый запрос: продажи по контрагентам за период
Задача: получить сумму реализаций по каждому покупателю за месяц. Пример — для «Бухгалтерии предприятия 3.0», где у документа РеализацияТоваровУслуг есть табличная часть Товары с полем Сумма. В других конфигурациях имена могут отличаться, но порядок действий тот же.
Шаг 1. Источник и поля
- Откройте конструктор в нужном месте модуля.
- В дереве раскройте
Документы → РеализацияТоваровУслуги дважды щёлкните табличную частьТовары. - В колонке полей раскройте
Ссылкаи перенеситеСсылка.Контрагент. - Перенесите поле
Сумма.
Шаг 2. Группировка
- Откройте вкладку «Группировка».
- Перенесите
Контрагентв верхний список — поля группировки. Суммаперенесите в нижний — суммируемые поля. ФункцияСуммаподставится сама; её можно сменить наКоличество,Максимум,Минимум,Среднее.
Шаг 3. Условия
- На вкладке «Условия» перенесите поле
Ссылка.Дата. Конструктор создаст условие с параметром&Дата. - Отметьте флажок «Произвольное» и замените текст на
Товары.Ссылка.Дата МЕЖДУ &НачалоПериода И &КонецПериода. - Добавьте второе условие:
Товары.Ссылка.Проведен. Без него в отчёт попадут непроведённые и помеченные на удаление документы.
Шаг 4. Порядок и результат
На вкладке «Порядок» добавьте Сумма и поставьте направление «Убывание». Нажмите ОК. Если вызывали вариант с обработкой результата, получите примерно такой код:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| РеализацияТоваровУслугТовары.Ссылка.Контрагент КАК Контрагент,
| СУММА(РеализацияТоваровУслугТовары.Сумма) КАК Сумма
|ИЗ
| Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
|ГДЕ
| РеализацияТоваровУслугТовары.Ссылка.Дата МЕЖДУ &НачалоПериода И &КонецПериода
| И РеализацияТоваровУслугТовары.Ссылка.Проведен
|
|СГРУППИРОВАТЬ ПО
| РеализацияТоваровУслугТовары.Ссылка.Контрагент
|
|УПОРЯДОЧИТЬ ПО
| Сумма УБЫВ";
Запрос.УстановитьПараметр("НачалоПериода", НачалоДня(ДатаНачала));
Запрос.УстановитьПараметр("КонецПериода", КонецДня(ДатаОкончания));
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
Сообщить(Строка(Выборка.Контрагент) + ": " + Формат(Выборка.Сумма, "ЧДЦ=2"));
КонецЦикла;
Строки УстановитьПараметр дописываются руками: конструктор создаёт параметры в тексте, но значения им не задаёт. КонецДня нужен, чтобы в отбор вошли документы последнего дня целиком, а не только те, что проведены ровно в 00:00:00.
Сложные запросы: соединения, объединения, вложенные запросы и пакеты
Соединение двух таблиц
Добавьте на вкладке «Таблицы и поля» вторую таблицу и перейдите на «Связи». Для каждой пары задайте условие связи и отметьте флажок «Все» у той таблицы, все строки которой нужно сохранить.
- ✅ флажок «Все» у левой таблицы →
ЛЕВОЕ СОЕДИНЕНИЕ; - ✅ ни одного флажка →
ВНУТРЕННЕЕ СОЕДИНЕНИЕ, останутся только совпавшие строки; - ✅ флажки у обеих →
ПОЛНОЕ СОЕДИНЕНИЕ.
При левом соединении у строк без пары поля второй таблицы будут NULL. Сумма с NULL даёт NULL, поэтому числовые поля оборачивайте: ЕСТЬNULL(Цены.Цена, 0). В конструкторе это делается через редактор произвольного выражения поля.
Объединение запросов
Нужно вывести в одну таблицу поступления и реализации? Вкладка «Объединения/Псевдонимы» → кнопка добавления запроса. Появится второй запрос со своими вкладками. Справа — таблица псевдонимов: в ней каждое поле второго запроса ставится в колонку первого.
Флажок «Без дубликатов» превращает ОБЪЕДИНИТЬ ВСЕ в ОБЪЕДИНИТЬ. Без него запрос быстрее: платформе не нужно искать одинаковые строки. Снимайте флажок, если дубли невозможны по смыслу.
Вложенный запрос и временные таблицы
На вкладке «Таблицы и поля» над списком таблиц есть кнопка создания вложенного запроса. Откроется ещё одно окно конструктора; результат встанет как обычная таблица.
Но чаще лучше пакет. Вкладка «Дополнительно» → тип запроса «Создание временной таблицы» → задайте имя, например ВТ_Продажи. На вкладке «Пакет запросов» добавьте следующий запрос, и временная таблица появится в дереве источников под своим именем.
ВЫБРАТЬ
Товары.Номенклатура КАК Номенклатура,
СУММА(Товары.Количество) КАК Количество
ПОМЕСТИТЬ ВТ_Продажи
ИЗ
Документ.РеализацияТоваровУслуг.Товары КАК Товары
ГДЕ
Товары.Ссылка.Дата МЕЖДУ &НачалоПериода И &КонецПериода
И Товары.Ссылка.Проведен
СГРУППИРОВАТЬ ПО
Товары.Номенклатура
ИНДЕКСИРОВАТЬ ПО
Номенклатура
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ВТ_Продажи.Номенклатура,
ВТ_Продажи.Количество,
ЕСТЬNULL(Цены.Цена, 0) КАК Цена
ИЗ
ВТ_Продажи КАК ВТ_Продажи
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Дата, ТипЦен = &ТипЦен) КАК Цены
ПО ВТ_Продажи.Номенклатура = Цены.Номенклатура
Пакет выполняется одним вызовом Запрос.Выполнить(), возвращается результат последнего запроса. Нужны результаты всех — вызывайте Запрос.ВыполнитьПакет(), он вернёт массив.
Итоги
Вкладка «Итоги» добавляет строки с промежуточными суммами по группировкам: ИТОГИ СУММА(Сумма) ПО Контрагент. Чтобы обойти такой результат с уровнями, выборку получают так: Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам).
Где новички ошибаются в конструкторе запросов
Как не уложить базу: оптимизация запросов на больших объёмах
На демо-базе любой запрос летает. На базе в сотни гигабайт плохой запрос блокирует работу бухгалтерии. Пять приёмов, которые стоит держать в голове с первого дня.
- Отбор — в параметры виртуальной таблицы. У
Остатки,Обороты,СрезПоследнихправой кнопкой по таблице →Параметры виртуальной таблицы. Условие там отбирает данные до расчёта; условие в «Условиях» — после, когда остатки уже посчитаны по всей базе. - Не соединяйтесь с вложенными запросами. Оптимизатор СУБД часто ошибается в оценке их размера. Вынесите подзапрос во временную таблицу с
ИНДЕКСИРОВАТЬ ПОпо полю связи. - Осторожно с точкой у составных типов. Поле
РегистраторилиСубконто1может ссылаться на десятки таблиц. ОбращениеРегистратор.Датапорождает соединение с каждой. ИспользуйтеВЫРАЗИТЬ(Регистратор КАК Документ.РеализацияТоваровУслуг).Дата, если тип известен. - Никаких функций над полем в условии.
ГОД(Дата) = 2025не использует индекс по дате. Пишите диапазон:Дата МЕЖДУ &Начало И &Конец. ИЛИв условии соединения — сигнал тревоги. Его лучше разбить на два запроса и объединить черезОБЪЕДИНИТЬ ВСЕ.
Проверить, где тратится время, можно замером производительности: Отладка → Замер производительности в Конфигураторе при запущенной отладке. Строка с Запрос.Выполнить() покажет реальное время запроса.
Флажок «Блокировать получаемые данные для последующего изменения» на вкладке «Дополнительно» (ДЛЯ ИЗМЕНЕНИЯ) ставьте только в коде проведения, где это нужно для управляемых блокировок. В отчётах он лишний.
Готовые запросы для типовых задач
Остатки по счёту 41 на дату (БП 3.0)
Источник — виртуальная таблица остатков регистра бухгалтерии. Отбор по счёту задан в её параметрах:
ВЫБРАТЬ
Остатки.Субконто1 КАК Номенклатура,
Остатки.КоличествоОстатокДт КАК Количество,
Остатки.СуммаОстатокДт КАК Сумма
ИЗ
РегистрБухгалтерии.Хозрасчетный.Остатки(&Дата, Счет В ИЕРАРХИИ (&Счет41), , ) КАК Остатки
В параметр &Счет41 передайте ПланыСчетов.Хозрасчетный.ТоварыНаСкладах. Для остатков на конец дня передавайте Новый Граница(КонецДня(Дата), ВидГраницы.Включая), иначе движения в саму дату могут не попасть.
Контрагенты с одинаковым ИНН
ВЫБРАТЬ
Контрагенты.ИНН КАК ИНН,
КОЛИЧЕСТВО(Контрагенты.Ссылка) КАК Количество
ИЗ
Справочник.Контрагенты КАК Контрагенты
ГДЕ
НЕ Контрагенты.ПометкаУдаления
И Контрагенты.ИНН <> ""
СГРУППИРОВАТЬ ПО
Контрагенты.ИНН
ИМЕЮЩИЕ
КОЛИЧЕСТВО(Контрагенты.Ссылка) > 1
ИМЕЮЩИЕ задаётся на вкладке «Условия»: условие на агрегатную функцию конструктор сам отнесёт к нему, а не к ГДЕ.
Десять последних документов
На вкладке «Дополнительно» отметьте «Первые» и укажите 10, на «Порядке» — Дата по убыванию. Получится ВЫБРАТЬ ПЕРВЫЕ 10 ... УПОРЯДОЧИТЬ ПО Дата УБЫВ.
Если запрос будет выполняться у пользователей с ограниченными правами, отметьте там же «Разрешенные». Без слова РАЗРЕШЕННЫЕ пользователь с ограничением доступа на уровне записей получит ошибку нехватки прав вместо урезанного списка.
Частые вопросы
Почему в меню «Конструктор запроса», а не «запросов»?
Можно ли открыть конструктор в режиме 1С:Предприятие без Конфигуратора?
Отличается ли работа конструктора в файловой и клиент-серверной базе?
Чем РАЗЛИЧНЫЕ отличается от группировки?
РАЗЛИЧНЫЕ (флажок «Без повторяющихся») просто убирает одинаковые строки. Группировка ещё и считает агрегаты. Если суммы не нужны, достаточно первого.