К статье
Практический материал

Разработка и Конфигурация · 11 мин

Как вывести запрос в 1С: практическое руководство

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

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

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

Что понадобится перед началом работы

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

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

Разовый анализ данныхКонсоль запросов

Нужен ли доступ в режим предприятия и права на чтение таблиц

Вывод пользователюТаблица значений или СКД

Поддерживает ли форма динамический список или нужен отчёт

Печать результатаТабличный документ

Есть ли готовый макет для вывода

Как вывести запрос через консоль запросов

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

Порядок работы простой: откройте обработку через «Файл → Открыть», вставьте текст запроса в редактор и нажмите «Выполнить». Результат появится в таблице в нижней части окна. Конструктор запроса, встроенный в консоль, помогает собрать текст визуально — выбрать таблицы, поля, условия и группировки мышью.

Параметры в консоли задаются знаком «&» в тексте запроса (например, ГДЕ Дата >= &НачалоПериода) и заполняются в отдельной таблице параметров перед выполнением. Так можно прогнать один и тот же запрос с разными отборами, не меняя текст.

Порядок действий в консоли запросов
  1. 1
    Откройте консоль запросов в режиме предприятия
  2. 2
    Вставьте или соберите текст запроса в конструкторе
  3. 3
    Заполните значения параметров, если они используются
  4. 4
    Нажмите «Выполнить» и проверьте результат в таблице
  5. 5
    Сохраните текст запроса в файл, если он понадобится позже

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

В коде конфигурации запрос выполняется через объект Запрос. Минимальная последовательность: создать объект, присвоить текст, установить параметры, вызвать метод Выполнить() и обработать результат. Вот базовый пример выборки номенклатуры:

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

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

"ВЫБРАТЬ

| Номенклатура.Ссылка КАК Товар,

| Номенклатура.Артикул КАК Артикул

|ИЗ

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

|ГДЕ

| Номенклатура.ПометкаУдаления = ЛОЖЬ";

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

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

Пока Выборка.Следующий() Цикл

Сообщить(Выборка.Артикул + " — " + Выборка.Товар);

КонецЦикла;

Метод Выполнить() возвращает объект «Результат запроса». Из него данные получают тремя способами: Выбрать() — обход строк по одной (экономит память на больших выборках), Выгрузить() — загрузка всего результата в таблицу значений, Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкам) — дерево с итогами по группировкам.

Параметры устанавливаются методом УстановитьПараметр("Имя", Значение) до вызова Выполнить(). Никогда не подставляйте значения в текст запроса конкатенацией строк — это источник ошибок и потенциальных проблем с безопасностью. Параметры также автоматически обрабатывают типы: дату, ссылку, список значений.

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

Вывод результата в таблицу значений и на форму

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

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

// Помещаем таблицу в реквизит формы типа "ТаблицаЗначений"

ЗначениеВРеквизитФормы(ТаблицаРезультат, "ТаблицаТоваров");

Если нужен вывод в печатную форму или файл, используйте табличный документ. Заполните его построчно из выборки или через макет с областями — шапка, строка, подвал. Макет создаётся в конфигураторе, области содержат параметры, которые заполняются данными выборки.

Для отчётов, которые строят регулярно и с гибкими настройками, правильнее использовать схему компоновки данных (СКД). Текст запроса помещается в набор данных, а пользователь сам настраивает отборы, группировки и поля в режиме предприятия. Это снимает с разработчика задачу программировать каждый вариант отчёта.

Сравнение способов вывода

Консоль запросов

Быстрый разовый анализ и отладка; не подходит для конечных пользователей

Таблица значений на форме

Интерактивная работа с данными; требует программирования формы

Динамический список

Списки с отборами и сортировкой из коробки; ограниченная гибкость оформления

Отчёт на СКД

Гибкие пользовательские настройки без доработок; сложнее в освоении

Работа с виртуальными таблицами и итогами

Остатки и обороты регистров получают через виртуальные таблицы: РегистрНакопления.ТоварыНаСкладах.Остатки, РегистрНакопления.Продажи.Обороты. Параметры виртуальной таблицы (период, условие) указываются в скобках после её имени. Это критично для производительности: отбор внутри виртуальной таблицы выполняется на уровне СУБД до соединения с другими данными.

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

"ВЫБРАТЬ

| Остатки.Номенклатура КАК Товар,

| Остатки.КоличествоОстаток КАК Остаток

|ИЗ

| РегистрНакопления.ТоварыНаСкладах.Остатки(&Период, Склад = &Склад) КАК Остатки";

Частая ошибка — накладывать условие на виртуальную таблицу через ГДЕ после соединения вместо параметров самой таблицы. Запрос сработает, но сначала выберет все записи регистра, а потом отфильтрует их, что на больших базах приводит к заметным задержкам и блокировкам.

Как проверить, что запрос вывел правильные данные

Первый признак корректной работы — непустой результат там, где данные заведомо есть. Метод РезультатЗапроса.Пустой позволяет сразу определить, вернулись ли строки, и не запускать обход выборки впустую. Если запрос пуст, а данные в базе есть — проверяйте параметры, права доступа и условия отбора.

Сверяйте итоги запроса с эталоном: стандартным отчётом конфигурации, данными карточки объекта или ручным подсчётом по небольшому периоду. Для запросов с группировками полезно вывести сначала детальные записи, убедиться в их корректности, и только потом добавлять СГРУППИРОВАТЬ ПО и итоги.

В отладчике результат запроса удобно смотреть, выгрузив его в таблицу значений и открыв её через «Вычислить выражение» — РезультатЗапроса.Выгрузить() покажет все строки и колонки в табличном виде.

Контрольные точки

Как проверить результат

РезультатЗапроса.Пустой
Норма

Ложь — строки получены

Тревожный признак

Истина при наличии данных в базе — проверяйте параметры и права

Итоги по группировкам
Норма

Совпадают со стандартным отчётом за тот же период

Тревожный признак

Расхождения — ищите лишние соединения, дубли строк

Количество строк
Норма

Соответствует ожидаемому объёму выборки

Тревожный признак

Строк кратно больше — декартово произведение из-за ошибки в соединении

Типичные ошибки при выводе запросов

Самая распространённая ошибка — обращение к полю, которого нет в выборке, или опечатка в имени поля выборки: Выборка.Товар вместо Выборка.Номенклатура. Имена в обходе должны совпадать с псевдонимами, заданными через КАК в тексте запроса.

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

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

Типичные ошибки
01
Подстановка значений в текст запроса конкатенацией вместо параметров — ошибки типов и риск некорректной работы
02
Отбор по виртуальной таблице через ГДЕ вместо её параметров — резкое падение производительности
03
Выполнение запроса внутри цикла — сотни обращений к СУБД вместо одного
04
Игнорирование NULL из левых соединений — неожиданные значения в итогах
05
Отсутствие проверки РезультатЗапроса.Пустой — лишняя обработка пустой выборки
Удобный приём: сначала соберите и отладьте запрос в консоли на реальных данных, убедитесь в корректности итогов, и только потом переносите текст в модуль. Так отладка занимает минуты вместо перезапуска отладчика на каждую правку.
ПЗ
Практическое замечание

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

Как вывести запрос, если нет доступа к конфигуратору?

Используйте внешнюю обработку «Консоль запросов» в режиме предприятия — она открывается через меню «Файл → Открыть» и не требует изменения конфигурации. Понадобятся только права на чтение нужных таблиц и право запуска внешних обработок.

Чем Выбрать() отличается от Выгрузить()?

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

Почему запрос возвращает пустой результат, хотя данные есть?

Проверьте по порядку: права текущего пользователя на таблицы, значения параметров (особенно даты — границы периода), условия отбора и соединения. Частая причина — отбор по ссылке другого типа или лишнее условие в виртуальной таблице.

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

Да. Выгрузите результат в табличный документ и сохраните его методом Записать() с типом файла XLSX или через интерфейс «Файл → Сохранить как». Таблицу значений из консоли запросов также можно скопировать в буфер обмена и вставить в Excel.

Как вывести запрос в отчёт без программирования формы?

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

Безопасно ли выполнять запросы на рабочей базе?

Запросы на чтение не меняют данные, но тяжёлые запросы могут надолго заблокировать таблицы и замедлить работу пользователей. Отлаживайте сложные запросы на копии базы, ограничивайте период выборки и избегайте запуска в часы пиковой нагрузки.

Итог

Что важно запомнить

Для разового анализа используйте консоль запросов, для встраивания — объект Запрос с параметрами и методами Выбрать или Выгрузить, для пользовательских отчётов — СКД. Всегда проверяйте результат на пустоту, сверяйте итоги с эталоном и отлаживайте тяжёлые запросы на копии базы.