Работа с данными в 1С:Предприятие часто требует извлечения, фильтрации или агрегации информации из базы. Для этих задач предназначен конструктор запросов — мощный инструмент, позволяющий формировать SQL-подобные запросы без глубоких знаний языка программирования. Он интегрирован в платформу и доступен как в конфигураторе, так и в режиме предприятия через отладчик или внешние обработки.
Многие пользователи избегают работы с конструктором, считая его сложным или ненужным, предпочитая ручное написание кода. Однако этот инструмент значительно ускоряет разработку, снижает количество ошибок и помогает визуализировать структуру запроса. В статье разберём, как открыть конструктор, какие операции он поддерживает, и как с его помощью решать типовые задачи — от простых выборок до многотабличных соединений с группировкой.
Особое внимание уделим скрытым возможностям конструктора, которые редко документируются, но могут сэкономить часы работы: например, автоматическое формирование связей между таблицами или генерация шаблонов для динамических запросов. Материал будет полезен и новичкам, и опытным разработчикам, которые хотят оптимизировать свою работу.
Где находится конструктор запросов в 1С и как его открыть
Конструктор запросов встроен в платформу 1С:Предприятие 8 и доступен в нескольких режимах. Основные способы его вызова:
- 🔧 В конфигураторе: откройте любой модуль (например, модуль объекта или модуль формы), напишите ключевое слово
Запрос, поставьте точку — система предложит вариантНовыйЗапрос(). После создания объекта запроса появится контекстное меню с пунктомКонструктор запроса. - 📊 В режиме предприятия: через отладчик (
Ctrl+Alt+F12) или внешнюю обработку, если она поддерживает работу с запросами. Например, в отчётах часто есть кнопка «Настроить запрос», которая открывает конструктор. - 🖥️ В внешних обработках: если обработка содержит код с объектом
Запрос, можно вызвать конструктор прямо из неё, кликнув правой кнопкой на переменной запроса и выбрав соответствующий пункт.
Важно: в некоторых конфигурациях (например, 1С:Бухгалтерия 3.0 или 1С:УТ 11) доступ к конструктору может быть ограничен правами пользователя. Если пункта нет в меню, проверьте настройки ролей или обратитесь к администратору.
Интерфейс конструктора: основные панели и их назначение
Интерфейс конструктора запросов разделён на несколько ключевых областей, каждая из которых отвечает за свой этап формирования запроса. Разберём их подробно:
- Панель «Таблицы и поля» (слева): здесь отображаются все доступные таблицы базы данных (справочники, документы, регистры и т.д.). Можно добавлять их в запрос перетаскиванием или двойным кликом. При добавлении таблицы автоматически подгружаются её поля.
- Панель «Связи» (центр): визуальное отображение соединений между таблицами. Конструктор сам предлагает связи по ключевым полям (например,
Ссылкав документах), но их можно редактировать вручную. - Панель «Поля» (справа): список полей, которые будут включены в результат запроса. Здесь же настраиваются псевдонимы, агрегатные функции (
СУММА,КОЛИЧЕСТВО) и порядок сортировки. - Панель «Условия» (внизу): фильтры для данных. Например, можно ограничить выборку по дате или статусу документа.
- Панель «Текст запроса» (внизу): отображает сгенерированный код на встроенном языке. Его можно копировать и вставлять в модули.
Обратите внимание на кнопку Показать план запроса — она позволяет оценить, как 1С будет выполнять запрос, и оптимизировать его. Например, если в плане видно полное сканирование таблицы (TABLE SCAN), стоит добавить индексируемые поля в условия.
Если в панели «Таблицы и поля» не отображаются нужные объекты, проверьте, что в настройках конструктора включена опция «Показывать все таблицы». Это особенно актуально для виртуальных таблиц регистров накопления или бухгалтерских итогов.
Создание простого запроса: пошаговая инструкция
Рассмотрим процесс создания запроса на примере выборки документов РеализацияТоваровУслуг за текущий месяц. Следуйте инструкции:
Добавить таблицу документов в конструктор|
Выбрать нужные поля (дату, номер, сумму)|
Задать условие по периоду (текущий месяц)|
Указать сортировку по дате (по убыванию)|
Проверить текст запроса на ошибки-->
1. Добавление таблицы: в панели «Таблицы и поля» найдите Документ.РеализацияТоваровУслуг и перенесите её в центральную область. Конструктор автоматически создаст псевдоним (например, РеализацияТоваровУслуг).
2. Выбор полей: в панели «Поля» отметьте галочками:
- РеализацияТоваровУслуг.Дата
- РеализацияТоваровУслуг.Номер
- РеализацияТоваровУслуг.СуммаДокумента
Для удобства переименуйте поля через свойство «Псевдоним» (например, СуммаДокумента → Сумма).
3. Условия фильтрации: в панели «Условия» добавьте строку:
- Поле: РеализацияТоваровУслуг.Дата
- Условие: Больше или равно
- Значение: &НачалоМесяца(ТекущаяДата())
Затем добавьте вторую строку с условием Меньше или равно и значением &КонецМесяца(ТекущаяДата()).
4. Сортировка: в панели «Поля» для поля Дата установите сортировку По убыванию.
5. Проверка и выполнение: нажмите ОК, чтобы сгенерировать текст запроса. Его можно выполнить сразу в конструкторе (кнопка Выполнить) или скопировать в код:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| РеализацияТоваровУслуг.Дата КАК Дата,
| РеализацияТоваровУслуг.Номер КАК Номер,
| РеализацияТоваровУслуг.СуммаДокумента КАК Сумма
|ИЗ
| Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
|ГДЕ
| РеализацияТоваровУслуг.Дата МЕЖДУ &НачалоМесяца(ТекущаяДата()) И &КонецМесяца(ТекущаяДата())
|УПОРЯДОЧИТЬ ПО
| Дата УБЫВ";
Всегда проверяйте текст запроса на синтаксические ошибки перед выполнением. Конструктор может автоматически исправить опечатки, но логические ошибки (например, неверные условия) остаются на совести разработчика.
Работа с соединениями таблиц: INNER JOIN, LEFT JOIN и их аналоги в 1С
Одной из самых мощных функций конструктора является возможность визуально строить соединения между таблицами. В 1С используются следующие типы соединений:
- 🔗 Внутреннее соединение (INNER JOIN): возвращает только те записи, для которых есть соответствия в обеих таблицах. В конструкторе устанавливается по умолчанию при добавлении второй таблицы.
- 🔗 Левое соединение (LEFT JOIN): возвращает все записи из левой таблицы и соответствующие им записи из правой. В конструкторе выбирается в свойствах связи.
- 🔗 Правое соединение (RIGHT JOIN): аналогично левому, но возвращает все записи из правой таблицы. В 1С используется редко, так как можно поменять таблицы местами.
- 🔗 Полное соединение (FULL JOIN): возвращает все записи из обеих таблиц. В конструкторе не поддерживается напрямую, но можно эмулировать через объединение запросов (
ОБЪЕДИНИТЬ).
Пример: выберем реализации товаров с указанием контрагента. Для этого нужно соединить таблицу документов РеализацияТоваровУслуг со справочником Контрагенты:
- Добавьте в конструктор обе таблицы.
- В панели «Связи» установите соединение по полю
РеализацияТоваровУслуг.Контрагент→Контрагенты.Ссылка. - Выберите тип соединения
Левое, чтобы в результат попали все реализации, даже если контрагент не найден (например, удалён). - Добавьте в поля выборки
Контрагенты.Наименование.
В результате текст запроса будет содержать конструкцию ЛЕВОЕ СОЕДИНЕНИЕ:
ВЫБРАТЬ
РеализацияТоваровУслуг.Дата КАК Дата,
РеализацияТоваровУслуг.Номер КАК Номер,
Контрагенты.Наименование КАК Контрагент
ИЗ
Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Контрагенты КАК Контрагенты
ПО РеализацияТоваровУслуг.Контрагент = Контрагенты.Ссылка
Что делать, если конструктор не предлагает связь между таблицами?
Если автоматические связи не строятся, проверьте:
1. Совпадают ли типы полей (например, обе стороны связи должны быть типа «Ссылка»).
2. Нет ли в конфигурации кастомных реквизитов, которые используются для связи вместо стандартных.
3. Не заблокированы ли таблицы в настройках конструктора (панель «Таблицы и поля» → «Настройки»).
Если связь всё равно не появляется, добавьте её вручную, указав поля в свойствах соединения.
Агрегатные функции и группировка данных
Конструктор запросов поддерживает все основные агрегатные функции, аналогичные SQL: СУММА, КОЛИЧЕСТВО, МАКСИМУМ, МИНИМУМ, СРЕДНЕЕ. Их использование требует обязательной группировки по неагрегируемым полям.
Рассмотрим пример: нужно получить сумму продаж по каждому контрагенту за год. Алгоритм:
- Добавьте таблицы
РеализацияТоваровУслугиКонтрагенты, связав их по полюКонтрагент. - В панели «Поля» добавьте:
-
Контрагенты.Наименование(группировка)-
СУММА(РеализацияТоваровУслуг.СуммаДокумента)(агрегатная функция) - В панели «Условия» добавьте фильтр по дате:
РеализацияТоваровУслуг.Дата МЕЖДУ &НачалоГода(ТекущаяДата()) И &КонецГода(ТекущаяДата()). - Включите опцию «Группировка» в свойствах запроса (или конструктор сделает это автоматически при добавлении агрегатной функции).
Результирующий запрос:
ВЫБРАТЬ
Контрагенты.Наименование КАК Контрагент,
СУММА(РеализацияТоваровУслуг.СуммаДокумента) КАК СуммаПродаж
ИЗ
Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Контрагенты КАК Контрагенты
ПО РеализацияТоваровУслуг.Контрагент = Контрагенты.Ссылка
ГДЕ
РеализацияТоваровУслуг.Дата МЕЖДУ &НачалоГода(ТекущаяДата()) И &КонецГода(ТекущаяДата())
СГРУППИРОВАТЬ ПО
Контрагенты.Наименование
Важно: если в результате группировки появляются дублирующиеся строки, проверьте, все ли неагрегируемые поля включены в СГРУППИРОВАТЬ ПО. Например, если в выборке есть поле РеализацияТоваровУслуг.Валюта, его тоже нужно добавить в группировку.
Для ускорения запросов с агрегатными функциями используйте индексируемые поля в условиях. Например, фильтрация по дате или ссылке на справочник выполняется быстрее, чем по строковым полям.
Использование параметров и динамических значений
Один из ключевых плюсов конструктора — поддержка параметров, которые позволяют делать запросы динамическими. Параметры обозначаются символом & и могут принимать значения во время выполнения.
Примеры применения:
- 📅 Даты:
&НачалоПериодаи&КонецПериодадля гибкого фильтра по временному интервалу. - 🔍 Ссылки на объекты:
&Контрагентдля выборки данных по конкретному партнёру. - 📊 Списки значений:
&СписокНоменклатурыдля фильтрации по массиву товаров.
Как добавить параметр в конструкторе:
- В панели «Условия» или «Поля» введите имя параметра с префиксом
&(например,&ДатаНачала). - Конструктор автоматически добавит его в список параметров (панель «Параметры» внизу).
- При выполнении запроса из кода передайте значение через метод
УстановитьПараметр():
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ ... ГДЕ Дата >= &ДатаНачала";
Запрос.УстановитьПараметр("ДатаНачала", НачалоМесяца(ТекущаяДата()));
Результат = Запрос.Выполнить();
Для передачи сложных типов (например, массива ссылок) используйте метод УстановитьПараметр с соответствующим типом:
СписокКонтрагентов = Новый Массив;
СписокКонтрагентов.Добавить(Справочники.Контрагенты.НайтиПоНаименованию("ООО Ромашка"));
Запрос.УстановитьПараметр("СписокКонтрагентов", СписокКонтрагентов);
Параметры не только делают запросы гибкими, но и защищают от SQL-инъекций. Всегда используйте их вместо конкатенации строк в условиях.
Оптимизация запросов: план выполнения и типичные ошибки
Даже правильно составленный запрос может работать медленно из-за неоптимального плана выполнения. В конструкторе есть инструмент для анализа плана — кнопка Показать план запроса. Он отображает, как 1С будет извлекать данные: через сканирование таблиц (TABLE SCAN) или использование индексов (INDEX SEEK).
Распространённые ошибки и способы их исправления:
| Проблема | Причина | Решение |
|---|---|---|
| Долгое выполнение | Отсутствие индексов по полям в условиях | Добавьте индексируемые поля (например, Дата, Ссылка) в условия или создайте индексы в конфигураторе |
| Избыточные данные | Выборка всех полей (РеализацияТоваровУслуг.*) |
Укажите только необходимые поля в конструкторе |
| Дублирующиеся строки | Отсутствует группировка по неагрегируемым полям | Добавьте все неагрегируемые поля в СГРУППИРОВАТЬ ПО |
| Ошибка "Поле не найдено" | Опечатка в имени поля или таблицы | Проверьте названия в метаданных или используйте псевдонимы |
Пример оптимизации: если запрос с условием по строковому полю (например, Наименование) выполняется медленно, замените его на фильтрацию по ссылке или коду:
// Медленно (полнотекстовый поиск)
ГДЕ Контрагенты.Наименование ПОДОБНО "%Ромашка%"
// Быстро (поиск по ссылке)
ГДЕ Контрагенты.Ссылка В (&СписокСсылок)
Как просмотреть статистику выполнения запроса?
В режиме отладки (Ctrl+Alt+F12) после выполнения запроса откройте вкладку «Статистика». Там отображается время выполнения, количество прочитанных строк и используемые индексы. Это помогает выявить «узкие места».
Продвинутые возможности: временные таблицы, объединения и подзапросы
Конструктор запросов поддерживает и более сложные операции, которые обычно требуют ручного кодирования:
- 📝 Временные таблицы: позволяют сохранять промежуточные результаты. В конструкторе добавляются через панель «Таблицы» → «Временные таблицы». Пример использования — кэширование часто используемых данных.
- 🔄 Объединения (UNION): комбинирование результатов нескольких запросов. В конструкторе реализуется через добавление нескольких блоков
ВЫБРАТЬс опциейОБЪЕДИНИТЬ. - 🔍 Подзапросы: запросы внутри запросов. В конструкторе создаются через панель «Поля» → «Добавить подзапрос». Например, можно выбрать товары, которые продавались больше среднего количества.
Пример с временной таблицей: сохраним список активных контрагентов, а затем используем его в основном запросе.
ВЫБРАТЬ
АктивныеКонтрагенты.Ссылка КАК Контрагент,
СУММА(РеализацияТоваровУслуг.СуммаДокумента) КАК Сумма
ИЗ
Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
ВНУТРЕННЕЕ СОЕДИНЕНИЕ &АктивныеКонтрагенты КАК АктивныеКонтрагенты
ПО РеализацияТоваровУслуг.Контрагент = АктивныеКонтрагенты.Ссылка
ГДЕ
РеализацияТоваровУслуг.Дата МЕЖДУ &НачалоГода И &КонецГода
СГРУППИРОВАТЬ ПО
АктивныеКонтрагенты.Ссылка
Для создания временной таблицы АктивныеКонтрагенты в конструкторе:
- Добавьте новую временную таблицу в панели «Таблицы».
- Задайте ей имя (например,
АктивныеКонтрагенты). - В свойствах таблицы укажите запрос для её заполнения (например, выборка контрагентов с флагом
ПометкаУдаления = Ложь).
Временные таблицы полезны для разбиения сложных запросов на части. Например, сначала можно выбрать нужные документы, а затем детализировать их строки в другой временной таблице.
FAQ: ответы на частые вопросы о конструкторе запросов
Можно ли в конструкторе создать запрос с полнотекстовым поиском?
Да, но с ограничениями. Конструктор не поддерживает синтаксис ПОЛНЫЙТЕКСТОВЫЙПОИСК напрямую, но можно:
- Создать запрос вручную с оператором
ПОДОБНОилиСОДЕРЖИТ. - Использовать временную таблицу, заполненную результатами полнотекстового поиска, а затем присоединить её в конструкторе.
Пример условия для простого поиска: Контрагенты.Наименование ПОДОБНО "%ИП%".
Как экспортировать запрос из конструктора в внешний файл?
Конструктор не имеет функции прямого экспорта, но можно:
- Скопировать текст запроса из панели «Текст запроса» и сохранить в текстовый файл.
- Использовать внешнюю обработку, которая сохраняет запросы в
.txtили.qs(формат запросов 1С). - Для регулярного использования создайте обработку с коллекцией часто используемых запросов.
Почему конструктор не показывает некоторые таблицы (например, регистры бухгалтерии)?
Это может быть связано с:
- Ограничениями прав текущего пользователя (проверьте роль в конфигураторе).
- Настройками конструктора: включите опцию «Показывать все таблицы» в меню «Настройки».
- Особенностями конфигурации: некоторые виртуальные таблицы (например,
РегистрБухгалтерии.ХозРасчеты) требуют указания периода в параметрах.
Если таблица всё равно не отображается, попробуйте добавить её вручную через панель «Таблицы» → «Добавить таблицу» и введите имя вручную.
Как в конструкторе сделать запрос с итогами по группам (например, по месяцам)?
Для этого:
- Добавьте в запрос поле для группировки (например,
ВЫРАЗИТЬ(РеализацияТоваровУслуг.Дата КАК ДАТА) КАК Месяц). - Добавьте агрегатные функции (например,
СУММА(СуммаДокумента)). - Включите группировку по полю
Месяц.
Пример:
ВЫБРАТЬ
ВЫРАЗИТЬ(РеализацияТоваровУслуг.Дата КАК ДАТА) КАК Месяц,
СУММА(РеализацияТоваровУслуг.СуммаДокумента) КАК Сумма
ИЗ
Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
ГДЕ
РеализацияТоваровУслуг.Дата МЕЖДУ &НачалоГода И &КонецГода
СГРУППИРОВАТЬ ПО
Месяц
Можно ли в конструкторе создать запрос с рекурсией?
Нет, конструктор не поддерживает рекурсивные запросы (например, для обхода иерархических справочников). Для этого придётся писать код вручную с использованием оператора ОБЪЕДИНИТЬ или временных таблиц. Пример рекурсивного обхода справочника Номенклатура:
Запрос.Текст =
"ВЫБРАТЬ РАЗЛИЧНЫЕ Номенклатура.Ссылка КАК Ссылка
ИЗ Справочник.Номенклатура КАК Номенклатура
ГДЕ Номенклатура.Ссылка В (&СписокСсылок)
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ РАЗЛИЧНЫЕ Номенклатура.Родитель КАК Ссылка
ИЗ Справочник.Номенклатура КАК Номенклатура
ГДЕ Номенклатура.Ссылка В (&СписокСсылок)";